跳至内容

Odoo 企业版会计报表引擎

会计报表自定义参考指南
2025年12月28日
Odoo 企业版会计报表引擎
张飞虎

近期有一个项目涉及Odoo企业版会计报表的自定义配置,以下是期间使用Claude总结的Odoo企业版会计报表引擎的一些参考资料


1. Domain 引擎(最灵活,适用于发生额查询)

适用场景

  • 查询期间发生额(借方发生额、贷方发生额)
  • 复杂的组合条件查询
  • 基于凭证行字段的精确过滤

核心概念

  • 直接查询 account_move_line 表
  • 可以访问 debit、credit、balance 等字段
  • 支持所有Odoo域条件

实际示例

<!-- 1. 查询借方发生额(期间内所有借方发生额合计) -->
<record id="debit_movement" model="account.report.line">
<field name="expression_ids">
<record id="expr_debit" model="account.report.expression">
<field name="engine">domain</field>
<field name="formula">[('account_id.code', '=like', '1001%'), ('debit', '>', 0)]</field>
<field name="subformula">sum</field>
</record>
</field>
</record>

<!-- 2. 查询贷方发生额(期间内所有贷方发生额合计) -->
<record id="credit_movement" model="account.report.line">
<field name="expression_ids">
<record id="expr_credit" model="account.report.expression">
<field name="engine">domain</field>
<field name="formula">[('account_id.code', '=like', '1001%'), ('credit', '>', 0)]</field>
<field name="subformula">sum</field>
</record>
</field>
</record>

<!-- 3. 查询特定科目的净额 -->
<record id="net_amount" model="account.report.line">
<field name="expression_ids">
<record id="expr_net" model="account.report.expression">
<field name="engine">domain</field>
<field name="formula">[('account_id.code', '=like', '1001%')]</field>
<field name="subformula">sum</field>
</record>
</field>
</record>

<!-- 4. 组合多个条件 -->
<record id="complex_query" model="account.report.line">
<field name="expression_ids">
<record id="expr_complex" model="account.report.expression">
<field name="engine">domain</field>
<field name="formula">[('account_id.code', '=like', '100%'), ('partner_id', '=', partner_id), ('date', '>=', '2024-01-01'), ('date', '<=', '2024-01-31')]</field>
<field name="subformula">sum</field>
</record>
</field>
</record>

Subformula选项

  • sum: 求和(默认)
  • -sum: 取负值(常用于将贷方发生额转为负数表示)
  • sum_if_pos: 只在结果为正时返回
  • sum_if_neg: 只在结果为负时返回
  • count_rows: 计算凭证行数量

2. Account Codes 引擎(适用于余额查询)

适用场景

  • 查询科目余额(期末余额)
  • 基于科目编码前缀的快速筛选
  • 需要根据科目余额符号进行过滤

核心概念

  • 查询的是科目的期末余额,不是期间发生额
  • 'D'参数过滤"余额为正的科目",不是"借方发生额"
  • 'C'参数过滤"余额为负的科目",不是"贷方发生额"

正确示例

<!-- 1. 查询科目余额(所有1001开头科目的余额合计) -->
<record id="account_balance" model="account.report.line">
<field name="expression_ids">
<record id="expr_balance" model="account.report.expression">
<field name="engine">account_codes</field>
<field name="formula">+1001</field>
<field name="subformula">sum</field>
</record>
</field>
</record>

<!-- 2. 过滤正余额科目(D = Debit Balance,正余额) -->
<record id="positive_balance_accounts" model="account.report.line">
<field name="expression_ids">
<record id="expr_positive" model="account.report.expression">
<field name="engine">account_codes</field>
<field name="formula">+1001D</field>
<field name="subformula">sum</field>
</record>
</field>
</record>

<!-- 3. 过滤负余额科目(C = Credit Balance,负余额) -->
<record id="negative_balance_accounts" model="account.report.line">
<field name="expression_ids">
<record id="expr_negative" model="account.report.expression">
<field name="engine">account_codes</field>
<field name="formula">+1001C</field>
<field name="subformula">sum</field>
</record>
</field>
</record>

<!-- 4. 排除特定子科目 -->
<record id="exclude_sub" model="account.report.line">
<field name="expression_ids">
<record id="expr_exclude" model="account.report.expression">
<field name="engine">account_codes</field>
<field name="formula">+1001\(100101)</field>
<field name="subformula">sum</field>
</record>
</field>
</record>

<!-- 5. 复合运算 -->
<record id="complex_codes" model="account.report.line">
<field name="expression_ids">
<record id="expr_complex" model="account.report.expression">
<field name="engine">account_codes</field>
<field name="formula">+1001 - 2001 + 3001</field>
<field name="subformula">sum</field>
</record>
</field>
</record>

语法要点

  • +1001: 所有以1001开头的科目余额
  • +1001D: 余额为正的1001开头科目
  • +1001C: 余额为负的1001开头科目
  • +1001\(100101): 1001开头但排除100101
  • +10.20: 支持点号匹配(如10.20.001)

3. Tax Tags 引擎(仅适用于税务报表)

适用场景

  • 税务报表
  • 基于税务标签的查询
  • 增值税申报表等

核心概念

  • 查询凭证行的 tax_tag_ids 字段
  • 标签的 tax_negate 字段决定符号
  • 主要用于税务场景

示例

<!-- 税务报表示例 -->
<record id="tax_base" model="account.report.line">
<field name="expression_ids">
<record id="expr_base" model="account.report.expression">
<field name="engine">tax_tags</field>
<field name="formula">base</field>
</record>
</field>
</record>

<record id="tax_amount" model="account.report.line">
<field name="expression_ids">
<record id="expr_tax" model="account.report.expression">
<field name="engine">tax_tags</field>
<field name="formula">tax</field>
</record>
</field>
</record>

4. Aggregation 引擎(汇总计算)

适用场景

  • 汇总其他表达式的结果
  • 跨报表引用
  • 复杂的数学运算

核心概念

  • 对其他引擎的结果进行计算
  • 支持算术运算、函数调用
  • 可以跨报表引用数据

示例

<!-- 1. 计算净额 -->
<record id="net_amount_calc" model="account.report.line">
<field name="expression_ids">
<record id="expr_net" model="account.report.expression">
<field name="engine">aggregation</field>
<field name="formula">revenue.balance - expense.balance</field>
</record>
</field>
</record>

<!-- 2. 带阈值的计算 -->
<record id="with_threshold" model="account.report.line">
<field name="expression_ids">
<record id="expr_threshold" model="account.report.expression">
<field name="engine">aggregation</field>
<field name="formula">sales.balance</field>
<field name="subformula">if_above(USD(1000.0))</field>
</record>
</field>
</record>

<!-- 3. 跨报表引用 -->
<record id="cross_report" model="account.report.line">
<field name="expression_ids">
<record id="expr_cross" model="account.report.expression">
<field name="engine">aggregation</field>
<field name="formula">other_report.line_code.balance</field>
<field name="subformula">cross_report</field>
</record>
</field>
</record>

5. External 引擎(外部值)

适用场景

  • 手动输入的值
  • 外部系统导入的数据
  • 预算值等

示例

<record id="manual_value" model="account.report.line">
<field name="expression_ids">
<record id="expr_manual" model="account.report.expression">
<field name="engine">external</field>
<field name="formula">sum</field>
</record>
</field>
</record>

引擎对比与选择指南

需求场景推荐引擎正确用法
查询借方发生额domain[('debit', '>', 0)]
查询贷方发生额domain[('credit', '>', 0)]
查询科目余额account_codes+1001
过滤正余额科目account_codes+1001D
过滤负余额科目account_codes+1001C
税务报表tax_tagsbase、tax
汇总计算aggregationline1.balance + line2.balance
手动输入值externalsum、most_recent
复杂条件查询domain[('字段', '操作符', 值), ...]
科目编码范围account_codes+1001+1002+1003

关键误解澄清

误解正确理解
Account Codes的'D' = 借方发生额D = 余额为正的科目(过滤条件)
Account Codes查询的是期间数据Account Codes查询的是期末余额
所有引擎都能查询发生额只有domain引擎能精确查询发生额
Subformula可以随意使用不同引擎支持的subformula不同

实际应用建议

  1. 查询发生额:优先使用domain引擎,条件明确且准确
  2. 查询余额:使用account_codes引擎,公式简洁
  3. 税务场景:使用tax_tags引擎,专门优化
  4. 汇总计算:使用aggregation引擎,功能强大
  5. 手动数据:使用external引擎,简单直接

这样就能避免像"D参数取到余额而非发生额"这类误解,根据实际需求选择正确的引擎和语法。

Odoo 企业版会计报表引擎
张飞虎 2025年12月28日
标签
存档
Odoo19原生支持中国会计报表
资产负债表,损益表