Перейти до основного контенту
База знань · виробничий облік USD41,42 ПДВ20% МЗП8 000

Odoo

Модуль

Українські податкові ставки в Odoo

Як налаштувати account.tax для ПДВ 20%, 7%, 0%, без ПДВ і звільнення — і як зв'язати ставки з fiscal positions та tax tags декларації.

Шлях у меню
Бухгалтерія → Налаштування → Податки
Технічна модель
account.tax, account.fiscal.position, account.tax.repartition.line
Редакція
2026-05-28

Що це і навіщо

Усе ПДВ-життя Odoo тримається на трьох речах: account.tax (сама ставка), account.fiscal.position (механізм підміни ставок) і tax_tags (як ставка лягає в декларацію). Налаштуй ці три правильно — інвойси, проводки, декларація і ПН складатимуться самі. Перекоси хоча б одне — суми попливуть, рядки не зійдуться, аудитор плакатиме.

З коробки l10n_ua дає базові ставки: 20%, 7%, 0% і без ПДВ. Але без правильних tax_repartition_lines, без fiscal positions під типові сценарії (експорт, звільнення за ст. 197, касовий метод) і без зв’язку з рядками декларації це просто декорація.

Як це працює

Кожна account.tax має:

  • name — назва, яку бачить бухгалтер.
  • amount — ставка (20, 7, 0).
  • type_tax_use — для продажів (sale), закупівель (purchase) чи обох (none).
  • price_include — чи ставка вже сидить у ціні (для роздробу і фіскальних чеків — так).
  • invoice_repartition_line_ids — куди йде сума, коли складають інвойс.
  • refund_repartition_line_ids — куди йде сума при поверненні.

Структура repartition line:

# Для ПДВ 20% на продаж
tax_20.invoice_repartition_line_ids = [
    # 100% база — у рядок 1.1 декларації
    {'repartition_type': 'base', 'tag_ids': [(4, base_1_1_tag.id)]},
    # 100% податок — на рахунок 6411 + рядок ПЗ декларації
    {'repartition_type': 'tax', 'factor_percent': 100,
     'account_id': acc_6411.id, 'tag_ids': [(4, vat_obligation_tag.id)]},
]

Тобто коли бухгалтер виставляє інвойс зі ставкою 20%, Odoo сам пише DR 361 / CR 703 на базу і DR 643 / CR 6411 на ПДВ та проставляє теги, які декларація потім збере.

Шлях у меню: Accounting → Configuration → Taxes.

У контексті українського обліку

Мінімальний набір ставок для виробничого підприємства:

СтавкаВикористанняРахунок ПЗРядок декларації
20% продажЗвичайна реалізація64111.1
20% закупівляЗвичайне придбання6442 / 64410.1
7% продажЛіки, медвироби (ст. 193.2.5)64111.2
0% продажЕкспорт (ст. 195)2.1
0% продаж — обороннеПостачання військовим (п.32 підрозд.2 розд.ХХ)3.2
Без ПДВ продажОперації звільнені (ст. 197)3.1
Без ПДВ — необ’єктПоза об’єктом ПДВ (ст. 196)5
0% закупівля — імпортІмпорт послуг від нерезидента (умовний продаж)6411 + 644211

Касовий метод (ст. 187.7, 187.10) — окрема історія, через tax_exigibility='on_payment'. Деталі — у Касовий метод.

Fiscal position — це проста мапа «ставка → ставка». Наприклад, fiscal position «Експорт»:

  • замість «20% продаж» підставляє «0% продаж»;
  • замість «7% продаж» — теж «0% продаж».

Прив’яжи fiscal position до партнера-нерезидента (поле res.partner.property_account_position_id) — і Odoo щоразу при створенні SO чи інвойсу сам перемкне ставки.

Як ми робимо (defense-контекст)

ТОВ «УкрПром-Тех» має такий набір ставок:

  • 20% продаж / закупівля — стандарт для цивільних клієнтів.
  • 0% продаж — експорт (з МД).
  • 0% продаж — оборонне постачання (звільнення п.32 підрозд.2 розд.ХХ ПКУ для ВТП). Окремий tax record, бо в декларації йде у рядок 3.2, а не 2.1.
  • Cash basis 20% — для деяких постачальників на касовому методі.
  • Без ПДВ — операції з ОЕС/ОВТ (для специфічних видів продукції).

Fiscal positions:

  • «Експорт» — для іноземних замовників. Підміняє 20%/7% → 0% (експорт).
  • «Оборона — звільнення» — для постачання військовим частинам. Підміняє 20% → 0% (оборонне).
  • «Касовий метод» — для окремих постачальників-комуналок. Підміняє стандартний 20% → 20% cash basis.

Усе це жорстко прив’язано до партнерів через автоматизацію: коли заводять нового партнера, server action перевіряє ЄДРПОУ і за класифікатором ставить потрібну fiscal position.

Типові граблі

  • Налаштував tax_tag вручну, забув про refund_repartition. Інвойс іде з тегом, повернення — без. Через РК декларація не сходиться. Завжди заповнюй обидва repartition.
  • Один tax record на 20% продаж і закупівлю. Здається економно, але type_tax_use='none' дозволяє виставити цю ставку й на інвойсі купівлі. Бухгалтер ненароком вибере «вихідну» ставку для вхідного. Розділяй на два tax records.
  • Tax_tag з російської локалізації. Активуєш російський або кросслокалізаційний модуль — і раптом твої теги ведуть у російську декларацію. Контролюй, які account.tax.report.line зв’язано з твоїми ставками.
  • price_include=True для оптових інвойсів. Тоді сума інвойсу — це 1200, а база і ПДВ розбиваються самі. Для опту зазвичай хочемо «1000 + ПДВ = 1200» з повним контролем. Тобто price_include=False.
  • Fiscal position не спрацьовує. Перевір: 1) чи прив’язана вона до партнера; 2) чи у партнера саме та фіскальна позиція; 3) чи в tax_map цієї FP вказано точно ту tax-ID, що на продукті; 4) чи не заблокований SO/інвойс — після підтвердження зміна FP рядків уже не чіпає.
  • Експортний 0% і звільнення за ст. 197 з тим самим tax-ID. Так не можна. Дві окремі ставки, два окремі теги — один у рядок 2.1, інший у 3. Інакше декларація буде криво назавжди.
  • Імпорт послуг від нерезидента без умовного продажу. За ст. 208 ПКУ ти маєш скласти ПН на себе. Забув — і податкового кредиту нема, а перерахунок потім болить.

Дотичне

Де цей модуль зустрічається10