多公司一致性

Odoo 为什么老报公司不一致:check_company、公司边界和多公司对象关联怎么理解

很多多公司报错看起来像权限问题,实际上是对象之间的公司边界不一致。本文把 check_company 背后的约束思路讲清楚。

Odoo 开发 框架
进阶 开发者 1 分钟阅读
0 评论 0 点赞 0 收藏 6 阅读

先说结论

在 Odoo 里,很多“公司不一致”报错,并不是权限系统在发疯,而是在提醒你:

你正在把本来不该跨公司直接混用的对象强行绑在一起。

这背后最常见的关键点之一,就是 check_company 这类公司边界一致性校验。


为什么它常被误判成权限问题

因为用户表面看到的是:

  • 选不了
  • 保存时报错
  • 创建下游对象失败

这和权限问题表象很像。

但权限问题更偏“你能不能看/能不能操作”,而公司一致性问题更偏:

  • 这些对象本身就不该跨这个公司边界直接连起来。

所以方向一旦查错,就很容易越查越偏。


check_company 背后的真正思路是什么

最通俗地说,它是在防止:

  • A 公司的对象
  • 直接挂到 B 公司的对象上
  • 最后把业务边界搅乱

它不是为了增加麻烦,而是为了守住:

  • 财务归属
  • 单据边界
  • 业务对象一致性

所以这个校验更像“防串线保护”。


为什么多公司不是“能看多个公司就能随便混用”

这是特别容易误解的一点。

一个用户可以同时有多个公司上下文,不代表:

  • 所有对象都能任意混着引用

能访问多个公司,和对象之间允许怎么关联,是两回事。

所以很多人会说:

  • 我明明都能看到,为什么不能选?

答案通常就是:

  • 看得到,不等于业务上允许直接绑一起。

这种问题最常出现在哪些场景

很常见的包括:

  • 单据选了别的公司对象
  • 关联字段候选跨了公司边界
  • 下游对象创建时继承了错误公司上下文
  • 定制代码里手工赋值把不同公司的记录绑在一起

所以一旦你看到“公司不一致”,优先就该去想:

  • 当前这条链上有哪些对象属于哪个公司

而不是先去改 group。


为什么这类约束对数据长期质量很重要

因为如果不拦住,短期可能只是“能保存”; 长期就会变成:

  • 业务对象归属混乱
  • 报表口径异常
  • 财务与库存串公司
  • 定制越来越难解释

所以这种报错的意义,很多时候是在替你拦住未来的大坑。


实战里最容易踩的 5 个坑

1. 把公司一致性问题当权限问题查

方向马上偏掉。

2. 只看当前记录,不看整条关联链的公司归属

根因很容易漏。

3. 以为多公司可见就等于可混用

这是最常见误区之一。

4. 定制代码手工赋值时不顾 company 边界

最容易制造隐蔽 bug。

5. 为了绕过报错就粗暴提权或硬关校验

短期省事,长期代价很大。


一句话记忆法

把它记成一句话:

check_company 不是在管权限,而是在守住对象之间的公司边界,避免把本不该跨公司直接关联的数据强行混在一起。

理解这一句,多公司一致性问题会好排查很多。

DISCUSSION

评论区

想参与讨论?先 登录 再发表评论。
还没有评论,你可以成为第一个留言的人。