Odoo
МодульДруковані бланки — М-4, М-11, ЛЗК, видаткова, ТТН
Українські первинні форми як QWeb-шаблони Odoo: де брати готові, як писати свої, на що звертати увагу.
Що це і навіщо
Бухгалтерія в Україні живе на первинних документах. Без видаткової — не реалізація. Без М-4 — не оприбутковано. Без ТТН — водія можуть зняти на блок-посту. Стандартний Odoo не знає жодної української форми: він друкує invoice, receipt і delivery slip за міжнародним зразком. Тому для UA-проєкту друковані форми — це окремий шар, який треба або купити, або написати.
Цей файл — про те, як організовано друковані шаблони в Odoo (механіка QWeb + ir.actions.report), які форми точно треба для виробничого підприємства, і де їх брати.
Як це працює
Модель проста: кожен бланк — це пара з двох записів.
ir.actions.report— це «дія» друку. Містить назву, до якої моделі прив’язана (model='account.move'), формат (report_type='qweb-pdf'), посилання на шаблон.ir.ui.viewізtype='qweb'— це сам шаблон, HTML/XML з QWeb-директивами (t-esc,t-foreach,t-if).
Коли натискаєш «Print», Odoo бере дані з моделі, рендерить QWeb у HTML і конвертує через wkhtmltopdf або chromium у PDF. Усе.
<!-- Шаблон видаткової накладної (фрагмент) -->
<template id="report_vydatkova">
<t t-call="web.html_container">
<t t-foreach="docs" t-as="o">
<t t-call="web.external_layout">
<div class="page">
<h2>Видаткова накладна № <span t-field="o.name"/></h2>
<p>Від <span t-field="o.invoice_date"/></p>
<table>
<thead><tr><th>Товар</th><th>Кільк.</th><th>Ціна</th><th>Сума</th></tr></thead>
<tbody>
<tr t-foreach="o.invoice_line_ids" t-as="line">
<td t-esc="line.product_id.name"/>
<td t-esc="line.quantity"/>
<td t-esc="line.price_unit"/>
<td t-esc="line.price_subtotal"/>
</tr>
</tbody>
</table>
</div>
</t>
</t>
</t>
</template>
Шлях у меню до перегляду: Settings → Technical → Reports (увімкнути developer mode).
У контексті українського обліку
Базовий комплект українських форм, без якого виробниче підприємство не запрацює:
- Видаткова накладна (відпуск товарів покупцю).
- ТТН — товарно-транспортна накладна, обов’язкова під час перевезення.
- Акт наданих послуг.
- М-4 — прибутковий ордер (надходження на склад).
- М-11 — накладна-вимога на відпуск матеріалів у виробництво.
- ЛЗК — лімітно-забірна картка (періодичний відпуск матеріалів).
- Акт виробництва / звіт про випуск ГП.
- Інвентаризаційна відомість (М-21/ІНВ-3).
- Акт списання ТМЦ (М-4 у зворотний бік).
- Довіреність М-2 — на отримання ТМЦ.
- ПКО / ВКО + касова книга.
- Авансовий звіт.
- Акт звіряння взаєморозрахунків.
Звідки брати:
- Oblik-ERP. 12+ форм у пакеті (видаткова, ТТН, акт, М-4, М-11, ПКО/ВКО, авансовий, акт звіряння, інвентаризаційна, довідка бухгалтерська). Найшвидший шлях.
- Власна розробка. Якщо специфіка не вкладається у стандарт — пишеш QWeb сам. У defense здебільшого так і роблять: потрібен defense-штамп, посилання на контракт А-XXXX, додаткові підписи приймальника.
- Сторонні модулі з Odoo Store. Трапляються, але якість плаває.
Як ми робимо (defense-контекст)
ТОВ «УкрПром-Тех» взяла Oblik-ERP за основу і додала свій шар:
- М-11 з defense-смугою. Зверху додаткова шапка з номером контракту А-XXXX, підпис представника замовника, за потреби — гриф «обмежено».
- Кастомна ТТН для перевезення в зону ООС. Додатково — реєстр охорони, маршрут і пункти контролю.
- Сертифікат відповідності виробу. Власна форма, де перелічено всі компоненти з серійниками (з
stock.lot), результати тестування і підписи. Формується автоматично, щойно закриваєш MO. - EUC (End-User Certificate). Для експорту ВТП. Власна QWeb-форма з прив’язкою до експортного контракту і дозволу ДСЕКУ.
Усі ці форми наш модуль kit_blanks_def навішує поверх стандартних моделей. Під час друку вибираємо потрібну версію — звичайну або defense.
Типові граблі
- wkhtmltopdf vs chromium. Стандартний Odoo рендерить через wkhtmltopdf 0.12.x, а той не тягне багато CSS3. Якщо твій шаблон гарно виглядає у браузері, а в PDF — кошмар, перевір, чи не вжив ти grid, flex або нові шрифти. Або переходь на chromium-headless як рендерер.
- Кирилиця ламається. Типовий шрифт у
external_layout— Helvetica/Arial без кирилиці. Підключай свій через CSS і клади його в пакетreport_type: найнадійніше DejaVu Sans, Roboto, Inter. - Поля з валютами в
t-escбез форматування. Будуть «1234.56789», а не «1 234,57 ₴». Використовуйt-options="{'widget': 'monetary', 'display_currency': o.currency_id}". - Шаблон не оновився після правки. Activate developer mode → Settings → Technical → User Interface → Views, знайди свій. Або через CLI:
restart Odoo --update модуль. - Один PDF на всіх. Натиснув «Print» на 50 інвойсах — отримав один файл. Це by design в Odoo. Треба окремо — пиши кастомний wizard.
- Поле
t-esc="o.partner_id.name", а в партнера ім’я порожнє. Покаже None або впаде з помилкою. Обгортай уt-esc="o.partner_id.name or ''"чи уt-if. - Підпис-зображення вбив макет. PNG-печатка 2000×2000 px різко гальмує рендер. Стискай заздалегідь до 400×400.
Дотичне
- QWeb — глибше про механіку QWeb
- Oblik-ERP — комерційний пакет з 12+ форм
- l10n_ua — базова локалізація
- Прихідний М-4 — М-4 як документ
- Акт виробництва — акт виробництва
- Авансовий звіт — авансовий звіт
Де цей модуль зустрічається3
- Odool10n_uaБазовий модуль адаптації Odoo до України: план рахунків, ПДВ-ставки, валюта, дати. Що в коробці є, а чого нема…
- OdooQWebЯк Odoo рендерить PDF через QWeb: синтаксис шаблонів, директиви t-set/t-if/t-foreach, кастомізація ПН з типом …
- OdooSalesЗамовлення покупця як точка входу в Odoo — звідси розгортається ланцюг постачання, виробництва і платежу.