ERPNext 自定义中国财务报表:为什么自定义模版不显示数据?
很多企业在做 ERPNext 中国化财务时,最容易遇到一个问题:
为什么标准资产负债表有数据, 但自己新建的 Financial Report Template(自定义财务报表模版)却全部是 0?
为什么有些利润被重复计算? 为什么一定要设置 Account Category(账户类别)?
今天用最通俗的方式,把 ERPNext 自定义财务报表的底层取数逻辑讲透。
一、先说结论:只有“自定义报表模版”强依赖 Account Category
这是最关键的一句话:
标准报表很多时候可以直接通过:
- root_type
- account_type
- report_type
自动取数。
所以即使没有设置 Account Category, 标准资产负债表、利润表也可能正常显示。
但是:
只要你自己新建了 Financial Report Template(自定义财务报表模版), 数据是否显示,核心就取决于:
Account Category(账户类别)
也就是说:
自定义模版不显示数据,90% 都是因为末级科目没有设置正确的 Account Category。
这是 ERPNext 中国化最容易踩坑的地方。
二、为什么自定义模版必须设置 Account Category?
ERPNext 自定义财务报表模板,本质逻辑是:
Financial Report Template → Report Line Item → Formula or Account Filter → 找符合条件的末级科目 → 汇总余额或发生额
其中最核心的过滤字段就是:
Account Category
所以模板里如果某一行写的是:
Trade Payables
系统就会去找所有:
Account Category = Trade Payables
的末级科目。
如果一个都没找到, 这一行就是 0。
所以你会看到:
标准报表正常, 自定义模版全部不显示。
根本原因不是模板坏了, 而是:
模板能找到的标签为空。
三、三层结构:为什么报表不是直接从科目取数?
ERPNext 财务报表不是“看到科目就直接显示”,而是通过三层映射结构完成。
凭证/业务单据 ↓ Account(会计科目) ↓ Account Category(账户类别) ↓ Financial Report Template(财务报表模版) ↓ 资产负债表 / 利润表 / 现金流量表
可以理解成:
- 科目 = 原始财务数据
- 账户类别 = 给科目贴标签
- 自定义报表模板 = 根据标签抓数据
所以:
自定义模板不是找科目名称,而是找 Account Category 标签。
四、核心规则:只有末级科目才需要设置
必须满足:
Is Group = 0(不是分组科目)
因为报表引擎只汇总:
实际发生业务的末级科目
例如:
应付账款(组) ├─ A供应商 ├─ B供应商 └─ C供应商
只需要给:
- A供应商
- B供应商
- C供应商
设置:
Trade Payables
父级“应付账款”不用设置。
五、类别名称必须和模板完全一致
例如自定义资产负债表模板某一行写的是:
Trade Payables
那么科目的 Account Category 也必须写:
Trade Payables
必须一字不差。
否则模板这一行一定是 0。
六、为什么“本年利润”不要设置 Category?
这是中国企业最容易踩坑的地方。
很多客户习惯把“本年利润”设置成:
Reserves and Surplus
这是错误的。
原因是:
自定义资产负债表模板通常会有一行:
Current Profit / Loss
这一行很多时候直接按:
root_type in [“Income”, “Expense”]
自动汇总所有收入类和费用类末级科目的本期净额。
也就是说:
ERPNext 已经自动算了一遍当期利润。
如果再给“本年利润”设置权益类别, 就会导致:
- 收入费用自动算一次
- 权益类科目再算一次
最终出现:
- 利润重复
- 资产负债表不平
正确做法:
本年利润科目不要设置 Account Category。
七、中国财务最常用 Account Category 映射
资产类
| 中国科目 | Account Category |
|---|---|
| 库存现金、银行存款 | Cash and Cash Equivalents |
| 应收账款 | Trade Receivables |
| 其他应收款 | Other Receivables |
| 预付账款 | Other Current Assets |
| 存货 | Stock Assets |
| 固定资产 | Tangible Assets |
| 无形资产 | Intangible Assets |
负债类
| 中国科目 | Account Category |
|---|---|
| 应付账款 | Trade Payables |
| 短期借款 | Short-term Borrowings |
| 应交税费 | Current Tax Liabilities |
| 其他应付款 | Other Payables |
| 长期借款 | Long-term Borrowings |
| 租赁负债 | Other Non-current Liabilities |
所有者权益
| 中国科目 | Account Category |
|---|---|
| 实收资本 | Share Capital |
| 盈余公积、未分配利润 | Reserves and Surplus |
八、最通俗理解:为什么标准报表有,自定义模版没有?
因为:
标准报表很多内置了:
- Root Type
- Account Type
- 内部逻辑规则
即使不贴标签也可能出数。
但自定义报表模版是你自己定义的:
“按什么标签取什么数据”
所以:
模板写得越灵活,越依赖科目标签完整性。
这也是为什么很多客户说:
标准报表正常, 复制一个中国资产负债表模板后全部是 0。
根本原因就是:
末级科目的 Account Category 没有完成中国化映射。
九、中国企业做 ERPNext 财务中国化最重要的实施经验
ERPNext 标准报表可以靠系统默认规则出数, 但自定义中国财务报表模版一定依赖:
科目标签(Account Category) + 模板规则
所以中国化报表的核心不是改代码, 而是先把:
末级科目 → Account Category 映射关系
设计正确。
最关键三条规则:
规则1:只给末级科目贴标签
组科目不要贴。
规则2:本年利润不要贴权益标签
避免利润重复。
规则3:标准报表正常,自定义模版没数据,先查标签
90% 问题都在这里。