Beancount系列文章的前四篇已经基本覆盖了常用的复式记账方法。记账本身是一门经验的学问,不仅包括账本身怎么记,还包括了「账本」怎么整理。这篇文章不涉及复杂的会计学概念,只是从经验、工程的角度来讲一讲我实际记账过程中账本是怎么组织的。
账本组织结构
目前为止我们假设所有的Beancount记录都是在单一文件中的,这个文件会随着账目的增多越来越膨胀,直到用编辑器维护不便。
Beancount 允许将账本拆分,然后通过 include
语法将账本进行关联起来。利用这个简单的语法,就可以将一个巨大的账本分成若干个较小的账本,方便管理和查找。但Beancount 最终会把所有交易都读到内存里后按日期重新排序,所以每条交易在文件里出现的顺序并不重要。
尽管有"文件包含语法(include)",但每条记录到底怎么划分还是一个仁者见仁智者见智的话题,下面是我根据自己的经验对账单进行一个分割管理。但首先要明白划分的目的:
- 降低维护成本
- 尽量减少可能的错误
选择自己合适的组织结构,这是一项大工程
我的账本目录结构如下:
Beancount-Trans-Assets/
.
├── 2022 ; 以年做分割
│ ├── 00.bean ; include该目录下的其他所有文件
│ ├── 01-expenses.bean ; 2022年01月份账单(支出、转账等)
│ ├── 02-expenses.bean
│ ├── 03-expenses.bean
│ ├── 04-expenses.bean
│ ├── 05-expenses.bean
│ ├── 06-expenses.bean
│ ├── 07-expenses.bean
│ ├── 08-expenses.bean
│ ├── 09-expenses.bean
│ ├── 10-expenses.bean
│ ├── 11-expenses.bean
│ ├── 12-expenses.bean
│ ├── cycle.bean ; 周期性费用/交易目录(每月信用卡还款、水电费、车贷房贷等)
│ ├── event.bean ; 事件记录(位置、入职离职情况、重要日子记录等)
│ ├── income.bean ; 除投资外的所有收入(薪资、红包、副业等)
│ ├── invoice.bean ; 报销
│ ├── price.bean ; 跟踪通货(例如黄金、股票等)价格情况,方便在合适的时候买入卖出
│ ├── securities.bean ; 投资记录
├── account ; 保存五类经典账户的启用及关闭
│ ├── assets.bean
│ ├── equity.bean
│ ├── expenses.bean
│ ├── income.bean
│ └── liabilities.bean
├── depreciation.bean ; 折旧账单,具体使用看'结余与资产',已经列出该账单的详细使用
├── document ; 存放例如账单文件等文档目录
│ └── Syntax_Cheat_Sheet.png ; beancount格式小抄
└── main.bean ; 主账本,使用fava main.bean输出可视化界面
最底下的 main.bean
是我的主账本(查账执行 fava main.bean
)。该文件的内容如下:
; main文件
; 1. 账本信息
option "title" "xxx的账本"
option "operating_currency" "CNY" ; 人民币
option "operating_currency" "COIN" ; 不可流通,1:1转换人民币
option "operating_currency" "TIME" ; 按次记录
2022-01-01 custom "fava-option" "language" "zh" ; 配置fava以中文显示
; 2. 账户设置
include "accounts/assets.bean" ; 资产账户设置
include "accounts/equity.bean" ; 负债账户设置
include "accounts/expenses.bean" ; 支出账户设置
include "accounts/income.bean" ; 收入账户设置
include "accounts/liabilities.bean" ; 权益账户设置
; 3. 插件管理
plugin "beancount.plugins.forecast" ; 分期插件
plugin "beancount.plugins.auto_accounts" ; 根据条目自动添加账户插件
; 4. 定期折旧
include "depreciation.bean"
; 5. 交易记录
include "2021_template/2021_template.bean" ; 该文件是模板文件
include "2022/2022.bean"
我使用 include
导入了 6 个文件,其中 5 个账户设置文件,1 个年度账本。
Assets账户设置文件模板如下:
; 人民币,包括各类银行卡,微信支付宝和别人的欠款
2022-01-01 open Assets:Savings:Bank:ZhaoShang:C8837 CNY ; 银行卡
2022-01-01 open Assets:Receivables:Personal:XXX CNY ; XXX的欠款(自己的资产,可以理解为先给对方保管,当对方还钱后再加回到银行卡并关闭账户)
; 代币,不方便流通但与人民币1:1等值兑换,包括储值卡,公积金账户及投资
2022-01-01 open Assets:Savings:Recharge:YiMing COIN ; 充值
2022-01-01 open Assets:Savings:Recharge:YongHeDouJiang COIN ; 2022-01-01是我的初始化时间
2022-09-09 close Assets:Savings:Recharge:YongHeDouJiang ; 当储值卡不再使用后推荐及时关闭,fava中也随之不再显示
2022-01-01 open Assets:Investment:AliPay:Gold ; 投资,可以按克重来计算
; 点券,与人民币非等值兑换
2022-01-01 open Assets:Savings:Recharge:HuaWei:Read TOKEN
2022-01-01 open Assets:Savings:Recharge:WangZhe TOKEN ; 例如在王者荣耀中1人民币=10点券
; 按次消费
2022-09-04 open Assets:Savings:Time:Foot TIME ; 洗脚,有点类似储值消费但又是按次来使用的(经实际验证我将该记录保存至time.bean文件,消费后则关闭该账户)
2022.bean
文件仍然没有交易记录,而是继续导入其它账本,其账本如下:
; 2022.bean文件
include "0-default/00.bean" ;默认目录,每月日常支出,收入,转账等(当年的收入、转账、event 事件)
include "1-securities/00.bean" ;证券投资目录(股票和基金买卖记录)
include "2-trip/00.bean" ;旅行 & 出差目录(旅行出差的账本,命名日期-地点.bean)
include "3-cycle/00.bean" ;周期性费用/交易目录(每月信用卡还款、水电费、车贷房贷等)
include "4-project/00.bean" ;项目目录(车子、房子等大宗商品)
概括起来,我的账本结构分三层:
第 1 层:main.bean
作为主账本,include 各个账户文件及每年账本文件。
第 2 层:每年有个目录,下设年份.bean
的文件,include 各个子目录下 00.bean
文件。
第 3 层:每个子目录下 00.bean
文件 include 该目录下所有正式的记账文件。
这样设计优点:
- 按年组织,往年数据直接存档,不会被破坏
- 年份目录下进行分类记录,避免放在一个文件不好维护
总结
还是那句话,复式记账只有规范,没有对错。我把我的记账原则总结成了以下规则,在记账前先行判断:
-
如果是收入(对于先替别人付,然后别人转账给我的条目记为应收款项而不是收入,参考Beancount_02_借贷记账法中的借贷管理),统一记录到当年的
income.bean
中,如果收入较多(我不理解,但我大受震撼),可以将最近的收入上往下记录,这样打开文件可以直接看到最近的收入; -
如果该支出属于投资类型,那么就加入到
securities
目录。若是考虑到投资种类,可以在投资类型下继续细分为股票、黄金等; -
如果该支出是一个周期项目,例如信用卡还款、订阅、话费、贷款、折旧等,加入到
cycle.bean
目录中。 -
如果是在旅游、出差过程中产生的支出,则记录在
[]-expenses.bean
目录中并打上标签pushtag #20221001-hangzhou
和poptag #20221001-hangzhou
方便索引;如果遇到需要报销的场景,则额外为报销添加链接^201909-out
; -
如果该支出是一个大宗项目(具体多少算大宗根据自身情况),同样根据标签
#Hone
进行索引。 -
不属于以上情况,统一加入按日期划分的文件
2024-01-08 * "古茗" "商品详情"
time: "18:23:03"
uuid: "4200002101202401080969304458"
status: "WeChat - 支付成功"
Expenses:Food:DrinkFruit +26.00 CNY
Liabilities:CreditCard:Bank:ZhaoShang:C4523 -26.00 CNY
- 每月1号早将所有账户balancae断言后再对账,所有账单条目清晰后对于利息造成的误差使用pad进行填充。对于pad和balance日期有疑问可回看Beancount_04_结余与资产
2023-01-14 balance Liabilities:CreditCard:Bank:ZhongXin:C6428 -4633.20 CNY ; 信用卡
2023-01-13 pad Assets:Savings:Bank:NingBo:C1746 Income:Investment:Interest ; 投资收益
2023-01-14 balance Assets:Savings:Bank:NingBo:C1746 2395.62 CNY ; 银行卡
2023-01-13 pad Assets:Savings:Bank:ZhaoShang:C8837 Income:Investment:Interest
2023-01-14 balance Assets:Savings:Bank:ZhaoShang:C8837 7959.36 CNY
2023-01-13 pad Assets:Savings:Web:WechatPay Income:Investment:Interest
2023-01-14 balance Assets:Savings:Web:WechatPay 784.54 CNY
2023-01-14 balance Assets:Savings:Web:AliPay 0.00 CNY