先说结论
在 Odoo 里,很多“公司不一致”报错,并不是权限系统在发疯,而是在提醒你:
你正在把本来不该跨公司直接混用的对象强行绑在一起。
这背后最常见的关键点之一,就是 check_company 这类公司边界一致性校验。
为什么它常被误判成权限问题
因为用户表面看到的是:
- 选不了
- 保存时报错
- 创建下游对象失败
这和权限问题表象很像。
但权限问题更偏“你能不能看/能不能操作”,而公司一致性问题更偏:
- 这些对象本身就不该跨这个公司边界直接连起来。
所以方向一旦查错,就很容易越查越偏。
check_company 背后的真正思路是什么
最通俗地说,它是在防止:
- A 公司的对象
- 直接挂到 B 公司的对象上
- 最后把业务边界搅乱
它不是为了增加麻烦,而是为了守住:
- 财务归属
- 单据边界
- 业务对象一致性
所以这个校验更像“防串线保护”。
为什么多公司不是“能看多个公司就能随便混用”
这是特别容易误解的一点。
一个用户可以同时有多个公司上下文,不代表:
- 所有对象都能任意混着引用
能访问多个公司,和对象之间允许怎么关联,是两回事。
所以很多人会说:
- 我明明都能看到,为什么不能选?
答案通常就是:
- 看得到,不等于业务上允许直接绑一起。
这种问题最常出现在哪些场景
很常见的包括:
- 单据选了别的公司对象
- 关联字段候选跨了公司边界
- 下游对象创建时继承了错误公司上下文
- 定制代码里手工赋值把不同公司的记录绑在一起
所以一旦你看到“公司不一致”,优先就该去想:
- 当前这条链上有哪些对象属于哪个公司
而不是先去改 group。
为什么这类约束对数据长期质量很重要
因为如果不拦住,短期可能只是“能保存”; 长期就会变成:
- 业务对象归属混乱
- 报表口径异常
- 财务与库存串公司
- 定制越来越难解释
所以这种报错的意义,很多时候是在替你拦住未来的大坑。
实战里最容易踩的 5 个坑
1. 把公司一致性问题当权限问题查
方向马上偏掉。
2. 只看当前记录,不看整条关联链的公司归属
根因很容易漏。
3. 以为多公司可见就等于可混用
这是最常见误区之一。
4. 定制代码手工赋值时不顾 company 边界
最容易制造隐蔽 bug。
5. 为了绕过报错就粗暴提权或硬关校验
短期省事,长期代价很大。
一句话记忆法
把它记成一句话:
check_company不是在管权限,而是在守住对象之间的公司边界,避免把本不该跨公司直接关联的数据强行混在一起。
理解这一句,多公司一致性问题会好排查很多。
DISCUSSION
评论区