Odoo
МодульOdoo MRP — виробничі замовлення і BoM
Виробниче замовлення (MO) як центр виробничого обліку: списання матеріалів, операції, оприбуткування готової продукції.
Що це і навіщо
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:
- Confirmed. MO створено (вручну або з SO через make-to-order). Зарезервовано матеріали.
- In Progress. Працівник «бере» матеріали на виробництво — Odoo робить
stock.moveзі складу (201) у виробництво (23, production location). За anglo-saxon ця проводка падає вaccount_production_wip_account_id. - 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), а не редагуй активну.
Дотичне
- Inventory — складська механіка під виробництвом
- Analytic Account — аналітика для собівартості за контрактом
- Документ-модель — як MO вписано у загальний ланцюг
- BoM — специфікація як документ
- Акт виробництва — акт виробництва
- Закриття НЗВ — закриття НЗВ і собівартість
- Понаднормативний брак — понаднормативний брак
Де цей модуль зустрічається12
- ГайдБрак під час MOВиправний брак, невиправний брак у межах норми, понаднормативний брак — три сценарії з різними проводками і до…
- ГайдЗапустити MOВід створення виробничого замовлення до закриття зі списанням матеріалів та оприбуткуванням готової продукції.…
- ГайдЗміна BoM у цикліЯк змінити специфікацію так, щоб історичні MO не «зламалися», нові пішли за новою нормою, а аудитор міг побачи…
- ГайдНЗВ → ГПЯк 23 рахунок «розряджається» на 26 в межах місячного циклу: cost method, розподіл ЗВВ за П(С)БО 16.16, провод…
- ГайдСтворити BoMПерша специфікація виробу в Odoo: від продукту-готового виробу до списку компонентів, варіанти, тип BoM і авто…
- ГайдBoM vs RoutingМатеріали — у BoM, операції на робочих центрах — у Routing. Розбираємо, де чим відрізняється і як їх правильно…
- ГайдLot / Serial для defenseНалаштовуємо `tracking=lot` на компоненти і `tracking=serial` на готові вироби, щоб довести шлях кожної партії…
- ГайдMulti-level BoMДві стратегії складних виробів: kit «розгортає» компоненти прямо на батьківському MO, manufacture виробляє вуз…
- ГайдQuality checkТочки контролю якості на MO і work orders: візуальна перевірка, замір, pass/fail, зв'язок із серійними номерам…
- ГайдWork Center і потужностіРобочий центр як точка обліку часу і вартості: години роботи, OEE, calendar, capacity і вартість години. База …
- OdooAnalytic AccountЧому аналітика окрема від плану рахунків і як нею вести проєктний облік оборонних контрактів, рахувати маржу з…
- OdooInventoryФізичні і логічні рухи запасів: stock.move як атом обліку, stock.quant як зріз наявності, anglo-saxon як основ…