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

Odoo

Модуль

Analytic Account — окремий вимір обліку

Чому аналітика окрема від плану рахунків і як нею вести проєктний облік оборонних контрактів, рахувати маржу за SKU та розподіляти ЗВВ.

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

Що це і навіщо

Стандартний план рахунків — це «вертикальний» вимір обліку. Він каже: ось 201 (сировина), ось 23 (виробництво), ось 26 (готова продукція), ось 703 (доходи). Звідси ти отримуєш баланс і звіт про фінрезультати. Але не отримуєш відповіді на питання: «скільки заробив контракт А-1234?», «яка маржа на SKU-XYZ?», «у який цех зайшло більше витрат за квартал?». Вертикаль на це мовчить, бо горизонталі в неї немає.

Analytic Account — це і є та горизонталь. Не рахунок плану, а окремий зріз для управлінського обліку. На кожну проводку, де це доречно, ти ставиш аналітику: «це лягло на контракт А-1234», «це на цех 1», «це на проєкт Розробка-2026». А далі збираєш агрегати за будь-яким розрізом — окремо від класу 1-9.

Як це працює

Модель в Odoo 17+:

  • account.analytic.plan — група аналітик. Наприклад, «Контракти», «Підрозділи», «SKU», «Проєкти». Кожен план може мати свій список аналітик.
  • account.analytic.account — сама аналітична позиція. Належить плану. Має code, name.
  • account.analytic.line — рядок аналітичного руху. Це факт «на аналітику Х витрачено суму Y у дату Z по такій-то проводці».
# Створюємо аналітичний план для контрактів
plan_contracts = self.env['account.analytic.plan'].create({
    'name': 'Defense Contracts',
    'default_applicability': 'optional',
})
# Створюємо аналітику для контракту А-1234
analytic = self.env['account.analytic.account'].create({
    'name': 'А-1234.2026.Партія-1',
    'plan_id': plan_contracts.id,
    'code': 'A1234-2026-P1',
})

На рівні документа аналітика прикладається через analytic_distribution — це JSON-словник {analytic_account_id: percentage}. Можна розпорошувати між кількома аналітиками одночасно.

# SO зі 80% на контракт А-1234 і 20% на R&D
so_line.analytic_distribution = {
    str(contract_a1234.id): 80,
    str(rnd_2026.id): 20,
}

При постингу invoice/picking/MO Odoo створює відповідні account.analytic.line зі сумами, пропорційно distribution.

Шлях у меню: Accounting → Configuration → Analytic Plans (плани), → Analytic Accounts (самі аналітики), → Reporting → Analytic Report (звіти).

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

Українській бухгалтерії аналітика потрібна завжди:

  • Витрати за статтями. ЗВВ — це не одна сума, а десятки статей. Аналітика дає розкладку.
  • Витрати за підрозділами. Цех 1, цех 2, адміністрація. Без цього розподіл ЗВВ повисає в повітрі.
  • Витрати за об’єктами калькуляції. Кожен виріб чи контракт — окремий об’єкт. Це базова українська калькуляція собівартості за УПСБО 16.
  • Планова і фактична собівартість. Розрив між ними — це лінії аналітики, які лишається зіставити.

Цікавий момент: аналітика не йде ні в декларацію ПДВ, ні в Баланс, ні у Ф2. Вона тільки для управлінки. Тож аудитор у неї майже не зазирає (хіба спитає, «як ви розподіляли ЗВВ»), а керівник дивиться щодня.

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

ТОВ «УкрПром-Тех» тримає три аналітичні плани:

  1. Contracts (Контракти). Кожен оборонний контракт А-XXXX і кожен цивільний договір — окрема analytic. Це головний план. Усі дохідні та прямі витратні проводки мають analytic звідси.
  2. Divisions (Підрозділи). Цех 1 (механічна обробка), Цех 2 (складання), Цех 3 (тестування), Адміністрація, R&D. Сюди лягають ЗВВ і непрямі витрати.
  3. Products (SKU). Кожна готова продукція з окремим артикулом. Сюди лягають тільки витрати, прив’язані до конкретного виробу, — щоб рахувати рентабельність за SKU.

На SO бухгалтер обирає одну analytic з плану Contracts (наприклад, А-1234.2026.Партія-1). На MO та сама analytic підтягується автоматично. ЗВВ-проводки бухгалтерія розкидає за пропорцією виробничої потужності: MO Партії-1 з’їв 30% часу Цеху 2 → 30% ЗВВ Цеху 2 лягає на analytic Партії-1.

Звіт «Контракт А-1234 за 2026» — це всі analytic_line з analytic_account_id = А-1234. Доходи мінус усі прямі та розподілені непрямі витрати — ось маржа.

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

  • Аналітика порожня — звіт пустий. Найчастіший випадок. Менеджер не проставив на SO, MO успадкував порожнечу, інвойс теж без аналітики. Контракт «загубився». Лікувати — required-поле на критичних документах через server action.
  • Аналітика на 100% або не на 100%. analytic_distribution має сумуватися в 100. Якщо 80 + 30 = 110 — Odoo не блокує, але звіти попливуть. Постав constraint на моделі.
  • Один контракт у двох планах. Завели «А-1234» у плані Contracts і ще раз «А-1234» у Divisions. Тепер, коли пишеш analytic_distribution, не зрозуміло, котрий із них. Тримай дисципліну: один контракт — один план.
  • Закрита аналітика з відкритими лініями. Деактивував account.analytic.account (поставив active=False), а старі account.analytic.line лишилися. Звіт за 2025 цю аналітику вже не показує. Не деактивуй — архівуй через окреме поле або тримай як read-only.
  • Аналітика на reverse move. Сторно інвойсу зробили без analytic. Якщо оригінал мав analytic — реверс її підхопить. Якщо ж сторнуєш вручну через misc journal — забудеш проставити, і контракт лишиться «з горбом»: на оригіналі є, на сторно немає.
  • analytic_precision поплив. Distribution 33.33% × 3 = 99.99%. Копійка не сходиться. Налаштуй decimal_precision = Analytic Discount у системних параметрах.
  • Розподіл ЗВВ зайшов на закриту аналітику. Cron розкидає ЗВВ за квартал. Один із контрактів уже закрито, але cron цього не знає — і кидає туди частку. Звіт за закритим контрактом «оживає» з минулого. Постав у cron фільтр state != 'closed'.

Дотичне

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