会计过账

Odoo 凭证过账到底做了什么:从草稿到正式入账的关键链路

很多会计问题最后都会落到 action_post。本文从业务和源码两层讲清楚 Odoo 凭证过账为什么是会计链路里最关键的一步。

Odoo 开发 会计
进阶 开发者 1 分钟阅读
0 评论 0 点赞 0 收藏 8 阅读

先记住一句话

在 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

评论区

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