发票识别与自动入账,按模板情况分三种做法

发票OCR识别自动入账这件事,卡点多半不在识别本身,而在查验的时间窗口、票与账的挂接和异常票的处置口径。本文按发票处理的三个层次展开,对比模板固定、多模板、版式混乱三种情况,讲清查验与入账怎么衔接、重复票和金额对不上的票怎么分流、人工复核比例怎么定。文中不给具体识别率数值,配置取值需按各自的票面格式和账务口径核对。

分类 项目案例 · 作者 灵动RPA

月末摊在桌上的那摞发票

发票自动入账的三个层次结构图。第一层发票信息提取提取票面字段,卡在明细行税率与合计自洽校验。第二层增值税发票自动查验查真伪与状态,卡在销方未上传需次日重查以及红字票作废票复用号码。第三层入账把字段变成分录,卡在一票多明细需拆科目以及影像必须与分录同条落库。底部按模板固定、多模板、版式混乱三种情况给出不同做法。
三层各有各的卡点,识别只占中间一小段,底部是三种模板情况各自的做法

每到月末,财务会把收到的发票摊在桌上,按供应商分成几堆,再一张一张对着合同和订单填进系统。一摞票填完通常要花掉小半天,眼睛还累。

OCR 早就不新鲜了。但很多团队说发票OCR识别自动入账试了半年没成,卡的地方往往不在识别,在后面两段。

发票处理的三个层次

把这件事分成三层看,能少走不少弯路。三层难度递减,卡点也完全不同。

第一层是发票信息提取。把票面上的字段读出来,包括抬头、纳税人识别号、金额、税额、价税合计、开票日期、发票号码、校验码。这一层只管读得准不准,跟账务系统还没有关系。

第二层是查验。增值税发票自动查验查的是票的真伪和当前状态。票面数字对得上,不代表这张票真的开出去了。

第三层是入账。字段变成借贷分录,落到总账或者应付账款。这一层最麻烦,因为它要回答三个问题,记到哪个科目、记进哪一期、跟哪张单据挂上。

多数项目死在第一层和第三层的衔接上。识别率再高,只要有一张票进不了账,这一批就得整体回退人工。

模板固定时的做法

动手之前先判断手上的票属于哪一种。三种情况,做法差别很大。

模板固定指来源单一。比如某一家供应商长期按自己的格式开票,或者你只处理某几个客户的专票。这种情况下不要走通用识别引擎,用固定坐标取值更稳。

做法是把票面切成几个区域,每个区域定一套取值规则。常见的是右上角放发票号码和开票日期,中间是购买方信息,下方是货物明细。每张票按同样的坐标切,取完再做一次格式校验。

这条路的稳定度通常比通用引擎好,因为取值范围被框死了,不会被相邻文字带偏。它不擅长的地方也很明确,换一家供应商就要重配一遍。

配固定模板之前先问一句,这个来源未来一年会不会变。会变就要在排期里留出适配的时间预算,不会变就放心用。

多模板下的字段抽取

来源一多,固定坐标就不划算了。这时候换成按字段名定位加版式规则。

发票信息提取在这一层主要做三件事。

  • 字段定位。找票面上的「发票号码」「开票日期」这些标签,取它旁边的值。比纯坐标灵活,票面稍微挪位也不怕。
  • 版式分类。增值税专票、增值税普票、电子普通发票、全电发票,版式各不相同。分类之后各走各的抽取规则,比混在一起抽准得多。
  • 明细行处理。金额、税率、税额常常是算出来的,不是印出来的。有的票印了,有的票不印。不印的要用不含税金额乘税率反算,还要按票面的小数位处理尾差。

最容易翻车的是明细行。一张票十几行货,只要某一行的税率识别成了另一个值,整张票的合计就对不上。所以明细行必须做一次自洽校验,税额对不上就退回上一层重抽,别带着疑问往下走。

抽取完还有一道很便宜的校验。从票面读到的价税合计,和明细逐行累加出来的金额,两边必须相等。不相等就整张进人工。这道校验挡住的是最常见的一批低级错误。

查验与入账的衔接

查验通过不等于可以入账。这里有两个卡点,都在衔接处。

第一个卡点是时间。票开出来了,销方不一定已经上传到税务系统。查验接口这时会返回查无此票。这时候直接判失败重试,很容易在同一天反复打接口。更稳的做法是给查验设一个宽限期,当天查不到的票挂到第二天再查一次。

第二个卡点是重复。同一张票可能在附件目录里存了两遍,也可能上个月已经入过账,这个月又传进来。发票号码加开票日期可以做唯一键,但要注意红字发票和作废票会复用号码,所以唯一键要带上发票类型和正负号。

入账这一步最容易漏的是凭证附件的挂接。很多流程把字段写进系统就算完事,票的影像没挂上去,审计的时候要翻三个月的凭证才能找到一张票。影像和分录必须在同一条记录里落下去,要么都成功,要么都回滚。

还有个现实约束。会计科目不是识别引擎能定的。一张开有多个货物明细的专票,可能要拆成两条分录,一条进管理费用,一条进应交税费。这部分规则的复杂度往往高于识别本身,上线前先把科目映射表列出来,别等联调时才发现。

异常票怎么处理

先定一个原则。识别不确定的票,一律走人工,不要猜。账上猜错一个数字,可能几个月后才发现,纠正成本远高于当场多看两眼。

常见的异常分这么几类,每一类要分开处置。

  • 票面本身有问题。打印歪了、被水泡了、折痕穿过金额栏、章盖在数字上。这类直接走人工,或者退回去让对方重开。
  • 票面完整但校验不过。比如税率不是合法值,纳税人识别号位数不对。这属于源数据问题,流程里要给出具体提示,别只写一句识别失败,让人无从下手。
  • 重复票。唯一键命中,说明已经入过账。处理有三种,退回、当作冲红、标记为待人工确认。选哪种取决于你们对重复票的容忍度,倾向保守就把三种都推人工。
  • 金额对不上的票。明细累加和合计不等,或者价税合计和不含税金额加税额不等。这类单独一类处置,它的成因往往在上游,重新抽一次大概率还是错。

这几类票需要一个统一的出口。人可以改字段、改科目、整张退回,但每次改动都要留下原因。原因是后面算复核比例的依据,没有原因就只能靠猜。

人工复核比例怎么定

这是上线之后每周都要看的一个数。

刚上线时比例会很高,头几周几乎所有票都过一遍眼睛。等模板和规则稳定下来,它应该往下走。

如果它不往下走,问题通常在这几处。

  • 模板规则一直被手工修正,说明规则本身没写对。
  • 同一个供应商反复进人工,说明它值得单独配一套模板。
  • 比例看着降了,但金额大的票都在人工、金额小的都在自动,这种降法没有意义,要按金额加权看。

务实的做法是分档。低价值的票全自动,比如金额低于某个数、且供应商本来就自动收票的这类。中间的票走自动抽取加抽样复核。超过阈值的一律全审。

阈值不要一次定死。先按头两周的实际票面金额分布看一眼再定。定低了,大量小票会占满人工时间。定高了,风险落在账上。

最后提一个务实的做法。上线之前留一个抽样窗口,业务侧不知道系统的结论,自己人肉做一遍,然后和系统的结果比对。这个窗口花人力,但它能回答唯一要紧的问题,系统有没有漏票。

收尾

发票这件事,容易被想成一个识别问题,做下来发现它是个流程问题。识别只占中间一小段。异常怎么处置、票和账怎么挂上、复核比例怎么往下压,才是决定它能不能用三年的部分。

要动手的话先做一件事。挑出最近一个月收到的票,按来源数一下有几种格式。只有一种,就按固定模板做,最省事。超过五六种,先花时间做版式分类,再谈准确率。