Медова стиковка
для Odoo
Та сама медова стиковка, яку бухгалтери знають з обліку в інших програмах, — тепер для Odoo: рахунки, акти й накладні йдуть в M.E.Doc без ручного набору. Потрібні тільки стандартні sale і account та безкоштовний l10n_ua_registration — усе працює на Odoo Community і готове до роботи одразу після встановлення. Це модуль для Odoo 18, 19 і 20, який перетворює замовлення на продаж (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.
Коротко про головне.
Як завантажити рахунок з Odoo в M.E.Doc?
Відкрийте рахунок або замовлення в Odoo, у меню «Дії» оберіть «Експорт в M.E.Doc: назва шаблону» — і Odoo віддасть XML-файл. У M.E.Doc імпортуйте його як готовий первинний документ. Один раз перед цим налаштовується шаблон: завантажується згенерований M.E.Doc «Опис полів шаблону», і кожне поле зіставляється з даними Odoo.
Що краще: файловий обмін з M.E.Doc чи пряма інтеграція?
Для більшості компаній — файловий обмін, і ось чому. M.E.Doc зазвичай стоїть на комп'ютері чи сервері в офісі, а Odoo — у хмарі або в дата-центрі: пряма інтеграція потребує мережевого доступу між ними, VPN чи відкритих портів, і ламається, щойно щось змінилося на одному з боків. Файл же переноситься будь-як і не залежить від того, де що встановлено. Друге — контроль: файл можна відкрити й перевірити до імпорту, а нічого не потрапляє в M.E.Doc без відома бухгалтера. Підпис КЕП і відправка контрагенту чи до податкової все одно робляться в M.E.Doc, тож пряме з'єднання тут не економить кроків, які мають значення. Третє — шаблони: модуль формує файл під будь-який ваш шаблон M.E.Doc, навіть налаштований вами самими. І четверте — оновлення: нова версія M.E.Doc не обриває обмін, бо формат файлу визначає ваш шаблон, а не внутрішній інтерфейс програми. Пряма інтеграція має сенс, коли документів сотні на день і M.E.Doc стоїть в одній мережі з Odoo; для звичайного потоку рахунків, актів і накладних один імпорт файлу — найпростіший і найнадійніший шлях.
Що таке медова стиковка і чи є вона для Odoo?
Так бухгалтери називають обробку, що передає первинні документи з облікової програми в M.E.Doc. Для Odoo це модуль l10n_ua_medoc: він формує з рахунків і замовлень Odoo XML для імпорту в M.E.Doc під будь-який ваш шаблон.
Чи потрібен окремий модуль під кожен шаблон 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.
Коротко — у числах.
Рахунок · Акт · ВН · ТТН · Специфікація
поле шаблону
у поставці
у складі модуля