先说结论
Odoo 里 BOM 上能看到的附件,并不是“谁上传了文件谁就都能看见”。
真正起作用的,是 product.document 上的制造可见范围字段。只有当文档被标记为 attached_on_mrp = bom 时,它才会被 Odoo 当成“这张 BOM 的附加制造文档”带出来。
所以很多人以为系统丢文件,实际常见原因只是:文件挂在产品上了,但没有声明要在制造场景透出。
这套机制为什么值得理解
制造现场的文件有三类:
- 产品级说明:通用图纸、规格书、合规声明
- BOM 级说明:某个制造配方或工艺专用附件
- 工序级说明:更接近工作指导书、作业卡、检查点
Odoo 社区版这里做得很克制:它没有把所有文件都一股脑塞进工单,而是先通过 product.document 定义“这个文件在制造里是否可见、可见到哪一层”。
源码里的关键点
在 product.document 上,MRP 扩展了一个字段:attached_on_mrp,选项至少有:
hiddenbom
默认逻辑也很明确:如果上下文是 attached_on_bom,默认就挂到 bom;否则默认 hidden。
这意味着 Odoo 的设计思路是:
- 文件先属于产品或模板
- 再通过制造可见性声明它是不是应该在 BOM 层展示
- BOM 在读取额外附件时,按这个声明去筛
不是“只要跟产品有关,就自动在所有制造对象上出现”。
BOM 为什么能自动带出附件
在 mrp.bom._get_extra_attachments() 里,Odoo 会收集:
- BOM 的
product_id - BOM 的
product_tmpl_id - 如果启用了副产品,还会把副产品也纳入候选
然后再按 attached_on_mrp = bom 去搜对应 product.document,最后取其真实的 ir_attachment。
这说明 BOM 附件展示,本质上是一次按产品 / 模板 / 副产品维度的受控聚合,而不是 BOM 自己独立存了一份文件。
最容易踩的坑
1. 文件上传到了产品,但 BOM 看不到
通常不是权限问题,而是 attached_on_mrp 还在 hidden。
2. 以为 BOM 附件是“只属于这张 BOM”
很多时候它其实来源于产品或模板级文档,所以多个 BOM 可能共享同一份附件。
3. 把所有文档都挂 BOM
这样会让现场文件越来越乱。真正应该挂 BOM 的,是制造时必须看到的文档,不是所有归档资料。
4. 忽略副产品带来的附件暴露
如果你开启了副产品能力,BOM 附件聚合范围会更广,不是只有主成品一条线。
实战上怎么配置更稳
建议按这个原则:
- 通用资料:保留在产品层,制造可见性设为
hidden - 现场必须看:设为
bom - 经常变化的作业指引:不要混成产品长期附件,最好建立清晰版本管理
你要追求的不是“文件都能找到”,而是“现场只看到此刻必须看的文件”。
排错顺序
如果车间说 BOM 上看不到文件,按这个顺序查:
- 文件到底在
product.product还是product.template attached_on_mrp是不是bom- 当前 BOM 对应的是具体变体还是模板
- 是否有副产品造成你误以为文件应该出现在另一张 BOM
- 最后再查权限和附件本身是否损坏
一句话记忆法
Odoo 的 BOM 附件不是“上传即可见”,而是“先挂产品,再声明制造可见范围,最后由 BOM 按规则聚合显示”。
DISCUSSION
评论区