跳转到内容

余额

余额断言声明某个账户在某一时刻持有多少,就像银行对账单或你的钱包所显示的那样。张记账会用该账户的记账行来核对它。定期断言余额,可以在打错、漏记和重复记录的交易还容易找到时就发现它们。

补齐是另一半:它填上一笔你无法或不想详细记录的金额,例如账户在你开始记账之前已有的钱。

两者的确切语法见 balance,补齐的细节见用 with pad 补齐和 pad 指令。

你一月份的银行对账单期末余额为 16,643.60 CNY:

2024-01-01 open Assets:Bank:Checking CNY
2024-01-01 open Income:Salary CNY
2024-01-01 open Expenses:Food CNY
2024-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 下的其他所有账户合在一起检查。
  • 一条断言检查一种商品。持有多种商品的账户,每种商品写一行。账户未持有的商品按零计算。

只有余额与金额完全相等时,断言才成立。余额为 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 虽然名字如此,也不能。

开始记账时,你的银行账户里已经有钱了。不必记录它的全部历史,把它补齐到当时的余额即可:

2024-01-01 open Assets:Bank:Checking CNY
2024-01-01 open Equity:Opening-Balances CNY
2024-01-01 balance Assets:Bank:Checking 5000 CNY with pad Equity:Opening-Balances

with 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。

补齐和它所服务的断言也可以像 Beancount 一样写成两条指令。这在张记账文件和 Beancount 文件中都可以使用:

main.bean
2024-01-01 pad Assets:Bank:Checking Equity:Opening-Balances
2024-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,并给出账户名。
  • 在流水页面中,这条断言标记为断言失败。它的预览显示断言余额、累计余额、差额和容差。
  • 在账户页面中,记录标签页把这条断言显示为一行,所断言的金额显示在累计余额旁边。

查找原因:

  1. 看差额。它往往等于某一笔交易:漏记的、记了两次的,或者正负号写反的(差额是其金额的两倍)。

  2. 列出该账户的记账行及其累计余额,与对账单逐行比对:

    JOURNAL 'Assets:Bank:Checking' FROM date >= 2024-01-01 AND date < 2024-02-01
  3. 用更多断言缩小时间范围,例如每张对账单或每周一条。第一条失败的断言告诉你该从哪里找。

  4. 在查询页面中列出所有失败的断言及其差额,即记账行给出的余额减去断言的金额:

    SELECT date, account, amount, discrepancy FROM #balances WHERE discrepancy IS NOT NULL

找到并修正这些交易后,断言就会重新成立。如果你认为差额不值得追查,可以把断言改成补齐到某个支出账户的 balance … with pad,有意地记下这笔差额。

  • 在账户页面中,余额断言标签页列出账户持有的商品。输入其中一种的实际余额,然后选择断言余额。要补齐差额,在填充来源下选择一个账户,然后选择填充并断言。
  • 工具 → 批量对账可以一次为多个账户完成同样的操作。留空的行会被跳过。

网页界面把它们写入 directive_output_path 选项指定的文件:

  • 在张记账账本中,它写入用当前日期和时间标注的 balance 或 balance … with pad,因此它们计入截至此刻记录的所有内容,包括今天的条目。
  • 在没有时刻的 Beancount 账本中,“我现在的余额”是一条日期为明天、排在今天所有条目之后的 balance。补齐会把差额写成一笔日期为当前时间的补齐交易,而不是 pad 指令。当天再次核对同一账户、同一商品时,会原地替换那条余额断言并去掉它的 ~ 容差,网页界面会列出被替换的余额断言。

对于写入后只会被报告为错误的余额断言,张记账会拒绝写入,什么也不写:未开立的账户、从该账户本身或其子账户补齐、补齐按成本持有的商品,以及在 Beancount 账本中,你写的某条 pad 会为它补齐的余额断言。提示会说明原因和需要修改的地方。见通过网页界面。

张记账按以下顺序处理账本:先按声明顺序运行插件,再检查每个账户是否已开设,然后补齐,最后检查断言。因此插件添加的交易也计入补齐所要达到的余额和断言检查的余额。插件能看到你的 balance … with pad 指令,但看不到补齐交易,因为插件运行时它们还不存在。插件也看不到 pad 指令:由某条 pad 补齐的 balance 会以 balance … with pad 的样子交给它。见编写插件。