Медова стиковка:
Odoo ↔ M.E.Doc
Медова стиковка — модуль для Odoo 18 і 19, який перетворює замовлення на продаж (sale.order) і рахунки (account.move) на XML-файл, придатний для імпорту в M.E.Doc як готовий первинний документ. Під будь-який шаблон — навіть той, який ви самі налаштували у M.E.Doc, і без окремого модуля під кожен із них.
У M.E.Doc немає фіксованого переліку шаблонів.
Odoo — чудова сучасна ERP. Але український бізнес живе ще й у своїй, окремій екосистемі: M.E.Doc, електронна звітність, ЄДРПОУ, податкова.
І головне: у кожного клієнта M.E.Doc власний, довільно названий шаблон із власним набором полів. Жоден конектор, зашитий під один формат, не вгадає його наперед. Тому цей модуль не прив'язаний до жодного конкретного шаблону — він дає інструмент описати ваш шаблон один раз, після чого Odoo формує під нього файл сам.
Чотири кроки — і кнопка в меню документа.
1 · Завантажте опис шаблону
Файл «Опис полів шаблону» у форматі xls, який генерує сам M.E.Doc. Завантажується як є, без конвертації: майстер визначає CHARCODE з самого файлу і створює шаблон разом з усіма полями.
CHARCODE — автоматично2 · Налаштуйте відповідність
Кожне поле шаблону прив'язується до Odoo одним із чотирьох способів. Найпопулярніші теги майстер підставляє сам — з бази знань мапінгу.
4 способи3 · Перевірте на реальному документі
«Тест мапінгу» на картці шаблону: оберіть справжнє замовлення чи рахунок і одразу побачте, яке значення дасть кожне поле — і для шапки, і для кожного рядка табличної частини. Без генерації файлу.
Тест мапінгу4 · Створити дію вивантаження
Одна кнопка — і в меню ⚙ «Дії» на моделі-джерелі з'являється пункт «Експорт в M.E.Doc: назва шаблону». Клік одразу завантажує файл. Повторний клік оновлює дію, а не плодить дублікати.
⚙ ДіїЧотири способи заповнити будь-яке поле.
Довільний шаблон означає довільні поля: у чужому шаблоні може не бути жодного, що один-в-один збігається з полем Odoo. Тому мапінг не обмежений вибором зі списку — механіка та сама, що у правилах зарплати Odoo:
- Поле OdooШлях через крапку до документа чи пов'язаного запису —
partner_id.vat,company_id.l10n_ua_tax_id. Є підказка-пікер полів. - Стале значенняДля полів шаблону, які не залежать від конкретного документа.
- Python-кодПрисвоєння змінній
result, виконання черезsafe_evalз дозволеними викликами методів — коли значення треба зібрати з кількох полів або перетворити. - Номер рядкаПорядковий номер позиції — лише для табличних полів.
Довідник рецептів Python-мапінгу
Для полів, які не мапляться ані прямим полем, ані сталим значенням, є окрема стаття: контракт змінної result, доступні у виразі змінні (record, env, datetime, relativedelta), готові рецепти й розбір типових помилок — зріз замість індексу, зріз recordset замість списку, непередбачуваний порядок набору.
Python-мапінг у шаблонах M.E.Doc: довідник рецептів — відкрита стаття, читати можна без реєстрації.
Таблична частина
Поле рядків на шаблоні вказує, яке one2many-поле моделі містить позиції документа — order_line для замовлення, invoice_line_ids для рахунку; пікер заповнює технічну назву сам.
Табличні поля мапляться так само, як поля шапки, але record у виразі — це один рядок, а не весь документ. Підтримується одна таблиця: цього вистачає переважній більшості реальних шаблонів рахунків, актів і накладних.
Другий шаблон налаштовується швидше за перший.
Теги в шаблонах M.E.Doc повторюються: FIRM_NAME, FIRM_EDRPOU, SIDE_CD_K, DOCSUM, SUMPDV трапляються майже в кожному. Тому модуль їх запам'ятовує.
Щойно тест дає для поля непорожній результат без помилки, мапінг автоматично потрапляє до бази знань за назвою тега. Наступного разу майстер підставить найпопулярніший відомий варіант сам — у поставці вже є 16 таких підказок.
Поповнюється з практики
Не статичний довідник: кожен ваш успішний тест робить базу знань трохи розумнішою — під ваші моделі та ваші дані.
СамонавчанняСталі значення — не підказуються
Свідомо: поле, значення якого ви задали руками для одного контрагента, не має тихо переїжджати в шаблон для іншого. Підказка є лише для полів і Python-коду.
Обережність за замовчуваннямПомилка називає конкретне поле.
windows-1251 і конверт ZVIT
Файл формується у кодуванні, якого вимагає M.E.Doc, із правильним конвертом — без проміжних конвертацій на вашому боці.
XML · windows-1251Символ поза кодуванням — стоп
Символ, якого немає у windows-1251, не перетворюється тихо на «?». Генерація зупиняється й називає поле та причину: зіпсутий символ у поданому документі знаходить не той, хто його формував.
Без тихої втратиПомилка виразу — теж стоп
Поле з помилковим виразом чи Python-кодом зупиняє генерацію з чіткою вказівкою, яке саме поле винне.
Named-field errorsШість типів документів, два джерела.
- Типи документівРахунок, Акт, Видаткова накладна, Товаро-транспортна накладна, Специфікація та Інші документи — тип задається кодом SDOCTYPE у шаблоні.
- Джерела в Odoo
sale.orderіaccount.move. Перелік свідомо обмежений: показувати вибір довільної моделі «з нуля» означало б перекласти на користувача роботу, якої він не просив. - Варіанти шаблонуТой самий CHARCODE можна завести кілька разів — під різних контрагентів чи договори. Кожен варіант дає власний іменований пункт у меню дій.
- Залежності
sale,accountі безкоштовнийl10n_ua_registration, з якого беруться реквізити компанії. Для читання xls — бібліотекаxlrd; якщо її немає, майстер приймає CSV.
Коротко про головне.
Чи потрібен окремий модуль під кожен шаблон M.E.Doc?
Ні. M.E.Doc не має фіксованого переліку шаблонів — у кожного клієнта свій, довільно названий. Тому шаблон описується даними всередині Odoo: ви завантажуєте згенерований M.E.Doc опис полів, зіставляєте кожне поле з даними Odoo і зберігаєте. Код під конкретний шаблон писати не треба.
Які документи Odoo можна вивантажити в M.E.Doc?
Замовлення на продаж (sale.order) і рахунки та інвойси (account.move). Перелік джерел свідомо обмежений цими двома моделями, щоб не пропонувати вибір довільної моделі Odoo.
Які типи документів M.E.Doc підтримуються?
Шість: Рахунок, Акт, Видаткова накладна, Товаро-транспортна накладна, Специфікація та Інші документи. Тип задається кодом SDOCTYPE у шаблоні.
Звідки взяти опис полів шаблону?
Його генерує сам M.E.Doc для будь-якого налаштованого у вас шаблону — файл «Опис полів шаблону» у форматі xls. В Odoo він завантажується як є, без конвертації: майстер сам визначає CHARCODE з файлу і створює шаблон разом з усіма його полями.
Що робити, якщо поле шаблону не має прямого відповідника в Odoo?
Поле заповнюється одним із чотирьох способів: значенням поля Odoo за шляхом через крапку, сталим значенням, Python-кодом або порядковим номером рядка. Python-код виконується через safe_eval і закриває випадки, коли значення треба зібрати з кількох полів чи перетворити. Готові рецепти, доступні змінні та розбір типових помилок зібрані у відкритій статті «Python-мапінг у шаблонах M.E.Doc: довідник рецептів» за адресою https://odoo.golodaeva.org.ua/knowledge/article/39.
Чи можна мати кілька варіантів одного шаблону?
Так. Той самий CHARCODE можна завести кілька разів — наприклад, під різних контрагентів або договори, з різними сталими значеннями. Кожен варіант дає власний іменований пункт у меню дій.
Чи надсилає модуль документи контрагенту або до податкової?
Ні. Odoo формує файл і на цьому зупиняється. Імпорт, підписання та відправка виконуються в M.E.Doc.
Чи працює модуль на Odoo Community?
Так. Залежності — стандартні sale і account та безкоштовний l10n_ua_registration, з якого беруться реквізити компанії. Odoo Enterprise для цього модуля не потрібен. На сервері має бути бібліотека xlrd; якщо її немає, майстер приймає CSV.
Коротко — у числах.
Рахунок · Акт · ВН · ТТН · Специфікація
поле шаблону
у поставці
у складі модуля