先记住一句话
在 Odoo 里,草稿凭证是可编辑的业务准备态,posted 凭证才是正式会计事实。
所以“过账”不是一个按钮小动作,而是整个会计链路最关键的边界。
你只要理解了这条边界,很多问题就会顺很多:
- 为什么草稿能改,posted 不能随便改?
- 为什么税、序号、校验、锁定都喜欢堆在过账时发生?
- 为什么很多业务模块最后都要把动作落到
account.move.action_post()?
为什么 Odoo 要把 draft 和 posted 明确分开
因为会计系统最怕“已确认事实还在漂”。
业务过程里,信息可能一直变:
- 发票行可能还会改
- 税可能会重算
- 日期可能会调整
- 对方科目可能还没确认
如果这些都直接算正式账,那后面审计和对账会非常痛苦。
所以 Odoo 把凭证分成两层:
- draft:还在准备、可以修正
- posted:正式入账,默认应保持稳定
这个分层既是业务控制,也是源码设计的核心前提。
action_post() 到底在做什么
从名字看像“把状态改成 posted”。
但真实工作远不止改状态。
过账通常意味着系统要确认:
- 凭证结构是否合法
- 必要字段是否齐全
- 借贷是否平衡
- 日期与会计期间是否允许
- 税、序列号、公司上下文是否一致
- 过账后需要触发哪些后续动作
所以更准确地理解是:
action_post()是一次正式入账前的总闸门。
它把“看起来像一张会计凭证”变成“系统认可的正式会计事实”。
为什么借贷平衡校验总在这里特别重要
因为草稿阶段很多字段都还可能变化。
如果太早死卡借贷平衡,用户会觉得系统很难操作; 如果太晚才校验,又可能把坏数据放进正式账。
所以过账点就是最自然的强校验时机。
到这一步,系统可以理直气壮地说:
- 你现在要入账了
- 那借贷必须平
- 关键科目必须齐
- 不允许再模棱两可
会计严谨性,往往就是在这个边界被真正落实的。
为什么过账后序号通常也会正式确定
很多会计文档编号都不希望在草稿阶段就彻底锁死。
原因很现实:
- 草稿可能会删
- 草稿可能会作废重做
- 草稿顺序不代表最终入账顺序
所以 Odoo 往往在 posted 时才更正式地决定会计编号。
这和业务世界也一致:
不是“我开始编辑了”就算正式单据,而是“我正式确认入账了”才算。
为什么很多业务对象最后都会落到 account.move
因为会计是结果层。
比如:
- 销售发票
- 供应商账单
- 杂项凭证
- 某些资产、费用、税务动作
它们业务入口不同,但要进入正式账,最后通常都得变成或依附于 account.move。
也就是说,account.move 不是“发票页面的后台表”这么简单。
它更像 Odoo 会计世界里的统一账务载体。
posted 之后为什么不鼓励直接改
因为一旦 posted,这条记录就不再只是“你这次表单输入了什么”。
它已经变成:
- 财务报表的一部分
- 对账依据的一部分
- 税务与审计链条的一部分
所以 posted 后如果还能随便乱改,整个会计可信度就会被打穿。
这也是为什么 Odoo 常见做法不是“直接改 posted”,而是:
- 反过账(如果策略允许)
- 冲销
- 补做调整分录
从设计哲学上说,这不是系统保守,而是会计系统必须保守。
过账为什么经常牵动税和日期
因为税和期间都属于会计边界条件。
一旦 posted:
- 税额开始影响申报口径
- 会计日期开始影响期间归属
- 某些锁定日期之后不允许再入账
所以你会发现很多“平时好像没事”的数据,到过账时突然被严格校验。
这不是 Odoo 在故意刁难,而是因为:
过账之前是业务编辑,过账之后是会计责任。
实战中最容易踩的 5 个坑
1. 以为草稿状态已经等于会计确认
不是。草稿只是准备态。
2. 用定制代码绕过 action_post()
这样很容易漏掉关键校验、序号、税或后续动作。
3. 过账后还想像业务单一样自由修改
会计对象的稳定性要求更高。
4. 只看界面,不看公司/期间/锁定日期上下文
很多“不能过账”并不是凭证本身错,而是期间边界不允许。
5. 把会计问题理解成纯 UI 问题
过账失败往往意味着底层业务事实还不完整。
一套很实用的排查顺序
如果凭证过不了账,优先按这个顺序查:
1. 借贷是否平衡
这是最基本的底线。
2. 日期和期间是否允许
尤其注意锁定日期。
3. 税、科目、伙伴、公司上下文是否一致
很多问题出在组合关系,而不是单字段本身。
4. 是否已有编号策略或序列问题
正式编号常常在过账边界才暴露。
5. 是否有定制代码重写了过账逻辑
这类问题最容易制造“看起来没错但就是过不了”的局面。
一句话记忆法
把过账记成一句话:
action_post()的本质,不是把状态从 draft 改成 posted,而是把一份可编辑草稿变成正式会计事实。
理解这一句,你看 Odoo 会计模块会稳很多。
DISCUSSION
评论区