- 输入数据
- 各主体试算表、科目映射、内部交易明细
- 核心方法
- 科目映射 + 内部往来双边匹配
- 输出物
- 合并底稿、抵消分录、对不平清单
内部往来核对与抵消
工作流文件名:FA11_consolidation
20 个步骤 · 20 条连接 · 20 条判定规则 · 由规格自动渲染,确认后再生成工作流
这个模型解决什么
几十家子公司报表口径不一,同一笔内部交易两边记的科目和金额都对不上,合并前光是核对往来就要几天。
归集和核对是合并报表里最耗时、也最容易出错的部分,而且每期都要重做一遍。把科目映射和往来配对固定下来之后,每期跑一遍几分钟出差异清单,财务只处理真正有问题的那几笔,剩下的对平项可以直接生成抵消依据。
适用场景
- 月度或季度合并前的往来核对:先把对不平的找出来,通知双方调账
- 科目口径体检:找出各主体用了集团科目表里没有对应关系的本地科目
- 审计底稿:内部交易抵消的依据与差异说明
口径假设
- 差额绝对值不超过 1,000 元视为对平,可直接抵消
- 科目对应关系为应收对应付、收入对成本
- 一方完全没有入账的列为单边挂账,不自动抵消
- 同一对主体同一科目组合按期间汇总后比较,不逐笔匹配
适用边界
- 不做会计准则意义上的合并:股权抵消、少数股东权益、商誉、外币折算都不在范围内
- 不生成抵消分录,只输出可抵消金额与差异清单
- 不处理跨期差异(本期确认、对方下期确认)的自动跨期匹配
- 多层持股结构下的逐级合并需另行设计
数据来源
report_data.csv
读取各主体报表数据
主体编码期间本地科目本地科目名称往来主体金额备注account_mapping.csv
读取科目映射表
主体编码本地科目本地科目名称集团科目集团科目名称entities.csv
读取合并范围主体
主体编码主体名称记账本位币合并范围处理步骤
取数
判定
关联与汇总
输出
-
1. CSV读取器
读取各主体报表数据
上游:—
- 文件:report_data.csv
-
2. CSV读取器
读取科目映射表
上游:—
- 文件:account_mapping.csv
-
3. CSV读取器
读取合并范围主体
上游:—
- 文件:entities.csv
-
10. 表关联
归集:映射到集团科目
上游:1、2
- 左表关联列:主体编码、本地科目
- 右表关联列:主体编码、本地科目
- 排除列:本地科目名称
-
11. 表关联
找出没有映射关系的科目
上游:1、2
- 只要未匹配的行(反连接)
- 保留左表未匹配行
- 左表关联列:主体编码、本地科目
- 右表关联列:主体编码、本地科目
-
12. 规则引擎
标记口径问题
上游:11
- 新增列:问题类型
- 规则:TRUE => "本地科目未配置集团科目映射"
-
13. CSV写入器
写出未映射科目清单
上游:12
- 文件:result_unmapped.csv
-
20. 基于规则的行过滤器
只留内部往来
上游:10
- 规则:MISSING $往来主体$ => FALSE
- 规则:TRUE => TRUE
-
21. 分组聚合
按主体+科目+往来对象汇总
上游:20
- 分组列:主体编码、集团科目、往来主体
- 聚合列:金额
-
22. 规则引擎
确定对方应记科目
上游:40
- 新增列:对方科目
- 规则:$集团科目$ = 1122 => "2202"
- 规则:$集团科目$ = 2202 => "1122"
- 规则:$集团科目$ = 6001 => "6401"
- 规则:$集团科目$ = 6401 => "6001"
- 规则:TRUE => "无对应"
-
23. 表关联
与对方账面两两配对
上游:22、40
- 保留左表未匹配行
- 左表关联列:主体编码、往来主体、对方科目
- 右表关联列:往来主体、主体编码、科目键
-
24. 数学公式
计算双方差额
上游:23
- 表达式:$Sum(金额)$ – $Sum(金额) (对方)$
- 新增列:差额
-
25. 规则引擎
判定核对状态
上游:24
- 新增列:核对状态
- 规则:MISSING $差额$ => "单边挂账:对方未入账"
- 规则:$差额$ <= 1000 AND $差额$ >= -1000 => "对平:可抵消"
- 规则:TRUE => "差额待核"
-
26. 规则引擎
风险等级
上游:25
- 新增列:风险等级
- 规则:$核对状态$ = "单边挂账:对方未入账" => "高"
- 规则:$核对状态$ = "差额待核" => "中"
- 规则:TRUE => "低"
-
27. 基于规则的行过滤器
每对只保留一行
上游:26
- 规则:MISSING $差额$ => TRUE
- 规则:$主体编码$ < $往来主体$ => TRUE
- 规则:TRUE => FALSE
-
28. 数学公式
可抵消金额取两者较小值
上游:27
- 表达式:if($Sum(金额)$ < $Sum(金额) (对方)$, $Sum(金额)$, $Sum(金额) (对方)$)
- 新增列:可抵消金额
-
29. 规则引擎
排序键
上游:28
- 新增列:排序键
- 规则:$核对状态$ = "单边挂账:对方未入账" => 1
- 规则:$核对状态$ = "差额待核" => 2
- 规则:TRUE => 3
-
30. 排序器
按状态与主体排序
上游:29
- 排序列:排序键、主体编码
-
31. CSV写入器
写出往来核对结果
上游:30
- 文件:result.csv
-
40. 字符串处理
集团科目转文本作关联键
上游:21
- 表达式:string($集团科目$)
- 新增列:科目键
判定规则汇总
| 节点 | 所在步骤 | 规则 |
|---|---|---|
| 12 | 标记口径问题 | TRUE => "本地科目未配置集团科目映射" |
| 20 | 只留内部往来 | MISSING $往来主体$ => FALSE |
| 20 | 只留内部往来 | TRUE => TRUE |
| 22 | 确定对方应记科目 | $集团科目$ = 1122 => "2202" |
| 22 | 确定对方应记科目 | $集团科目$ = 2202 => "1122" |
| 22 | 确定对方应记科目 | $集团科目$ = 6001 => "6401" |
| 22 | 确定对方应记科目 | $集团科目$ = 6401 => "6001" |
| 22 | 确定对方应记科目 | TRUE => "无对应" |
| 25 | 判定核对状态 | MISSING $差额$ => "单边挂账:对方未入账" |
| 25 | 判定核对状态 | $差额$ <= 1000 AND $差额$ >= -1000 => "对平:可抵消" |
| 25 | 判定核对状态 | TRUE => "差额待核" |
| 26 | 风险等级 | $核对状态$ = "单边挂账:对方未入账" => "高" |
| 26 | 风险等级 | $核对状态$ = "差额待核" => "中" |
| 26 | 风险等级 | TRUE => "低" |
| 27 | 每对只保留一行 | MISSING $差额$ => TRUE |
| 27 | 每对只保留一行 | $主体编码$ < $往来主体$ => TRUE |
| 27 | 每对只保留一行 | TRUE => FALSE |
| 29 | 排序键 | $核对状态$ = "单边挂账:对方未入账" => 1 |
| 29 | 排序键 | $核对状态$ = "差额待核" => 2 |
| 29 | 排序键 | TRUE => 3 |
期望结果
示例数据下应得到 7 行,按「主体A」分布如下。运行后与 expected_result.csv 逐行比对。
2C03
2C01
1C05
1C02
1C04