引言
在 Odoo 中,模型决定了数据如何在数据库中组织与保存。任何业务数据——从销售订单到发票再到总账分录——都会以模型记录的形式存在系统里。
无论你是开发人员还是业务顾问,理解 Odoo 的模型都是必备技能。模型构成了 Odoo 的数据骨架,定义字段类型、记录间的关联以及嵌入的业务规则。
本文聚焦 Odoo 会计模块中非常核心的模型:account.move.line。无论是写定制报表、对接第三方系统,还是配置对账流程,都会频繁与该模型打交道。
什么是 account.move.line 模型
account.move.line 表示会计分录中的明细行。每一行记录一笔借方或贷方发生额;一个分录里的所有行合计后必须平衡,即借方总额等于贷方总额。
这个模型属于会计模块并作为 account.move(总账分录/发票/账单/银行分录)的子记录使用。每一笔总账分录至少包含一行或多行明细。
模型定义在 account 模块中,其他功能模块通过继承扩展它。销售模块为发票明细补充字段,采购模块为账单补充字段,分析会计模块增加分析分摊等。各模块在不重复核心结构的前提下,按需补充功能。
模型的关键字段
下面列出 account.move.line 中最常用且必须理解的字段,掌握它们有助于正确处理分录与会计数据。
1. name
类型:Char。记录行的描述或标题,通常在分录界面与报表中显示。发票行通常会取自产品名称或自定义说明,便于识别。
2. move_id
类型:Many2one(account.move)。将明细行关联到所属的总账分录。每行只能属于一个 move,是模型之间最重要的父子关系。
3. account_id
类型:Many2one(account.account)。记账科目,必填。必须指向非视图、未关闭的科目,决定报表分组和账表输出。
4. debit
类型:Float。借方金额,默认为 0.0。每条明细通常只填借方或贷方之一。借方通常增加资产与费用类科目。
5. credit
类型:Float。贷方金额,默认为 0.0。贷方通常增加负债、权益与收入类科目。一笔分录内所有借贷合计必须相等。
6. balance
类型:Float(计算字段)。等于 debit 减去 credit,表示该行的净影响。正值表示借方影响,负值表示贷方影响,常用于报表与对账逻辑。
7. partner_id
类型:Many2one(res.partner)。关联的客户或供应商,用于应收应付管理、账龄分析和对账匹配。
8. date
类型:Date。行的生效日期,通常继承自父分录。用于期间结账、报表统计与账龄计算。
9. date_maturity
类型:Date。应付/应收到期日,用于账龄表与付款计划。
10. currency_id
类型:Many2one(res.currency)。行的货币,当与公司本位币不同用于多币种分录处理。
11. amount_currency
类型:Float。以行货币计的金额,配合 currency_id 实现多币种记账与换算。
12. quantity
类型:Float(可选)。在基于产品的发票或账单中使用,用于按数量统计和单价计算。
13. product_id
类型:Many2one(product.product)。当明细来源于销售或采购单据时填充,对产品级别的分析与报表有用。
14. product_uom_id
类型:Many2one(uom.uom)。数量的计量单位,用于数量显示与换算。
15. price_unit
类型:Float。单位价格,与数量配合计算发票或账单金额。
16. tax_ids
类型:Many2many(account.tax)。适用于该行的税率。过账时 Odoo 会为税额生成额外的税务明细行,支持增值税等税种的计算。
17. tax_line_id
类型:Many2one(account.tax)。当行本身是税额行时,指向生成该行的税项,用于区分税金行与普通会计行。
18. analytic_account_id
类型:Many2one(account.analytic.account)。用于开启分析会计时,标注成本或收入归属的分析科目,便于按项目或部门汇总。
19. analytic_distribution
类型:Json 或 Text。用于在多个分析账户之间分摊的配置,在新版本中可取代单一的 analytic_account_id 来实现百分比分摊。
20. ref
类型:Char。通常从父分录继承的外部参考或备注,用于报表展示与对账匹配。
21. narration
类型:Text。内部说明或附注,默认不在面向客户的单据上打印。
22. journal_id
类型:Many2one(account.journal)。所属日记账,便于按日记账筛选和分类汇总。
23. company_id
类型:Many2one(res.company)。所属公司,多公司环境下决定记录的可见性与合并逻辑。
24. reconciled
类型:Boolean。标识该行是否已被完全对账,用于在对账视图中过滤未对账项。
25. full_reconcile_id
类型:Many2one(account.full.reconcile)。将一起被对账的多行关联到同一个对账组,便于追溯对账历史。
26. payment_id
类型:Many2one(account.payment)。与付款记录关联,常用于发票与实际付款的匹配。
27. statement_id
类型:Many2one(account.bank.statement)。银行对账单的父记录,在银行对账场景中使用。
28. statement_line_id
类型:Many2one(account.bank.statement.line)。指向具体的银行对账行,用于将分录与银行交易精确匹配。
29. display_type
类型:Selection。可为 'line_section' 或 'line_note',用于在分录中显示分组标题或说明,这类行无借贷金额,仅用于展示。
30. create_date
类型:Datetime。记录创建时间,Odoo 自动维护,有助于审计与变更追踪。
31. write_date
类型:Datetime。记录最近一次修改时间,系统自动更新,方便回溯变更历史。
该模型在业务流程中的用途
1. 客户开票场景
确认发票时,系统会生成若干 account.move.line:收入记入收入科目,应收记入客户应收科目,税金会生成独立的税务行。partner_id 用于账龄与对账匹配。
2. 供应商账单场景
供应商账单会生成费用、进项税与应付的明细行。结构与客户发票类似,但科目类型相反,partner_id 同样用于应付管理与核对。
3. 银行对账场景
银行对账时,将银行对账单行与会计明细通过 statement_line_id 匹配;对账成功后系统会通过 full_reconcile_id 关联这些行,并将 reconciled 标记为真。
4. 手工分录场景
用户可创建包含多条明细的手工分录,每行指定科目与借贷方向。系统在过账前会校验借贷平衡。
5. 分析与成本报告场景
启用分析会计后,明细行会携带 analytic_account_id 或 analytic_distribution,报表可按项目、部门或其他维度聚合成本与收入。
开发者如何扩展此模型
开发者主要通过 Odoo 的模型继承机制来扩展 account.move.line,常见做法包括新增字段、改写方法和加入校验逻辑。
模型继承方式
通过 _inherit = 'account.move.line' 在自定义模块中继承该模型。这样可以新增字段、重写方法或添加约束,同时保持修改与核心代码分离,方便升级维护。
添加字段
在继承模型中声明新字段,选择合适的字段类型(Char、Many2one、Boolean、Integer、Text、Selection 等)。考虑多公司场景下的 company_dependent 配置以及计算字段的依赖关系,避免性能问题。
Python 层扩展
可重写 create、write、unlink 等方法来加入业务逻辑;记得使用 super() 调用父类实现,避免破坏借贷平衡或其他核心校验。Odoo API 在这些方法上也便于第三方集成。
Odoo Studio
Odoo Studio 允许在不写代码的前提下给 account.move.line 添加字段或界面调整,适合快速迭代的小改动。但复杂业务或对账规则建议通过自定义模块实现以便长期维护。
最佳实践
- 切勿直接绕开父分录去新建或修改明细行。应通过 account.move 的 API(例如操作 line_ids)来维护一致性,确保系统执行所有必须的检查与约束。
- 构建报表时,按 move_id.state = 'posted' 过滤,以排除草稿和已取消的分录,保证报表数据的权威性。
- 为应收、应付等场景选择正确的 account_id(相应的科目类别),以确保账龄和对账流程能够正常工作。
- 通过 API 集成时,先创建 move,再添加对应的 line,确保在过账前借贷平衡。
- 自定义字段应使用 x_ 前缀或加入模块前缀以避免将来与核心字段冲突,便于升级兼容性。
常见错误
- 在同一明细同时设置 debit 和 credit。每行应当只包含借方或贷方中的一项,不要同时赋值。
- 创建不平衡的分录。系统在过账时会校验借贷是否平衡,不平衡会被拒绝。
- 对已过账的分录直接修改,而不走冲销或调整流程。已过账记录应通过新增分录来调整,而非直接编辑已过账行。
- 在应收/应付明细忘记设置 partner_id。缺失会影响账龄分析与自动对账的准确性。
- 在重写核心方法时不调用 super()。这类做法可能破坏对账、锁定逻辑或影响其他扩展模块的功能。
结语
account.move.line 是 Odoo 会计体系的核心,记录了所有会计分录的借贷明细。掌握它的字段与扩展方式,能让你更高效地配置、定制与对接 Odoo。
无论你是在做业务流程映射的功能顾问,还是开发定制报表与集成的工程师,深入理解 account.move.line 都能节省大量时间并避免常见错误。
需要 Odoo 实施支持吗?
Dasolo 帮助企业实施、定制与优化 Odoo,专长包括 API 对接与模块开发。我们的团队对 Odoo 的数据架构与核心模型(如 account.move.line)有深厚经验。
如果你需要 Odoo 实施、定制模块或系统对接方面的帮助,我们可以提供支持。 预约演示 讨论你的项目。