会计引擎:凭证模板设计

3 评论 397 浏览 0 收藏 31 分钟

财务数字化转型的关键一步——会计引擎如何通过凭证模板实现自动化记账?本文深度解析从业务事件触发到凭证生成的全流程架构设计,揭秘采购付款、工资发放等核心场景的模板配置逻辑,带你看懂企业财务系统从手工操作到智能化的跃迁路径。

大家有没有遇到过这样的场景:

业务系统里一笔付款已经完成了,但财务还要手工登记凭证,搞到月底加班到深夜?

这其实是一个非常普遍的痛点。

传统企业的财务记账,依赖大量人工操作,不仅效率低,还容易出错。尤其是集团企业,每个月几万张凭证,靠人工来做,根本不现实。

会计引擎,解决的正是这个问题。

它的核心能力,就是让系统自动把业务事件翻译成财务凭证。而这个翻译规则,就写在我们今天要讲的凭证模板里。

今天我们的介绍分四个部分:产品介绍、产品架构、产品设计细节,以及最后一个真实的集团案例,详细内容如下图所示。

大概8000字左右,有空您就现在看看,忙着您就收藏起来回家路上看。

一、产品介绍

1.1 什么是凭证模板

我们先从最基础的概念讲起。

凭证模板,是会计引擎的配置核心。

简单说,它就是一套规则,专门用来描述:当某个业务事件发生的时候,该怎么记账。

举个例子:当采购付款申请被审批通过,会计引擎会自动生成一张凭证——借【应付账款】,贷【银行存款】。这背后的逻辑,就是凭证模板在发挥作用。

模板里面到底定义了什么?

我们把它拆成三个要素来理解:

第一个要素:业务事件

就是什么时候触发。比如付款申请确认、收货入库、工资发放、费用报销等,这些都是可以明确识别的业务动作。

第二个要素:科目规则

就是记到哪里。包括借贷方向、用哪个会计科目、有没有辅助核算维度,比如成本中心、项目、供应商这些。

第三个要素:金额计算。

就是记多少。这里可以直接取业务系统里的金额字段,也可以用公式去计算,比如含税金额里拆出税额,或者外币需要做汇率换算。

这三个要素组合在一起,就是一个完整的凭证模板。

一个模板对应一类业务事件,企业有多少种需要自动记账的业务,就配置多少个模板,合在一起构成企业的自动记账逻辑体系。

1.2 一张图讲清楚整个架构

产品逻辑图非常清晰,我带大家过一遍。

采购应付、销售应收、资金付款、HR薪资、费用报销、存货成本等各种业务系统,天天在产生业务数据。

这些数据进来之后,会流入会计引擎。引擎的关键能力叫做凭证模版匹配引擎,它会根据凭证模版库里配置的规则自动生成凭证。

生成出来的凭证是什么样的?

是标准化的借贷分录,支持多账套、多币种,然后自动推送到右边的总账系统。

整个流程一气呵成,不需要人工介入。

财务人员的工作,从手工记账变成了审核例外,工作模式完全不一样。

1.3 典型应用场景

我们来看四个最典型的应用场景,这也是大多数企业落地会计引擎最先跑通的四个场景。

场景一:采购付款

付款申请通过审批,触发模板,自动生成【借应付账款,贷银行存款】。

这个场景的复杂性在于:要处理税额拆分、多主体记账等问题。这也是今天案例部分会重点讲的场景。

场景二:工资发放

HR工资单审批完成,触发模板,自动生成【借应付薪资,贷银行存款/代扣款】。

这个场景的难点是薪资条目多、个税需要拆分,还要按成本中心归集。

场景三:费用报销

OA报销单审批通过,根据费用类型+部门+项目来匹配模板,自动摊生分录。

一张报销单里可能有出差费、交通费、餐饮费,对应不同科目,引擎一次性处理完。

场景四:跨境外汇

资金系统外汇付款完成,自动做汇率换算,生成外币分录,同时生成汇兑损益凭证。

这个场景在外贸企业、跨国集团里很常见。

大家可以看到,会计引擎覆盖的业务面是非常宽的,这四个场景是入门,真正做起来的企业,可能有几十上百个模板在同时运行。

二、产品架构

2.1 产品架构

我们现在看产品架构图,这张图分三个大层次:业务层、会计引擎层、总账报表层,下面还有一个基础数据层托底。

1、业务层

最上面是业务系统,包括采购、资金、HR、销售、费用、存货、OA等。这些系统通过事件的方式向会计引擎输送数据。

2、会计引擎层

这是整个架构的核心,分成四个模块。

第一个模块:事件接收层

负责接收业务系统传来的消息,支持消息队列和API两种方式。

收到消息之后,会做数据标准化、幂等校验、重复过滤,以及异常捕获。

第二个模块:模板匹配引擎

这是整个会计引擎的大脑。

它负责识别业务类型、按优先级排序规则、判断模板是否命中、处理多模板合并、过滤条件分录。

第三个模块:凭证生成器

负责把模板规则翻译成实际的借贷分录,包括金额计算、汇率换算、辅助核算赋值,以及最终的凭证格式校验。

第四个模块:凭证模版库

是配置管理的地方,负责模板的定义、版本控制、审批流管理、启用停用,以及模板继承逻辑。

3、总账报表层

凭证生成后,推送到总账系统,支撑科目余额表、财务报表、凭证查询和审计追踪。

4、基础数据层

最底层是支撑整个引擎运转的基础数据,包括会计科目档案、辅助核算维度、汇率币种,以及组织架构和账套配置等。

这个架构的设计思路是把规则配置和执行引擎分开,配置归财务,执行归系统,两边职责清晰,互不干扰。

2.2 从事件触发到凭证归档

凭证生成的全链路流程分七步:

1、业务事件触发

业务系统里的某个动作触发一条消息。

2、事件数据标准化

接收到原始消息后,引擎将其转化为标准格式,方便后续处理。

3、模板条件匹配

这是核心步骤,引擎用事件数据去对照凭证模板库里的触发条件,找到匹配的模板。

4、取数字段计算

根据模板里配置的金额规则,从业务数据里取出对应字段并计算金额。

5、借贷分录生成

按照模板的科目规则,生成完整的借贷分录。

6、合规校验借贷平衡

严格校验借贷是否平衡,不符合规则的凭证不允许入账。

7、推送总账系统、归档审计留痕

凭证经过校验后,推送总账,并记录操作日志,支持全程审计追踪。

大家重点关注一下模板匹配的决策流程图:

业务事件进来,读取业务类型,查看模板是否命中;

如果命中,执行模板规则,做借贷平衡校验,然后生成凭证;

如果没有命中,触发告警,通知财务配置员;

然后问是否需要人工补录,

如果需要,人工录入凭证;

如果不需要,说明当前场景没有模板覆盖,需要新建配置。

这个决策流程的设计有个很重要的点:系统不会静默失败。

只要没有匹配到模板,一定会触发告警,保证每一笔业务都有人知道、有人处理,不会漏账。

2.3 谁在用这个系统

这个系统一共有四类使用角色,各有分工,权责清晰。

1、财务配置员

是模板的建设者,负责创建、维护凭证模板,定义科目映射规则,设置触发条件。

他们是整个会计引擎规则体系的设计师。

2、财务审核员

负责审批模板变更申请,校验模板合规性,签发生效确认。

任何模板的上线或修改,都需要审核员把关,这是财务内控的关键环节。

3、业务操作员

在业务系统侧,他们的操作会触发凭证生成。

同时,当出现异常凭证时,他们负责确认处理,对于特殊业务也可以补录凭证。

4、系统管理员

负责账套配置、组织结构配置、用户权限管理,以及基础参数维护。

2.4 一目了然的权限设计

权限矩阵很好理解,我们快速过一遍。

1、模板新建/编辑

财务配置员可操作,财务审核员只读,业务操作员无权限,系统管理员有超级权限。

2、模板审批/生效

财务配置员只能查看,财务审核员可操作,业务操作员无权限,系统管理员超级权限。

3、模板停用/版本回退

财务配置员可申请,财务审核员审批,业务操作员无权限,系统管理员超级权限。

4、凭证手动触发

四个角色都有权限。但注意,这个是基于业务需要,实际使用会有业务系统的入口约束。

5、异常凭证处理

财务配置员和审核员都可以操作,业务操作员限于本人单据,系统管理员全权限。

6、科目档案维护

只有系统管理员可以做,其他角色全部无权限。

科目档案是财务基础数据的重中之重,不能随便改。

这个权限设计体现了一个核心原则:配置权和审批权分离,避免一个人又配又批,形成内控漏洞。

三、产品设计详解

这是本文内容最丰富的部分,我们会逐一拆解凭证模板的八个核心设计模块。大家做产品、做研发、做实施,这部分是最有实操价值的。

3.1 模板头信息设计

模板头信息,可以理解为一个模板的身份证。它记录了这个模板是谁、能干什么、当前什么状态。

我们来看几个关键字段:

1、template_code(模板编码)

全局唯一,建议按业务域分段命名,比如【PAY_AP_001】,一看就知道是支付模块的应付场景第1号模板。

这个命名规范很重要,模板多了以后如果编码混乱,维护起来会非常痛苦。

2、biz_type(业务大类)

比如 PAYMENT、RECEIPT、EXPENSE、SALARY、COST,这是第一层分类。

3、biz_sub_type(业务子类)

在大类里进一步细分,比如 AP_CLEARING 代表应付结清。

这样可以精细匹配,避免多个业务动作共用一个模板导致逻辑混乱。

4、org_scope(适用主体)

支持多公司配置。

如果是集团统一模板,可以配置为 ALL,自动适用所有主体。

5、priority(匹配优先级)

当多个模板同时满足条件时,引擎按这个字段排序,取最高优先级的模板。

这个字段在集团多主体场景里非常重要。

6、status(生命周期状态)

从草稿到生效,再到停用,整个生命周期都有明确状态管理。

3.2 触发条件与规则引擎

触发条件,决定哪些业务数据能命中这个模板。这是模板匹配的核心逻辑。

1、支持多条件组合

用 AND / OR 逻辑运算符构建复杂规则树。

我举个例子说明:

比如一个采购付款模板,触发条件可能是:业务类型是PAYMENT,付款方式是银行转账或批量付款,并且有发票。这就是一个AND+OR组合的规则树。

2、支持哪几种条件类型?

等值匹配:最常用,比如 biz_type = PAYMENT,payment_method = BANK_TRANSFER;

范围匹配:比如 amount >= 10000,大额付款走不同的模板;

集合匹配:比如 supplier_type IN [一般纳税人, 小规模纳税人];

布尔标记:比如 has_invoice = true,有发票走含税分录,没有发票走不含税;

正则匹配:比如 account_no LIKE 622%,匹配特定银行卡号前缀。

3、规则优先级机制

当多个模板同时满足条件时,引擎按 priority 字段从小到大排序,命中最高优先级的模板。

如果优先级相同,取 effective_date 最新的版本。

如果没有任何模板命中,触发告警通知财务配置员。

注:规则引擎的实现可以参考Drools或Easy Rules等开源框架,也可以自研JSON规则解析器,核心是支持任意层级的AND/OR嵌套,以及字段类型的灵活扩展。

3.3 科目映射规则

科目映射,决定每条分录行该借哪个科目、贷哪个科目。

科目有两种形式:

1、固定科目

科目编码在模板里写死,每次触发都用同一个科目。

适合科目不变的场景,比如应交税费、预付账款。

2、动态科目

科目末级根据业务字段动态生成。

比如配置 1002.{bank_code},运行时引擎会把 {bank_code} 替换为实际的银行代码,生成类似 1002.CMB_1234 这样的科目。

这个非常适合多银行账户、多主体场景。

示例:

设计要点:

动态科目字段必须在基础数据里有对应的科目档案,否则引擎会报错终止。

建议在模板保存时就做科目合法性校验,提前发现问题,而不是等到运行时才报错。

3.4 金额取数与计算

金额规则决定每条分录行记多少钱。

支持四种方式:

1、直取字段

直接引用业务数据里的金额字段,比如 payment.amount

这是最简单最直接的方式,大多数场景都能覆盖。

amount_rule: {“type”:”FIELD”,”field”:”payment.amount”}

2、公式计算

支持四则运算及内置函数。

比如从含税金额中拆出不含税额:amount / (1 + tax_rate)。

这在有增值税的采购付款场景里非常常见。

amount_rule: {“type”:”FORMULA”,”formula”:”amount / (1 + tax_rate)”// 从含税金额中拆分不含税额}

3、条件分支

类似 if-else 逻辑,根据条件返回不同字段。

比如:如果是外币,就取 amount × rate;否则取 amount。

amount_rule: {“type”:”CASE”,”cases”: [ {“when”:”currency=’USD'”,”then”:”amount*rate”}, {“else”:”amount”} ] }

4、汇率换算

外币金额自动换算为本位币。

汇率来源可以配置,可以用实时汇率、月初汇率,或者手工录入的特殊汇率。

amount_rule: {“type”:”FX_CONVERT”,”source_field”:”payment.fc_amount”,”source_currency”:”USD”,”rate_source”:”REAL_TIME”,”target_currency”:”CNY”}

如上图所示,以费用报销为例,分录行的金额来源是【费用明细.报销金额】这个字段。

配置完成后,一张费用报销单里有两条费用明细(500元广告费 + 100元公务费),系统会自动生成对应的4条分录行(借贷各2行),完整反映每笔费用的会计影响。

3.5 辅助核算维度

辅助核算,是会计科目的延伸信息。

打个比方:科目告诉你这笔钱记在哪个大桶里,辅助核算告诉你桶里的这笔钱到底是哪个客户的、哪个项目的、哪个部门花的。

辅助核算的赋值来源有三种:

1、映射业务字段

直接从业务数据取值,比如从付款单里取供应商ID,赋值给供应商维度。

2、固定常量

所有分录都赋相同的值,比如所有总部费用的成本中心都填总部。

3、计算逻辑

通过字段拼接或映射表转换,比如把部门代码转换成内部往来主体编码。

常见的辅助核算维度有哪些?

包括供应商、客户、员工、项目、合同、成本中心、部门、银行账号、资产、税种、地区、内部往来主体等。

这些维度设置好了,财务才能做精细化分析,比如:某个供应商的全年应付明细、某个项目的实际成本归集、某个部门的费用明细追踪。

实施建议:辅助核算维度要按科目设置【必填/选填】约束。比如应付账款科目,供应商维度必须填,否则后续对账根本没法做。

3.6 条件分录设计

条件分录,是凭证模板里比较高阶的功能,用来处理【不是每次都需要的分录行】。

核心思路是:

某些分录行只在特定条件成立时才生成。

这样,一个模板就能覆盖多种相似的业务变体,不需要为每种细小差异单独建一个模板。

举几个常见的应用场景:

1、含税vs不含税

有发票时,额外生成进项税额分录行(贷应交税费)

没有发票时,这行不生成。

2、本外币混合

外币付款时,额外生成汇兑损益行;

本币付款时不需要。

3、大额预警

当付款金额超过某个阈值时,额外生成风险准备金分录。

4、预付vs即付

预付款场景生成预付账款科目;非预付走应付账款。

5、内部往来

集团内部交易额外生成内部消抵分录,用于合并报表时的抵消。

还有一个很有意思的设计:损益方向的自动处理

当计算汇兑差额时,差额为正(损失)自动借记,差额为负(收益)自动贷记,引擎根据计算结果自动决定借贷方向,不需要配置两套模板。

这个设计大大降低了配置复杂度。

如上图所示,分录行有一列【分录筛选条件】,配置员可以在这里写条件表达式,比如 has_invoice = true。

3.7 版本控制与审批流

凭证模板直接影响财务数据的准确性,所以任何变更都必须经过严格的版本管理和审批流程。

版本管理有两个核心原则:

1、每次变更生成新版本,历史版本数据不可删除

2、新版本生效后,旧凭证仍然关联原版本

这一点对审计追溯非常重要,你能清楚地知道某张凭证是用哪个版本的模板生成的。

版本的生命周期是这样式的:

审批流如何配置?

1、一级审批

财务经理审核科目合理性和业务逻辑,这是保证模板正确性的第一道关;

2、二级审批(可选):

CFO或财务总监对高风险模板(跨境、大额)进行终审,这是高级内控要求;

3、紧急通道

支持配置快速审批路径,满足月末紧急调整需求,但需要记录紧急原因,留有审计痕迹;

4、自动比对

新旧版本差异自动高亮,审批人不需要逐字比对,大幅提升审批效率。

3.8 模板继承与复用

集团有总部和十几个子公司,会计规则大同小异,主要科目结构都一样,但某些子公司有特殊处理。

如果每个公司都单独建模板,维护量巨大,而且一旦总部统一规则调整,十几个子公司都要改。

模板继承机制解决这个问题

子公司模板继承集团母模板,只配置差异项,其余全部沿用。

继承规则是这样的:

子模板默认继承父模板的全部分录行、科目规则、金额规则。

子模板可以新增分录行、覆盖特定分录行的科目或金额规则、缩小触发条件范围(只能更窄,不能更宽,防止子公司越权)。

当父模板变更时,子模板可以选择跟随更新或保持当前版本。

除了继承,还有另外两种复用方式,

1、复制另建

差异较大时,直接复制一个现有模板来改。

优点是完全独立,修改互不影响;

缺点是版本容易失控,维护分散。

2、参数化模板

规则相同、只是参数不同的场景,用一个模板来适配多种场景。

优点是一个模板搞定多场景;

缺点是配置复杂度比较高。

三种方式各有适用场景,选哪种取决于业务差异的大小和维护团队的能力。

四、案例分析

4.1 某集团采购付款场景

现在我们来看一个完整的真实案例,把前面讲的东西串起来。

业务背景:

这家集团公司,供应商开具13%的增值税专用发票,付款金额是含税的。

资金系统确认付款之后,会触发会计引擎,引擎需要自动拆分税额,生成三行分录。

这个场景的难点在于:

不能直接用付款总金额去记账,要把含税金额拆成不含税金额和税额两部分,分别记到不同的科目。

模板是怎么配置的?

1、触发条件

biz_type = PAYMENT AND has_invoice = true AND tax_rate = 0.13。

这三个条件组合起来,精确命中有13%专票的付款场景。

2、分录行1(借方)

科目是应付账款-贸易,固定科目。

辅助核算记供应商。

金额取payment.amount,也就是含税金额113,000 元。

3、分录行2(贷方)

科目是银行存款,动态科目,1002.{bank_code},运行时读取payment.bank_code,比如招行账号,生成1002.招行1234。

金额公式是amount / (1 + tax_rate),算出不含税金额 100,000 元。

4、分录行3(条件行,贷方)

科目是应交税费-进项税额。

这是条件分录,仅当has_invoice = true 时生效。

金额公式是amount / (1 + tax_rate) × tax_rate,算出税额 13,000 元。

实际生成的凭证长这样:

借贷平衡,完美。

可参考下图进行模板配置和模拟预览。

通过凭证模拟预览,配置员在保存之前就能看到凭证的预期结果,大大降低了配置出错的概率。

这家集团每月有约8,000张付款单,全部实现100%自动记账,财务人员从繁琐的手工录入中解放出来,专注于审核例外情况。月结时间从5天缩短至1天,效果也是杠杠的。

总结

好了,看了一堆公式,真的是辛苦大家了。

该忘就忘,用的时候记得来哪里找就够了。

PS:我今天用AI画原型,调细节的时候,光跟AI生气了。真的是模型的思维结构也重要、底座也重要。这条人和AI共生的路,且有的走呢

本文由人人都是产品经理作者【敏尔说】,微信公众号:【敏尔说】,原创/授权 发布于人人都是产品经理,未经许可,禁止转载。

题图来自Unsplash,基于 CC0 协议。

更多精彩内容,请关注人人都是产品经理微信公众号或下载App
评论
评论请登录
  1. 模板匹配优先级和版本生效时间如果冲突,比如新旧版本交替期,系统怎么保证连续性?文中说取最新版本,但业务事件跨日期边界时会不会出现科目不一致?

    来自广东 回复
  2. 条件分录和动态科目的设计很实用,能用一个模板覆盖多种变体。如果辅助核算维度能通过映射表自动匹配,配置效率会更高,减少重复劳动。

    来自广东 回复
  3. 凭证模板的思路确实高效,但模板配置的复杂度往往被低估。集团几百个模板跑起来后,维护成本和版本管理挑战可能比新建还大。不过这个架构留了告警和审批流,算是先想了一步。

    来自广东 回复