近期有一个项目涉及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_tags | base、tax |
| 汇总计算 | aggregation | line1.balance + line2.balance |
| 手动输入值 | external | sum、most_recent |
| 复杂条件查询 | domain | [('字段', '操作符', 值), ...] |
| 科目编码范围 | account_codes | +1001+1002+1003 |
关键误解澄清
| 误解 | 正确理解 |
|---|---|
| Account Codes的'D' = 借方发生额 | D = 余额为正的科目(过滤条件) |
| Account Codes查询的是期间数据 | Account Codes查询的是期末余额 |
| 所有引擎都能查询发生额 | 只有domain引擎能精确查询发生额 |
| Subformula可以随意使用 | 不同引擎支持的subformula不同 |
实际应用建议
- 查询发生额:优先使用domain引擎,条件明确且准确
- 查询余额:使用account_codes引擎,公式简洁
- 税务场景:使用tax_tags引擎,专门优化
- 汇总计算:使用aggregation引擎,功能强大
- 手动数据:使用external引擎,简单直接
这样就能避免像"D参数取到余额而非发生额"这类误解,根据实际需求选择正确的引擎和语法。