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

Odoo

Модуль

Odoo MRP — виробничі замовлення і BoM

Виробниче замовлення (MO) як центр виробничого обліку: списання матеріалів, операції, оприбуткування готової продукції.

Шлях у меню
Виробництво → Виробничі замовлення
Технічна модель
mrp.production, mrp.bom, mrp.bom.line, mrp.workorder
Редакція
2026-05-28

Що це і навіщо

MRP в Odoo — це сімейство моделей, які обслуговують виробничий цикл. У центрі — mrp.production, виробниче замовлення (MO). Воно каже: «треба зробити 100 виробів X, до 10 червня, із цих компонентів за цією технологією». Поряд живуть mrp.bom (специфікація: що з чого) і mrp.workorder (технологічні операції на робочих центрах).

Для бухгалтера MO — це момент, коли матеріали зі складу перетворюються на незавершене виробництво, а потім — на готову продукцію. За П(С)БО 9 і 16 саме тут утворюється виробнича собівартість: прямі матеріали (CR 201) + прямі зарплати (CR 661) + ЗВВ (CR 91) → DR 23 → DR 26. Odoo допомагає це автоматизувати, але треба знати, де він проводить, а де ні.

Як це працює

Базовий потік MO:

  1. Confirmed. MO створено (вручну або з SO через make-to-order). Зарезервовано матеріали.
  2. In Progress. Працівник «бере» матеріали на виробництво — Odoo робить stock.move зі складу (201) у виробництво (23, production location). За anglo-saxon ця проводка падає в account_production_wip_account_id.
  3. Done. Виріб готовий, оприбутковуємо в FG (готова продукція). Проводка з 23 → 26.

mrp.bom — це шаблон. Один продукт може мати кілька BoM під різні варіанти (наприклад, BoM «звичайний» і BoM «defense-комплектація»). Активну BoM Odoo обирає за пріоритетом і відповідністю варіанту.

mrp.workorder — це етапи: «фрезерування», «зварювання», «контроль». Кожен прив’язаний до mrp.workcenter (робочого центру), має time_cycle (норму часу) і може писати фактичний час через таймер. На основі цього Odoo рахує WIP-собівартість і завантаженість потужностей.

# Створення MO
mo = self.env['mrp.production'].create({
    'product_id': finished_good.id,
    'product_qty': 100,
    'bom_id': bom.id,
    'analytic_distribution': {str(contract_a1234.id): 100},
})
mo.action_confirm()
# Резервація матеріалів
mo.action_assign()

Шлях у меню: Manufacturing → Operations → Manufacturing Orders / Work Orders / Unbuild Orders.

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

Стандартний Odoo MRP добре працює зі складом, але не знає українських первинних форм:

  • М-11 (лімітно-забірна картка / накладна-вимога). Документ, за яким матеріал відпускається у виробництво. У стандарті — лише англомовний «Material Consumption Report».
  • Акт виробництва. Підтверджує оприбуткування ГП. У стандарті — «Production Confirmation».
  • Калькуляція собівартості. Українська форма з розбивкою на прямі й непрямі витрати. У стандартному Odoo є тільки «Cost Analysis» — формату УПСБО він не дає.

Що з коробки працює добре: WIP-проводки, структура BoM, варіанти й операції, інтеграція з аналітикою. Що доводиться допилювати: М-11, М-12, акт виробництва, інвентарна картка ГП — це окремі QWeb-шаблони.

ПДВ при виробництві не утворюється — це внутрішній рух. ПН з’являється тільки при реалізації готової продукції через SO або при безоплатній передачі.

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

ТОВ «УкрПром-Тех» виробляє складні вироби з трасабіліті. У нас на кожен MO:

  • Прив’язка до контракту А-XXXX через analytic_distribution (так само як SO і PO).
  • Серійні номери на компонентах і на готовому виробі. Через stock.lot ми потім скажемо, яка саме плата з якого MO пішла в яку партію для замовника.
  • BoM-варіанти за «комплектаціями». Один продукт «Виріб-X» має BoM_civ (цивільна) і BoM_def (оборонна, з додатковими тестами й документами). Коли підтверджуємо замовлення, обираємо потрібну.

Калькуляція реальної собівартості оборонної партії — окремий звіт поверх MO. Беремо WIP-проводки, додаємо фактичний час робітників із таймерів, розподіляємо ЗВВ за коефіцієнтом. Це власний модуль — стандартного mrp_account для оборонного обліку замало.

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

  • BoM за нормою, а списано фактично. Працівник узяв 1.1 кг замість 1.0 за нормою. Odoo дозволить, але спрацює налаштування consumption='strict' / flexible / warning (на BoM). Якщо strict — MO не закриється, доки не приведеш кількості до норми. Зазвичай ставимо warning: за норму вийти можна, але побачимо попередження.
  • Не оприбуткували відходи. Поворотні відходи (металобрухт, обрізки) теж матеріал, тільки з низькою вартістю. Створюй окремий продукт «Відходи-Х», постав на BoM by_product_id й оприбутковуй автоматично.
  • MO без analytic_distribution. Собівартість «розмажеться» по компанії, і ти ніколи не дізнаєшся, скільки реально коштував А-1234. Виправлення — required-поле на mrp.production через server action або кастомний модуль.
  • Anglo-saxon вимкнено. Тоді списання матеріалу дає проводку 23/201, але без stock.valuation.layer. Звіти за реальною собівартістю не сходяться. Завжди вмикай anglo-saxon для виробничих компаній.
  • WIP «висить» назавжди. MO в стані «In Progress», бо забули закрити. На рахунку 23 накопичується залишок, який не має реального відповідника. Налаштуй cron Production: Auto-close stuck MOs або щотижневий перегляд.
  • BoM змінили, історичні MO «зламалися». Поточні розрахунки правильні, але старі звіти показують іншу собівартість. Завжди роби нову версію BoM (mrp.bom.version), а не редагуй активну.

Дотичне

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