一家海外日化厂的老板第一次来找我们,说起他那套记账表:流水类型选了支出,分类却选了收款,自己「不太会制约这些」。
我们把他在用的多维表格和原来的 Excel 都做了一遍体检,最扎眼的是两处:
- 两百多条流水里,有四十多条「手选的收支类型」和「分类自带的方向」互相矛盾。
- 进货表里,一百来条进货行和十几条纯付款行混在一起,货和钱挤在同一张表上,余额靠手工一行行往下滚,插一行、删一行,后面的余额全错。
那四十多条里,真记错的其实只有几笔,大多是分类被当成了暂存筐。可麻烦恰恰在这里:两处都能填,就没人说得清哪一处算数。
为什么总对不上
台账算不清,根源几乎都是同一件事:同一个值有两个来源。 库存既有人手填、又有公式在算;余额既是一个字段、又本该是流水的求和;收支方向既写在类型里、又藏在分类里。两个来源之间没有任何东西逼它们一致,这个人改了这边,那个人改了那边,报表取哪一边,全看当初是谁建的表。两张报表打起架来,谁也说不出哪张是对的。
手工滚动的余额是最典型的一种。每一行的余额都依赖上一行,它其实是一个被「存下来」的求和。存下来的东西就会过期:中间动一行,后面每一行都跟着错,而且没有任何提示。
所以我们的判据只有一句:能算出来的,就不许填。 每个值只准有一个源头,其余地方一律引用或计算。反过来,成交那一刻的单价、汇率这类「当时的事实」,要在成交时就存成死值,事后不能再算。
三条铁律,外加一张字典
- 库存永不手填。 当前库存 = 期初 + 入库汇总 − 出库汇总,由出入库记录实时算出,重算多少遍都是同一个结果,不存在「这笔扣过没有」的问题。
- 没付款的入库,不进资金流水。 货进了仓、钱没动,这时形成的是应付,不能碰账户余额。这正是那家日化厂最理不清的一环。
- 一笔付款只挂一张入库单。 分几次付,就录几条流水,各挂各的单。收付款只记在资金流水这一个地方,采购单上不另填「已付」;一笔钱同时挂两张单,两张单都会把它算成已付全额。
收支方向用的是同一个思路:收支分类做成一张字典,每个分类自带收或支的属性,一笔流水是收是支由分类带出,不再让人另选。员工只回答「这笔钱是什么」,方向交给系统,填反在结构上就不可能发生。
改了规矩,旧账也不能硬改:那四十多条我们没有拿分类去覆盖,而是按当初手选的方向挂进字典里专门留出的「待确认」分类,交给客户逐条认。为什么不让程序自动改,另一篇《花钱担责的事,AI 只能出建议》讲过。
换个行业,还是这个病
一家做充值业务的公司,账户余额要在各部门之间领出、充值、消耗、归还,客户主动列出的卡点之一,就是余额跨部门结转。余额要是做成一个字段,每个部门手里都攥着一个自己的数,转一次手就得两边同时改对,漏改一边,两个数看上去都像真的。
我们的方案是余额不做字段,只做流水求和,再配一条守恒校验:领出余额 + 期间充值 − 本轮消耗 = 归还余额。余额只是算出来的结果,领出、充值、消耗每一笔都留在流水里;等式对不上,就说明中间有一笔没记对。
搬完数据,要对到金额
规矩立好,还剩最后一道关:历史数据搬进来之后,必须做金额级对账。搬的时候旧表被拆开重排——进货行按日期和主体并成入库单,货和钱分进两条线——新旧行数本来就对不上,少一条也数不出来;只有把金额加总,差一分都会露出来。
那家日化厂就是这样。我们第一版迁移用的过滤条件,把一条「金额列空、付款列有值」的现购行静默丢掉了,是金额对账出了差额才暴露出来的,一次典型的静默过滤。补回来之后,库存 602 个物料逐个对上、采购总额与原表一分不差,才算搬完。
一个数只要有两个地方能填,迟早会有两个答案。
