首页 > 代码库 > 从单式记账到复式记账

从单式记账到复式记账

近日被老婆问及,为什么放着大把的记账 app 不用,要用 Ledger CLI 这么奇葩的东西来记账?其实,这个问题从本质上可以变成:为什么要用复式记账?于是,我用了几个简单的例子向老婆做了解释,顺道在此记录一下。

本文不从专业的会计角度,而是通过生活中记账的实际需求出发,来阐明复式记账的含义及优点。不求全面专业,但求简明易懂。

从单式记账开始

我们记账的目的之一是追踪资产的变动。所以一般的流水账(单式记账)都是从资产的角度出发的。比如,11 月 18 日我在超市买了一盒巧克力,花了 30 元,刷的超市卡。那么,可以记录如下:

日期备注超市卡
 期初余额200
11.18超市买巧克力-30
 结余170

同理,我们也可以为现金、银行卡等资产建立相应的账户,以方便我们随时了解资产状况,查询支出。比如第二天我又去超市买了一块香皂,花了 5 元,付的现金。那么,我们可以在原来的表格上加上一笔记录:

日期备注超市卡现金
 期初余额200100
11.18超市买巧克力-30 
 结余170 
11.19超市买香皂 -5
 结余 95

像这样的流水账方式在记录上一点问题也没有,但当我们需要统计支出的时候就麻烦了。比如,我希望知道这个月我在“食品”上花了多少钱,我要一条条去找记录,把用在食品上的钱拎出来加总,记录少倒还好,一旦记录多了不仅费时费力而且容易遗漏。不过,办法也是有的,就像众多的记账 app 所做的那样,加一栏支出类别。于是,上面的表格可以变成这样(为了方便整月统计,暂且去掉结余行):

日期备注支出类别超市卡现金
 期初余额 200100
11.18超市买巧克力食品-30 
11.19超市买香皂生活用品 -5

这样我们统计支出的时候相对来说就方便了点,只要把相同的类别相加即可。但如果有许多条记录,而且无序穿插着各种类别,若不借助电子表格的自动筛选功能,依然是十分低效的。要知道,几百年前可没有电脑,前人可就是用表格形式记在纸上的!要在几百条记录中筛选出相同的类目进行统计,这显然并非最佳方案。于是,前人再次用智慧改进了记录方式。

把支出做成账户

既然资产账户可以做为一列,为什么支出不能做为一列呢?

日期备注超市卡现金食品生活用品
 期初余额200100  
11.18超市买巧克力-30 30 
11.19超市买香皂 -5 5

把表格弄成这样是不是方便多了呢?我要统计某一类别的支出,直接在该列上竖向加总就行了,根本不用一条一条去筛选了!这办法真是妙啊!

没错!这就是传说中的复式记账!它的特点就是,凡事皆账户(会计专业术语里叫会计科目),有增必有减,且增减金额相等。

形象一点可以理解成,钱从一个账户跑到了另一个账户,钱总是在账户之间跑来跑去。比如买巧克力就是有 30 元钱从超市卡跑到了食品,买香皂就是 5 元钱从现金跑到了生活用品。

想不到对表格做这样的一个改进就让我们从单式记账跨越到了复式记账,真的是太神奇了!

那么,一笔收入该如何记录呢?聪明!增加一列收入呀!任何想要统计的类目都把它列成一列就可以了。

你可能会觉得,这样子不是每次都得记两次吗?明明只花了一个 30 元,却要填两次金额,多麻烦!反正借助电子表格或记账 app 可以很方便地将相同类别的支出筛选出来,还是用回原来的方法好了。这么想也对,但遇到下面这种情况,单式记账就不好处理了。

合并支付的问题

举个例子,11 月 20 日我去超市同时买了一块蛋糕和一支牙膏,共花 18 元,其中蛋糕 10 元,牙膏 8 元,一并刷的超市卡。这种情况用流水账该怎么记?我相信这是绝大多数记账 app 用户经常会遇到的问题。如果分开记,那么超市卡的消费记录和实际不符,对账时会造成干扰;如果一并记,那这 18 元的支出应该归到哪个类别?而采用复式记账就能完美处理这种情况,我可以这样记:

日期备注超市卡现金食品生活用品
 期初余额200100  
11.18超市买巧克力-30 30 
11.19超市买香皂 -5 5
11.20超市买蛋糕和牙膏-18 108

这样,既能如实记录超市卡的资金变动,又可以分别统计支出类别。

对!在复式记账里,一笔交易可以涉及多个账户的变动(确切来说必须不少于两个),只要增加和减少的总额为零即可。

如何开始记录

不知道你怎么想,反正仅合并支付这一项就让我坚定不移地走上了复式记账的不归路。如果你也打算这么干,那需要注意的是,在开始记录的时候,不能直接填入期初余额,因为在第二部分说过,复式记账有增必有减,钱是从一个账户转移到另一个账户,不会凭空增加和消失。即便是期初余额,也要有一个来源,这就需要引入一个特殊账户 Equity。一般情况下,它只在开始记账的时候用到一次,用来分配各个账户的期初余额。所以,上面的表格正确应该是这样:

日期备注Equity超市卡现金食品生活用品
 期初余额-300200100  
11.18超市买巧克力 -30 30 
11.19超市买香皂  -5 5
11.20超市买蛋糕和牙膏 -18 108

复式记账里的每一行都要确保有增必有减,且增减金额相等。每一行所有数字相加的和都是零,如果哪一行不是,那就是账不平,就是有错误。

理论上,我们可以根据自身统计需要设置许多账户,比如吃、穿、玩、工资、外快等,然后一列一列地列出来。但是为了避免把自己搞晕,我们还是老老实实地根据会计规则把账户分成 5 大类,即资产、负债、收入、支出和 Equity。然后再根据需要设置子账户。

另外,复式记账的记法有两种,一种是正负记账法,一种是借贷记账法。正负记账法就像本文的例子一样,哪里增加了哪里就减少了,比较好理解。不过,这种方法会让负债的增加和收入的增加显示为负值,一开始可能会不习惯。这种方法 5 大基本账户之间满足 资产 + 负债 + 收入 + 支出 + Equity = 0 这样的等式关系,就是刚才说的每一行数字相加都是零。而如果是借贷记账法,它们之间的关系则是 资产 - 负债 = 收入 - 支出 + Equity

复式记账名字听着挺专业,其实把原理弄明白了,也就是那么回事儿。最后强烈建议进一步阅读这篇极具启发性的文章 Tutorial on multiple currency accounting。

就说到这,我要记账去了。

从单式记账到复式记账