先说结论
很多人以为副产品上的 cost_share 只是“把总成本拆一下,方便看报表”。
但 mrp_account 的 _cal_price() 告诉你,它的影响远比这深:
- 副产品 move 的
price_unit会被直接重算 - 主成品 move 的
price_unit只拿剩余成本 - 如果你启用了实时估值和 WIP,会进一步改变你对制造过程里“还有多少价值留在在制 / 生产科目”的理解
所以它不是展示字段,而是成本口径选择器。
源码真正做了什么
在 addons/mrp_account/models/mrp_production.py 里,Odoo 先把制造总成本算出来:
- 原料消耗 value
- 工单工时成本
workorder._cal_cost() - 额外单件成本
extra_cost
然后开始处理副产品:
- 找出
move_byproduct_ids里仍有效且数量大于 0 的 move - 汇总这些副产品的
cost_share - 对 FIFO / AVCO 副产品,直接写入各自
price_unit - 主成品
finished_move.price_unit只拿1 - byproduct_cost_share的那部分
也就是说,副产品不是“事后摊一下”,而是在完工入库前就决定了谁吃掉多少制造成本。
这为什么会影响会计理解
很多团队看到主产品成本降低,会误以为“系统只是把一部分价值移到了副产品库存”。
这句话只说对了一半。
更完整的理解应该是:
- 制造过程里先累积原料、工时、额外成本
- 完工时这些价值要落到 finished moves 上
- 一旦副产品拿走一部分 share,主产品进入库存的金额就会同步下降
如果你的公司还在看 WIP 或生产成本对冲科目,这件事会产生两个后果:
1. 完工后从生产 / 在制口径转出的结构变了
不是所有成本都流向主产品库存,而是部分流向副产品库存。
2. 主产品毛利会显得更好,但不代表总制造更便宜
因为那部分成本被副产品吸收了,只是去了别的库存对象。
为什么这和旧文“副产品估值”不是一回事
“估值”更关注副产品分了多少价值。
而本文想强调的是更容易被忽略的一层:
一旦你给副产品设置了
cost_share,你实际上改变了主产品、生产科目和完工结转的解释口径。
特别是在这些场景里影响很明显:
- 财务按主产品单位成本看毛利
- 工厂按 MO 看 WIP 和完工转出
- 管理层误把副产品当“免费回收品”
最容易误解的 5 个点
1. 以为副产品只在报表端分摊
不是,price_unit 在 move 层就被改了。
2. 以为主产品标准成本不会受影响
在 FIFO / AVCO 下,完工 move 的实际入库单价会直接受影响。
3. 以为副产品拿成本越多越好
副产品 share 越高,主产品成本越低,但这不等于真实利润更高,只是成本被重新归属。
4. 以为 WIP 只和工时有关
不是。WIP 关注的是制造价值如何在“尚未结转”和“已经进入库存”之间移动;副产品 share 会改变这次结转的分布。
5. 以为所有副产品都自动有成本
源码明确只有一定条件下才写入副产品 price_unit,尤其与成本方法、数量和 cost_share 是否非 0 有关。
一个更实用的判断框架
如果你在设计副产品成本策略,可以先问三件事:
- 副产品是否真的可出售或可再利用,值得承接一部分制造成本?
- 主产品单位成本是否会被业务拿去做报价、毛利或绩效考核?
- 财务是否需要解释 MO 完工时,为什么库存与生产科目分配结构变化了?
如果这三件事都重要,就不要把 cost_share 当成随便填的百分比。
排错顺序
如果主产品 / 副产品成本看起来异常,按这个顺序查:
move_byproduct_ids里哪些副产品数量实际大于 0cost_share总和是否合理- 副产品产品成本法是不是 FIFO / AVCO
- 原料消耗、工单工时、
extra_cost是否先已正确累计 - 完工后库存金额变化是否与主副产品 share 匹配
- 再去看 WIP、生产成本科目和报表解释是否一致
一句话记忆法
副产品
cost_share改的不只是副产品估值,它同时重写了主产品入库成本和整笔制造完工的会计解释。
DISCUSSION
评论区