跳到主要内容

会计循环,Beancount 风格

· 阅读需 8 分钟
Mike Thrift
Mike Thrift
Marketing Manager

财务报表并非凭空出现。它们是称为 会计循环 的结构化、可重复过程的最终产物。虽然原则是通用的,但你使用的工具可以极大改变体验。本指南将以 Beancount——这款强大的纯文本会计工具——为中心,带你走完整个会计循环。

我们将看到 Beancount 的文本优先方法如何消除繁琐步骤、哪些环节应当自动化,以及哪些报告能为你的财务健康提供最清晰的视图。 🧑‍💻

2025-08-13-the-accounting-cycle-beancount-style


TL;DR: Beancount 工作流

  • 捕获 & 记账:.beancount 文本文件中以干净的双重分录记录每笔交易。
  • 验证 & 对账: 使用 balance 断言确认账本与银行对账单匹配,并运行 bean-check 捕获错误。
  • 审查: 生成未调整试算表进行快速检查。
  • 调整: 为应计、递延、折旧及其他期末项目做分录。
  • 复审: 检查调整后的试算表确保一切正确。
  • 发布 & 结账: 生成损益表、资产负债表和现金流量表。Beancount 中的结账是可选的,因为报告具备日期感知能力。

此流程可视化如下:


步骤 1:捕获并记录交易

这是基础步骤。每个财务事件——销售、采购、银行费用——都必须记录。在 Beancount 中,你通过在一个简单的文本文件(通常命名为 main.beancount,或按年份拆分为多个文件)中创建交易来完成此操作。

每笔交易必须遵循双重记账规则,即所有分录的合计必须为零。Beancount 会为你强制执行此规则。

2025-08-10 * "Walmart" "Purchase of office supplies"
Expenses:Office:Supplies 45.67 USD
Assets:Bank:Checking -45.67 USD
  • 技巧: 使用 #project-phoenix#client-acme 等标签为数据添加维度。这样在后期查询和报告时会极其灵活。

对账卫生 ✅

确保准确性的最强大功能是 balance 断言。在账单周期结束时(例如月末),声明账户的 应有 余额。

2025-08-31 balance Assets:Bank:Checking  12345.67 USD

如果截至该日期影响 Assets:Bank:Checking 的所有交易合计不等于 12345.67 USD,Beancount 将抛出错误。这个简单指令让你的账本成为自审文件。

对于回填历史数据,pad 指令可以自动创建平衡交易,使你的期初余额匹配首个断言。


步骤 2: “记入账本” (免费赠送!)

在传统会计系统中,你先在 “日记账” 中写分录,然后在单独的 “过账” 步骤中将这些数值复制到 “总账”。

使用 Beancount,你的 .beancount 文件即是日记账也是总账。 当你写入并保存交易时,已经完成了过账。没有单独的步骤。这种直接性是纯文本会计的核心优势——所见即所得。


步骤 3:准备未调整试算表

在进行调整之前,需要快速进行 “这是否相加?” 检查。试算表 是列出每个账户及其总余额的简易报告。所有借方余额的总计必须等于所有贷方余额的总计。

你可以使用简单查询生成它:

bean-query main.beancount \
"SELECT account, sum(position) GROUP BY 1 ORDER BY 1"

或者,使用更直观的方式,在 Fava(Beancount 的网页界面)中打开账本并导航至 “Trial Balance” 报告。留意异常——资产账户出现贷方余额,或费用账户出现奇怪数值。


步骤 4:记调整分录

调整分录对基于 权责发生制 的准确报告至关重要。它们确保收入在赚取时确认,费用在发生时确认,而不论现金何时流动。

常见调整包括:

  • 应计: 记录已赚但未开票的收入,或已发生但未付款的费用。
  • 递延: 处理预付款。如果客户提前为一年服务付款,你将其记为负债 (Liabilities:UnearnedRevenue) 并在每月确认 1/12 的收入。
  • 非现金项目: 记录资产折旧等。
  • 更正: 修正错误或补记银行流水中遗漏的项目,如小额利息收入。

示例:应计收入

你在 8 月 31 日完成项目,但发票要到 9 月才寄出。为在正确期间(8 月)确认收入,做如下调整分录:

2025-08-31 * "Accrue revenue for client project #1042"
Assets:AccountsReceivable 3000.00 USD
Income:Consulting -3000.00 USD

示例:记录折旧

公司对资产有折旧计划。期末时记入费用:

2025-12-31 * "Annual depreciation on computer equipment"
Expenses:Depreciation 4800.00 USD
Assets:Fixed:AccumulatedDepreciation -4800.00 USD

步骤 5:运行调整后试算表并验证

加入调整分录后,再次运行试算表。这就是 调整后试算表,它提供了用于编制财务报表的最终数字。

此时也是运行 Beancount 内置检查的最佳时机:

bean-check main.beancount

该命令会验证所有语法、平衡规则和断言。若无任何输出,说明账本在机械层面上是健全的。


步骤 6:发布财务报表 📊

这就是回报。使用调整后试算表的数字,你可以生成关键财务报告。Fava 是最简便的方式,它提供交互式、可下钻的报告。

  • 损益表(Profit & Loss): 展示一定期间的收入与费用,得出净利润或净亏损。
  • 资产负债表: 在特定日期展示拥有的资产、负债以及净资产(权益)。
  • 现金流量表: 通过展示资金来源和去向,将期初现金与期末现金对账。

如需自定义报告,可使用 Beancount 查询语言(BQL)。以下是月度损益表查询示例:

-- 2025 年 8 月的损益表
SELECT account, sum(position)
WHERE account '^(Income|Expenses)'
AND date >= 2025-08-01 AND date <= 2025-08-31
GROUP BY account ORDER BY account;

步骤 7:结账(可选)

在传统会计中,“结账”过程涉及创建分录将所有临时账户(收入和费用)清零,并将净利润转入名为 留存收益 的权益账户。这正式为下一年重置临时账户。

在 Beancount 中,这一步通常不必进行。 Fava 的报告具备日期感知能力;如果你请求 2025 年的损益表,它只会使用 2025 年的数据。余额不会“溢出”。大多数用户直接保留现有余额。

然而,如果出于合规或股东报告需要进行正式结账,可使用简单的年终交易将收入与费用总额转入 Equity:Retained-Earnings


实用的月度结账检查清单

以下是使用 Beancount 每月结账的可重复检查清单。

  • 捕获: 导入所有银行和信用卡交易。手动录入现金费用或其他渠道项目。
  • 对账: 为所有银行账户、信用卡和贷款账户添加 balance 断言,使其与对账单匹配。
  • 审查: 在 Fava 中查看未调整试算表。调查任何异常或意外余额。检查未付款发票 (Assets:AccountsReceivable) 或未付款账单 (Liabilities:AccountsPayable)。
  • 调整: 记入应计收入/费用、递延收入以及必要的更正分录。
  • 验证: 运行 bean-check。审阅最终的调整后试算表。
  • 发布: 生成损益表和资产负债表。发送给利益相关者或保存备案。
  • 收尾: 如业务需要,可执行结账分录。归档该期间的 .beancount 文件副本。

为什么 Beancount 在会计循环中大放异彩

  • 透明与可审计性: 你的账本是文本文件。可使用 git 对财务历史进行版本控制,使用 diff 审阅变更,并与会计师以清晰、无歧义的格式协作。
  • 完全掌控: 你自行定义科目表,不受软件供应商结构限制。你的数据永远属于你,采用开放格式保存。
  • 无与伦比的强大功能: SQL 类查询(BQL)结合功能丰富的网页界面(Fava),让你对财务数据进行前所未有的切片、切块和洞察。

快速上手的代码片段

简易科目表:

option "title" "My Personal Ledger"
option "operating_currency" "USD"

;; --- Accounts ---
1970-01-01 open Assets:Bank:Checking
1970-01-01 open Assets:AccountsReceivable
1970-01-01 open Liabilities:CreditCard
1970-01-01 open Liabilities:UnearnedRevenue
1970-01-01 open Equity:Owner:Capital
1970-01-01 open Equity:Retained-Earnings
1970-01-01 open Income:Consulting
1970-01-01 open Expenses:Office:Supplies
1970-01-01 open Expenses:Software
1970-01-01 open Expenses:Depreciation

实用 BQL 查询:

-- 查找所有有未清余额的客户
SELECT payee, sum(position)
WHERE account = 'Assets:AccountsReceivable'
GROUP BY payee
HAVING sum(position) > 0
ORDER BY sum(position) DESC;

通过将永恒的会计循环映射到 Beancount 的现代文本化工具,你获得了一个坚固、透明且经久不衰的系统。祝你记账愉快!