余额
余额断言声明某个账户在某一时刻持有多少,就像银行对账单或你的钱包所显示的那样。张记账会用该账户的记账行来核对它。定期断言余额,可以在打错、漏记和重复记录的交易还容易找到时就发现它们。
补齐是另一半:它填上一笔你无法或不想详细记录的金额,例如账户在你开始记账之前已有的钱。
两者的确切语法见 balance,补齐的细节见用 with pad 补齐和 pad 指令。
你一月份的银行对账单期末余额为 16,643.60 CNY:
2024-01-01 open Assets:Bank:Checking CNY2024-01-01 open Income:Salary CNY2024-01-01 open Expenses:Food CNY2024-01-01 open Equity:Opening-Balances CNY
; 账本开始之前账户已有的 5,000 CNY,见下文2024-01-01 balance Assets:Bank:Checking 5000 CNY with pad Equity:Opening-Balances
2024-01-05 * "ACME Corp" "一月工资" Assets:Bank:Checking 12000 CNY Income:Salary
2024-01-20 * "超市" Assets:Bank:Checking -356.40 CNY Expenses:Food
2024-02-01 balance Assets:Bank:Checking 16643.60 CNY- 断言在其日期的开始时检查:它计入日期在它之前的所有条目,不计入当天的任何条目。要核对截至 1 月 31 日的对账单,请把断言的日期写为 2 月 1 日。
- 带上时间,例如
2024-01-31 23:59:59 balance …,它也会计入当天更早的条目。没有时间的条目视为00:00:00,断言排在日期和时间相同的其他条目之前。在 Beancount 账本中,balance的时间会像 Beancount 一样被忽略:断言在其日期开始时检查,当这改变了它所检查的金额时,会有一条BalanceTimeIgnored提示。 - 账户的余额包含它的子账户:
balance Assets:Bank …会把Assets:Bank、Assets:Bank:Checking以及Assets:Bank下的其他所有账户合在一起检查。 - 一条断言检查一种商品。持有多种商品的账户,每种商品写一行。账户未持有的商品按零计算。
精确匹配与容差
Section titled “精确匹配与容差”只有余额与金额完全相等时,断言才成立。余额为 16643.60 CNY 时,16643.604 CNY 不成立;余额为 16643.604 时,16643.6 也不成立。
如果你的数据来源会做舍入,例如某个应用把基金显示到两位小数,而份额的小数位更多,请在 ~ 之后写上你接受的容差:
2024-02-01 balance Assets:Bank:Checking 16643.60 ~ 0.01 CNY当余额与 16,643.60 CNY 相差不超过 0.01 CNY 时,这条断言成立。张记账从不根据你写的小数位数推导容差,也没有任何选项能放宽断言:default_balance_tolerance_precision 虽然名字如此,也不能。
从已有余额开始
Section titled “从已有余额开始”开始记账时,你的银行账户里已经有钱了。不必记录它的全部历史,把它补齐到当时的余额即可:
2024-01-01 open Assets:Bank:Checking CNY2024-01-01 open Equity:Opening-Balances CNY
2024-01-01 balance Assets:Bank:Checking 5000 CNY with pad Equity:Opening-Balanceswith pad Equity:Opening-Balances 让张记账添加一笔交易,使账户达到 5,000 CNY,差额取自 Equity:Opening-Balances:
- 补齐交易的标记是
P,收款方是Balance Pad,摘要是pad Assets:Bank:Checking to Equity:Opening-Balances。它的日期是断言的日期,并排在当天其他条目之前,因此账户在当天开始时持有 5,000 CNY。流水页面把它列为填充。 - 它的金额根据记账行在那一刻给出的余额计算。如果账户已经持有该金额,张记账不添加任何交易。
- 然后,断言像其他断言一样,按补齐后的余额检查。
- 补齐不限于期初余额。它也可以填上一个你永远不会去还原的缺口,例如一个月零星现金开销之后的钱包:
2024-01-01 balance Assets:Cash 200 CNY with pad Equity:Opening-Balances
2024-01-10 * "面包店" Assets:Cash -18 CNY Expenses:Food
; 点数后有 150 CNY:另外 32 CNY 花在了不值得记录的地方2024-02-01 balance Assets:Cash 150 CNY with pad Expenses:Misc这里张记账在 2 月 1 日把 32 CNY 从 Assets:Cash 转到 Expenses:Misc。
pad 指令
Section titled “pad 指令”补齐和它所服务的断言也可以像 Beancount 一样写成两条指令。这在张记账文件和 Beancount 文件中都可以使用:
2024-01-01 pad Assets:Bank:Checking Equity:Opening-Balances2024-01-02 balance Assets:Bank:Checking 1000.00 USD张记账像 Beancount 一样把它们配对:一条 pad 服务于其账户在每种商品上、日期更晚的下一条 balance,直到该账户的下一条 pad 为止。两者可以在不同的文件中。与 pad 同一天的 balance 不会被补齐。
- 补齐交易的日期是
pad的日期,这里是 1 月 1 日,与 Beancount 相同,所以账户从那天起持有补齐后的余额。 - 没有任何
balance需要的pad会报告为UnusedPad,与 Beancount 相同。 - 补齐该账户按成本持有的商品(例如带成本买入的股票)会报告为
PadWithCost:请改为带成本地记入这些数量。
断言失败不会改变你的账目:账户保留记账行给出的余额,之后的断言和补齐也从这个余额开始计算。张记账只是报告它:
- 总览页面上的账本错误列表显示一个
AccountBalanceCheckError,并给出账户名。 - 在流水页面中,这条断言标记为断言失败。它的预览显示断言余额、累计余额、差额和容差。
- 在账户页面中,记录标签页把这条断言显示为一行,所断言的金额显示在累计余额旁边。
查找原因:
-
看差额。它往往等于某一笔交易:漏记的、记了两次的,或者正负号写反的(差额是其金额的两倍)。
-
列出该账户的记账行及其累计余额,与对账单逐行比对:
JOURNAL 'Assets:Bank:Checking' FROM date >= 2024-01-01 AND date < 2024-02-01 -
用更多断言缩小时间范围,例如每张对账单或每周一条。第一条失败的断言告诉你该从哪里找。
-
在查询页面中列出所有失败的断言及其差额,即记账行给出的余额减去断言的金额:
SELECT date, account, amount, discrepancy FROM #balances WHERE discrepancy IS NOT NULL
找到并修正这些交易后,断言就会重新成立。如果你认为差额不值得追查,可以把断言改成补齐到某个支出账户的 balance … with pad,有意地记下这笔差额。
在网页界面中断言余额
Section titled “在网页界面中断言余额”- 在账户页面中,余额断言标签页列出账户持有的商品。输入其中一种的实际余额,然后选择断言余额。要补齐差额,在填充来源下选择一个账户,然后选择填充并断言。
- 工具 → 批量对账可以一次为多个账户完成同样的操作。留空的行会被跳过。
网页界面把它们写入 directive_output_path 选项指定的文件:
- 在张记账账本中,它写入用当前日期和时间标注的
balance或balance … with pad,因此它们计入截至此刻记录的所有内容,包括今天的条目。 - 在没有时刻的 Beancount 账本中,“我现在的余额”是一条日期为明天、排在今天所有条目之后的
balance。补齐会把差额写成一笔日期为当前时间的补齐交易,而不是pad指令。当天再次核对同一账户、同一商品时,会原地替换那条余额断言并去掉它的~容差,网页界面会列出被替换的余额断言。
对于写入后只会被报告为错误的余额断言,张记账会拒绝写入,什么也不写:未开立的账户、从该账户本身或其子账户补齐、补齐按成本持有的商品,以及在 Beancount 账本中,你写的某条 pad 会为它补齐的余额断言。提示会说明原因和需要修改的地方。见通过网页界面。
插件、补齐与断言
Section titled “插件、补齐与断言”张记账按以下顺序处理账本:先按声明顺序运行插件,再检查每个账户是否已开设,然后补齐,最后检查断言。因此插件添加的交易也计入补齐所要达到的余额和断言检查的余额。插件能看到你的 balance … with pad 指令,但看不到补齐交易,因为插件运行时它们还不存在。插件也看不到 pad 指令:由某条 pad 补齐的 balance 会以 balance … with pad 的样子交给它。见编写插件。
