跳到主要内容

7 篇博文 含有标签「double-entry accounting」

查看所有标签

理解 Beancount 中的日记账分录

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

日记账分录是复式记账的核心,在 Beancount 中,你编写的每一条 * 交易都是一条日记账分录。本指南解释了关键要点——借方与贷方、调整分录和冲销分录——并展示它们如何干净地映射到 Beancount 的纯文本语法。你将学会以最少的繁琐保持账目精准。


2025-09-02-journal-entries-in-beancount

快速回顾:什么是日记账分录?

日记账分录是对金融交易的正式、带日期的记录。它以 借方贷方 的形式表达,保持基本会计等式平衡:

资产=负债+所有者权益资产 = 负债 + 所有者权益

在复式记账体系中,每笔交易至少影响两个账户,总借方必须等于总贷方。这一简单规则确保了后续的利润表、资产负债表等财务报告的可信度和准确性。


一分钟了解借方与贷方

借方与贷方的概念起初可能让人困惑,但其实只需记住几个简单规则。可以这样思考:“价值从哪里来?”(贷方)以及 “价值到哪里去?”(借方)。

以下是五大核心账户类型的增减规则速查表:

账户类型增加方式
资产借方
费用借方
负债贷方
所有者权益贷方
收入贷方

Beancount 中的日记账分录长什么样

Beancount 使用简洁、易读的文本指令记录交易。每笔交易必须对每种商品(例如 USD、EUR、AAPL 股票)平衡为零。若不平衡,Beancount 会报错。

下面是一个购买咖啡的基本交易示例:

2025-09-10 * "Coffee Bar" "Team coffee"
Expenses:Food:Coffee 18.00 USD
Assets:Bank:Checking -18.00 USD

注意两行记账(带账户的行)相加为零:$18.00 + (-$18.00) = 0

你可以在叙述中直接使用 标签(如 #clientX)进行过滤,或使用 链接(如 ^INV-2025-001)将相关分录关联起来。

例如,下面展示如何将发票与付款关联:

; 首先,记录发送给客户的发票
2025-09-15 * "Acme Corp" "Invoice 2025-001 #clientX ^INV-2025-001"
Assets:AccountsReceivable 1000.00 USD
Income:Consulting -1000.00 USD

; 稍后,记录付款并回链到原始发票
2025-09-28 * "Acme Corp" "Payment on ^INV-2025-001"
Assets:Bank:Checking 1000.00 USD
Assets:AccountsReceivable -1000.00 USD

#clientX 标签让你轻松筛选该客户的所有交易,^INV-2025-001 链接则在报告中创建两条分录之间的可追溯关系。


常用日记账分录(可直接粘贴)

以下是几类常见业务交易的 Beancount 格式示例。

所有者投入现金

所有者为创业投入个人资金。

2025-01-01 * "Owner" "Initial capital contribution"
Assets:Bank:Checking 10000.00 USD
Equity:Owner-Capital -10000.00 USD

含税现金销售

客户以现金购买商品,需收取 8% 销售税,税金稍后上缴政府。

2025-01-05 * "Walk-in Customer" "Cash sale with 8% tax"
Assets:Cash 108.00 USD
Income:Sales -100.00 USD
Liabilities:Tax:Sales -8.00 USD

信用销售(发票)与收款

提供服务并开具发票,随后收到付款。

2025-01-10 * "Acme Corp" "Consulting invoice ^INV-2025-002"
Assets:AccountsReceivable 2500.00 USD
Income:Consulting -2500.00 USD

2025-01-30 * "Acme Corp" "Payment on ^INV-2025-002"
Assets:Bank:Checking 2500.00 USD
Assets:AccountsReceivable -2500.00 USD

信用卡费用

使用公司信用卡购买办公用品。

2025-01-12 * "OfficeMax" "Supplies on credit card"
Expenses:Office:Supplies 75.00 USD
Liabilities:CreditCard -75.00 USD

薪资(简化模型)

记录工资总额、员工税款预扣以及银行净付款。

2025-01-31 * "Payroll" "January wages and withholdings"
Expenses:Payroll:Wages 2000.00 USD
Liabilities:Taxes:Withheld -400.00 USD
Assets:Bank:Checking -1600.00 USD

月度折旧

记录资产(如笔记本电脑)的月度折旧费用。

2025-01-31 * "Depreciation" "Laptop, straight-line"
Expenses:Depreciation 100.00 USD
Assets:Equipment:AccumDepr -100.00 USD

预付费用与月度摊销

一次性支付全年保险费,然后在每月确认费用。

; 1. 支付全年保费
2025-01-01 * "InsureCo" "Annual insurance premium"
Assets:Prepaid:Insurance 1200.00 USD
Assets:Bank:Checking -1200.00 USD

; 2. 在一月末确认一个月费用
2025-01-31 * "InsureCo" "Amortize 1/12 of insurance"
Expenses:Insurance 100.00 USD
Assets:Prepaid:Insurance -100.00 USD

递延收入与月度确认

客户预付 3 个月订阅费,随后按月确认收入。

; 1. 客户预付服务费
2025-02-01 * "Subscriber" "3-month plan prepaid"
Assets:Bank:Checking 300.00 USD
Liabilities:Unearned:Subs -300.00 USD

; 2. 在二月末确认第一个月收入
2025-02-28 * "Recognition" "Recognize month 1 of 3"
Liabilities:Unearned:Subs 100.00 USD
Income:Subscriptions -100.00 USD

坏账准备与核销

为可能无法收回的应收账款计提准备金,随后核销具体坏账。

; 1. 按应收账款的 2% 计提准备金
2025-03-31 * "Provision" "2% of A/R for doubtful accounts"
Expenses:BadDebt 200.00 USD
Assets:AllowanceForDoubtful -200.00 USD

; 2. 核销已确认无法收回的发票
2025-04-15 * "Write-off" "Customer XYZ invoice"
Assets:AllowanceForDoubtful 150.00 USD
Assets:AccountsReceivable -150.00 USD

期末存货与成本调整

期末通过调整存货账户计算本期销货成本(COGS)。

2025-03-31 * "COGS adjustment" "Periodic inventory method"
Expenses:COGS 4500.00 USD
Assets:Inventory -4500.00 USD

调整分录 vs. 冲销分录

调整分录 在会计期间(如月末或季末)记录,用于将收入与费用准确匹配到实际发生的期间,涵盖应计、递延以及折旧等估计。

冲销分录 是可选的,通常在新期间的第一天录入,用来完全冲销前一期的特定调整分录,以简化后续记账。冲销应计后,你可以用标准方式记录实际现金交易,而无需记得再对负债账户进行拆分。

示例:计提并冲销水电费

假设你需要在一月计提水电费,但账单要到二月才收到。

; 1. 在一月末计提预计费用
2025-01-31 * "Accrual" "Estimate January utilities expense"
Expenses:Utilities 500.00 USD
Liabilities:Accrued:Utilities -500.00 USD

; 2. (可选)在下期第一天冲销该计提
2025-02-01 * "Reversal" "Undo January utilities accrual"
Liabilities:Accrued:Utilities 500.00 USD
Expenses:Utilities -500.00 USD

; 3. 二月收到实际账单并付款
; 实际账单为 520 美元。由于已冲销,你可以直接全额记入费用。
2025-02-10 * "City Utilities" "Payment for January bill"
Expenses:Utilities 520.00 USD
Assets:Bank:Checking -520.00 USD

注:大纲中的示例展示了分拆最终付款的方式。冲销分录是一种简化最终付款录入的替代方案。


Beancount 日记账分录检查清单

请按以下步骤确保分录整洁、正确:

  1. 日期(YYYY-MM-DD)和交易标记 (*) 开头。
  2. 添加 付款方 与描述性 叙述。使用 #标签^链接 提高可搜索性。
  3. 至少包含 两行记账,使每种商品的合计为零。
  4. 使用正确的 账户名称,遵循五大类型:Assets, Liabilities, Equity, Income, Expenses
  5. 可选地添加 元数据(如 document: "invoices/INV-2025-001.pdf")以提升可追溯性。

常见陷阱(以及 Beancount 如何帮助)

  • 记账不平衡:如果借方与贷方不等于零,Beancount 会拒绝该分录。这是防止错误的核心功能。你甚至可以留空一行金额,Beancount 会自动计算。
  • 账户符号错误IncomeEquityLiabilities 增加时使用贷方(在 Beancount 中通常为负数),容易写错。若写错,报告会显得异常,但平衡规则仍提供安全网。
  • 缺少链接:忘记将发票与付款关联会导致追踪困难。始终使用 ^链接 可创建可审计的追踪链。

下一步该去哪里

  • Beancount 语言与平衡规则:深入官方文档。
  • 语法速查表:所有 Beancount 指令的便捷参考。
  • 借方/贷方入门:如果你对会计规则还不熟悉,这是很好的起点。
  • 调整/冲销分录:更详细的会计理论文章。

附录:会计术语 → Beancount 映射表

此快速翻译指南帮助你将会计指令映射为 Beancount 语法。

会计指令Beancount 操作
借记费用正数金额记入 Expenses: 账户
贷记负债负数金额记入 Liabilities: 账户
应计收入Assets:AccountsReceivable +
Income:* -
递延收入Assets:Bank:* +
Liabilities:Unearned:* -
确认递延收入Liabilities:Unearned:* +
Income:* -

有了这些模式与示例,你几乎可以在 Beancount 中干净地建模任何业务事件,确保财务报告毫无意外。

在 Beancount 中记录税务(实用方法)

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

税务在个人理财的世界里常常像一种特殊、复杂的怪兽。但如果它们不是这样呢?如果你可以把它们当作账本中任何其他资金流动来处理呢?好消息:完全可以。把税务当作简单的价值流动来记账,你的 Beancount 账本将保持整洁、易于查询,且——最重要的是——易于理解。

下面是一套实用、直截了当的模式,你可以直接放进个人或小型企业的 Beancount 文件中。它是一个处理工资单、税款支付,甚至跨年度的退款的简易系统。我们将介绍你需要的关键账户,演示真实案例,并展示获取所需答案的确切查询语句。

2025-08-25-recording-taxes-in-beancount


核心原则

在深入代码之前,先约定几条简单规则。这些原则让逻辑保持清晰,防止以后出现头疼的问题。

  • 把“它是什么”与“现金何时流动”分开。 🗓️
    这是最重要的概念。税务费用属于你获得收入的那一年(例如 2024 年),即使你在 2025 年 4 月才向 IRS 结清。如果不把费用的发生时间与现金支付的时间分离,你的年度报告将会混乱且误导。

  • 保持账户层级单调、简洁。 📁
    根据税种(例如 IncomeTaxSocialSecurity)为账户命名,这样查询会非常简单。不要在账户名里塞入供应商名称或表格编号(如 “W‑2” 或 “1099”),这些细节请使用元数据和标签来记录。

  • 采用权责发生制进行年终调整。 ⚖️
    即使是个人账本,在年终使用一个简单的权责发生分录也是最干净的做法。它意味着在正确的年度确认费用或退款,即使资金要到下一年才实际流动。这一步虽小,却能让你以后免去大量思考。

  • 为未来的自己写代码。 🧠
    目标是清晰。只有在真的能让查询更容易时,才在账户名里加入税务年度等额外信息。除非有充分理由,否则不要每年都创建一套新账户(Expenses:Taxes:2024:FederalExpenses:Taxes:2025:Federal 等),扁平结构往往更易管理。


最小化账户骨架

下面是一组基本账户,帮助你快速起步。该结构以美国税制为例,但你可以轻松改为自己所在国家的税务系统。只需把这些 open 指令放进你的 Beancount 文件即可。

; --- 美国联邦所得税与工资税 ---
; 用于记录工资单中被预扣的税款
2024-01-01 open Expenses:Taxes:Federal:IncomeTax:Withheld USD
; 用于记录估算付款或税日直接支付的税款
2024-01-01 open Expenses:Taxes:Federal:IncomeTax:Payments USD
; 用于记录收到的税款退款
2024-01-01 open Expenses:Taxes:Federal:IncomeTax:Refunds USD

; 你的 FICA(社会保险)缴款
2024-01-01 open Expenses:Taxes:Federal:SocialSecurity USD
2024-01-01 open Expenses:Taxes:Federal:Medicare USD

; --- 其他常见税种 ---
; 用于记录购买时支付的销售/使用税
2024-01-01 open Expenses:Taxes:Sales USD

; --- 年终调整账户(可选但推荐) ---
; 用于暂存尚未支付的应缴税款
2024-01-01 open Liabilities:AccruedTaxes:Federal:Income USD
; 用于暂存尚未收到的退款应收款
2024-01-01 open Assets:Tax:Receivable USD

此设置将预扣税、直接付款和退款分离,便于清晰看到每笔钱的去向。LiabilitiesAssets 账户是我们保持年终报告准确的秘密武器。


示例 1:工资单

记录一笔典型的工资单,税款会自动预扣。关键是先记录税前收入,再将其拆分为税款和实际到账的现金。

2025-07-15 * "Employer Inc." "Salary for first half of July"
Income:Work:Salary -6,000.00 USD
Expenses:Taxes:Federal:IncomeTax:Withheld 1,200.00 USD
Expenses:Taxes:Federal:SocialSecurity 372.00 USD
Expenses:Taxes:Federal:Medicare 87.00 USD
Assets:Cash:Checking 4,341.00 USD

这笔交易完整说明了:

  • 你获得了 6,000 美元的税前收入。
  • 其中 1,200 美元被预扣为联邦所得税。
  • 372 美元用于社会保险,87 美元用于医疗保险。
  • 剩余的 4,341 美元即为实得工资。

小技巧: 可以在交易中附加工资单元数据(如 pay_period_end: "2025-07-15"),便于审计追踪。


示例 2:报税(跨年度问题)

常见的坑:2025 年 4 月,你在报 2024 年的税,发现除预扣外仍需额外支付 3,000 美元。

如何记录?你希望这笔费用计入 2024 年,而现金支付发生在 2025 年。下面提供两种优秀的处理方式。

方案 A:手动两步权责发生制

纯 Beancount 方法,无需插件。清晰的两步流程。

步骤 1:在税务年度末确认费用。
在 2024 年最后一天创建一条“冲销”分录。此时并未实际付款,只是把费用记入临时负债账户。

2024-12-31 * "Federal income tax true-up for 2024"
Expenses:Taxes:Federal:IncomeTax:Payments 3,000.00 USD
Liabilities:AccruedTaxes:Federal:Income -3,000.00 USD

现在你的 2024 年损益表已经正确显示这笔 3,000 美元的费用。

步骤 2:在实际付款时记录现金流。
2025 年 4 月向 IRS 实际付款时,冲销负债。

2025-04-15 * "IRS" "Payment for 2024 tax return"
Liabilities:AccruedTaxes:Federal:Income 3,000.00 USD
Assets:Cash:Checking -3,000.00 USD

这样 2024 年报告准确,2025 年现金流也正确。完全相同的模式可用于退款——只需把负债账户换成 Assets:Tax:Receivable 即可。

方案 B:使用插件自动化

如果你倾向于在单笔交易中完成,可使用社区插件 beancount_reds_plugins.effective_date。它允许为单行项目指定不同的“生效日期”。

在主 Beancount 文件中启用插件:

plugin "beancount_reds_plugins.effective_date"

然后写一条交易,插件会在后台自动拆分,使报告保持准确。

; 单条记录;插件负责其余
2025-04-15 * "IRS" "Payment for 2024 tax return"
Assets:Cash:Checking -3,000.00 USD
Expenses:Taxes:Federal:IncomeTax:Payments 3,000.00 USD
effective_date: 2024-12-31

这里现金部分记在 2025‑04‑15,费用部分则追溯到 2024‑12‑31。效果与方案 A 相同,只是工作流不同。


销售税怎么办?

对大多数个人账本而言,销售税很简单。如果不需要抵扣,只需在购买时把它拆分为单独的费用即可。

2025-07-19 * "Local Grocery Store"
Expenses:Groceries 12.32 USD
Expenses:Taxes:Sales 1.28 USD
Assets:Cash:Checking -13.60 USD

这样你可以轻松追踪全年在销售税上的支出。如果你经营的业务涉及增值税(VAT),则需要使用更正式的应付/应收账户体系,但原理相同。


实际会用到的查询

此结构的全部意义在于让获取答案变得轻而易举。下面列出几条 BQL 查询示例,帮助你快速看到税务全貌。

1. 2024 年我的联邦所得税总额是多少?

SELECT cost(sum(position))
WHERE account "Expenses:Taxes:Federal:IncomeTax"
AND date >= 2024-01-01 AND date < 2025-01-01;

2. 该总额在预扣、付款和退款之间如何分布?

SELECT account, cost(sum(position))
WHERE account "Expenses:Taxes:Federal:IncomeTax"
AND date >= 2024-01-01 AND date < 2025-01-01
GROUP BY account
ORDER BY account;

3. 我是否还有未结清的税务负债或应收款?(检查工作是否完整!)

SELECT account, units(sum(position))
WHERE account "Liabilities:AccruedTaxes" OR account "Assets:Tax"
GROUP BY account
ORDER BY account;

如果该查询返回非零余额,说明还有未结清的权责发生项。


快速 FAQ

  • 真的需要每年单独的 Expenses:Taxes:2024 之类的账户吗?
    大多数情况下不需要。权责发生制(或插件)能够保持账户结构平坦、易读。只有在特定查询需求下才考虑创建年度账户。

  • Beancount 能直接帮我算税吗?
    不能直接算税,但可以准备好数据。高级用户会把 BQL 结果导入税务计算软件,以便在年度中估算税负。

  • 这算是税务建议吗?
    不是。 这只是组织账务数据的记账模式。会计原理是可靠的,但具体税务问题请咨询专业税务顾问。


立即上手的检查清单

准备好了吗?

  1. 把账户骨架加入你的 Beancount 文件(并根据所在国家自行调整名称)。
  2. 记录工资单时先记税前收入,再拆分税款与实际到账。
  3. 年终时使用负债/资产账户进行冲销(或使用 effective_date 插件)。
  4. 把退款记为应收,收到现金后冲销。
  5. 运行上面的 BQL 查询,在报税前核对总额。

保持单调、保持一致,你的报税季节终将不再是谜题,而是财务故事的自然章节。

会计循环,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 的现代文本化工具,你获得了一个坚固、透明且经久不衰的系统。祝你记账愉快!

Beancount.io 与传统会计软件:哪一款最适合你?

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

几十年来,商业会计领域一直由 QuickBooks、Xero 和 FreshBooks 等一系列常见的封闭式、基于 GUI 的系统主导。它们设定了标准,提供易于使用的可视化工作流程,以满足非技术用户的需求。但对于开发人员、高级用户以及任何重视绝对透明度和控制力的人来说,一种截然不同的方法已经出现:Beancount.io。

本文将 Beancount.io 与传统会计软件进行了直接比较。我们将详细分析它们在理念、灵活性、成本和长期可维护性方面的核心差异,以帮助你确定哪个系统真正符合你的需求。

2025-08-08-beancount-io-vs-traditional-accounting-software

1. 理念和工作流程

这两种方法最根本的区别在于其核心理念。

Beancount.io Beancount.io 建立在纯文本会计的理念之上。其核心是,每一笔财务交易都是一个简单文本文件中的条目。这种“会计即代码”的模型优先考虑人类可读、版本可控的记录。你的财务数据以一种永恒的、开放的格式存在,你完全拥有它——它永远不会被供应商锁定。此工作流程专为熟悉代码编辑器、Git 等版本控制系统和命令行工具的用户而设计。

传统软件 传统的会计平台是基于 GUI 和表单驱动的。你可以使用向导、下拉菜单和可视化表单输入数据。这种方法优先考虑即时性和可访问性,使非技术用户可以轻松上手,而无需陡峭的学习曲线。但是,你的数据存储在专有格式或云数据库中,如果你决定迁移到其他服务,通常需要复杂的导出和导入程序。

结论: 如果你优先考虑完全控制、数据所有权、透明度和自动化,那么 Beancount.io 无疑是赢家。如果你需要一个“点击即用”的界面和最小的学习曲线,那么传统软件会感觉更自然。

2. 灵活性与定制化

软件如何适应你的特定需求?

Beancount.io 100% 可编写脚本是 Beancount.io 的超级能力。它与 Python 无缝集成,允许你连接到任何 API,自动从银行馈送中获取数据,根据复杂规则以编程方式标记交易,并生成根据你的确切规范定制的报告。你的扩展和定制能力几乎是无限的,不受任何供应商强加的限制。

传统软件 这些平台提供与 PayPal、Stripe 和各种工资单服务等常用工具的精选集成。虽然方便,但你是在供应商的围墙花园内操作。定制仅限于平台允许的内容,高级报告或自动化通常需要升级到更高级别的计划或购买第三方附加组件。你可以使用他们的 API,但你将始终受其生态系统规则和速率限制的约束。

结论: Beancount.io 为开发人员和技术用户提供了无与伦比的灵活性。传统工具更适合与流行商业应用程序的标准即插即用工作流程。

3. 协作与透明度

你与他人合作和审核记录的方式大相径庭。

Beancount.io Beancount.io 上的协作是通过 Git 管理的。这使得对财务分类账的每次更改都完全透明且可审核。你可以看到谁在何时、为何以及如何进行了更改——就像代码审查工作流程一样。这非常适合已经采用 GitHub 或 GitLab 等工具的分布式团队。此外,没有隐藏的计算;报告中的每个数字都可以追溯到分类帐文件中确切的项目条目,从而确保完全可审核性。

传统软件 协作是通过内置的用户角色和权限来处理的。你可以邀请你的会计师、簿记员或业务合作伙伴通过 Web 界面直接访问账簿。这对于遵循传统财务监督模式的企业非常有效。缺点是某些内部操作,例如税务计算或自动余额调整,可能是难以独立验证逻辑的不透明“黑匣子”。

结论: Beancount.io 非常适合重视粒度可审核性和代码风格协作的团队。传统系统对于实时共享 GUI 访问的会计师来说更友好。

4. 成本和所有权

财务模型和数据所有权的概念截然不同。

Beancount.io 核心 Beancount 软件是开源且免费的。你只需为 Beancount.io 的增值服务付费,其中包括托管、智能自动化和高级功能。没有按席位许可费用,因此你可以扩展团队而不会产生额外费用。最重要的是,零供应商锁定。你的数据是你可以随时随地移动、编辑或存储的文本文件集合。

传统软件 这些服务采用订阅模式,通常按月或按年计费。定价通常根据功能分层,你可能会面临根据组织规模而定的每用户或每公司费用。这会产生依赖性;如果你停止付款,则可能会失去对数据和软件功能的访问权限。这种供应商锁定是一项重大的长期风险。

结论: 从长远来看,Beancount.io 的成本效益要高得多,尤其是对于重视数据主权的技术团队而言。传统软件提供可预测的订阅成本,但会造成长期依赖性。

5. 学习曲线和采用

你能多快上手并运行?

Beancount.io 学习曲线无疑更陡峭。采用此系统需要熟悉基于文本的编辑、理解基本语法以及熟悉 Git 等工具。但是,最初的投资会有回报。一旦掌握,Beancount 就能实现令人难以置信的快速、可重复的工作流程,并提供对你的财务状况更深入、更基础的了解。

传统软件 这些平台专为非技术企业主设计,并提供最小的入门障碍。你可以在几分钟内启动并运行、发送发票和对费用进行分类。也就是说,学习更高级的功能,例如自定义报告构建或设置多实体会计,仍然需要大量时间投入。

结论: 如果你愿意花时间学习一个强大的系统,那么 Beancount.io 是正确的选择。对于需要立竿见影的非技术用户来说,传统软件更容易上手。

并排比较

功能Beancount.io传统会计软件
核心理念会计即代码;纯文本分类账基于 GUI;表单驱动
数据格式开放(纯文本)专有(数据库)
数据所有权100% 用户拥有和可移植供应商控制;潜在的锁定
灵活性无限;使用 Python 完全可编写脚本受限于供应商的生态系统和 API
协作基于 Git;透明的更改历史记录基于角色的用户权限
透明度完全可审核;无隐藏计算某些计算可能不透明
成本模型开源核心;为托管/自动化付费每月/每年订阅(SaaS)
学习曲线对于非技术用户来说更陡峭低;专为快速入门而设计
理想用户开发人员、高级用户、数据分析师中小企业所有者、非技术团队

何时选择 each

最终的决定取决于你团队的技能、优先级和工作流程。

如果你符合以下条件,请选择 Beancount.io:

  • 是开发人员、数据分析师或技术倾向的高级用户。
  • 最重视绝对透明度、控制力和长期数据可移植性。
  • 想要完全自动化你的会计并将其深度集成到你的自定义工作流程中。
  • 习惯于以与源代码相同的严谨性处理你的财务记录。

如果你符合以下条件,请选择传统会计软件:

  • 想要一个快速入门、可视化的界面,无需任何技术设置。
  • 需要提供即时的、会计师友好的访问,只需最少的培训。
  • 更喜欢由供应商处理所有更新和合规性的托管解决方案。
  • 你的集成需求可以通过流行的现成应用程序来满足。

最后的想法

Beancount.io 并不是想成为一个更好的 QuickBooks——它是一种根本不同的思维方式。它代表会计即代码。对于技术专业人员来说,这种转变提供了与 Git 版本控制为软件开发带来的同样的飞跃:完全透明、完美再现性和最终控制。

同时,传统会计软件继续在开箱即用的易用性和为非技术团队提供的现成集成方面胜出。正确的选择不在于哪个总体上“更好”,而在于哪个完美适合你的工作流程、你的优先级以及你对财务数据要求的控制程度。

理解 Beancount 中的应收账款和应付账款

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

大家好!在今天的博客文章中,我们将深入探讨 Beancount 的世界,这是一款因其简洁和强大而备受推崇的复式记账工具。更具体地说,我们将讨论两个关键概念:应收账款和应付账款。

理解这些术语对于有效使用 Beancount(或任何复式记账系统)至关重要。但如果你是初学者,请不要担心——我们将一步一步地为你详细解释!

应收账款和应付账款:基础知识

应收账款和应付账款

在会计中,“应收账款”和“应付账款”是用于追踪欠款的术语。“应收账款”指他人欠你的钱,而“应付账款”指你欠他人的钱。

让我们举个例子:

  1. 应收账款 (A/R):假设你拥有一家书店,一位顾客赊账购买了一本书。他们欠你购买这本书的钱就是一笔应收账款。

  2. 应付账款 (A/P):另一方面,想象一下你从出版商那里订购了一套新书,但没有预先支付。你欠出版商的钱就是一笔应付账款。

在 Beancount 中,这些通常通过相应的账户进行追踪。这里的主要好处是,它能让你在任何时间点清晰准确地了解自己的财务状况。

在 Beancount 中设置应收账款和应付账款

你的 Beancount 文件结构可以根据你的需要简单或复杂。对于应收账款和应付账款,你可能希望在你的资产 (Assets) 和负债 (Liabilities) 部分下创建单独的账户。

这是一个简单的例子:

1970-01-01 open Assets:AccountsReceivable
1970-01-01 open Liabilities:AccountsPayable

追踪交易

收款方

设置好账户后,你可以追踪涉及应收账款和应付账款的交易。让我们看一个例子:

2023-05-29 * "Sold books to customer on credit"
Assets:AccountsReceivable 100 USD
Income:BookSales -100 USD

在这里,你将 100 美元添加到你的应收账款中,因为客户欠你这笔钱。同时,你将收入减少相同的金额以保持平衡(因为你尚未实际收到这笔钱)。

当客户最终付款时,你将这样记录:

2023-06-01 * "Received payment from customer"
Assets:Bank:Savings 100 USD
Assets:AccountsReceivable -100 USD

付款方

同样的原则也适用于应付账款,但符号相反:

2023-05-30 * "Bought books from publisher on credit"
Liabilities:AccountsPayable 200 USD
Expenses:BookPurchases -200 USD

当你还清债务时:

2023-06-02 * "Paid off debt to publisher"
Liabilities:AccountsPayable -200 USD
Assets:Bank:Checking 200 USD

总结

应收账款和应付账款是任何会计系统的核心。通过准确追踪这些,你可以全面了解自己的财务状况。

这只是一个起点,Beancount 的功能远不止于此。我希望这篇博客文章能帮助你澄清这些重要概念。一如既往,祝你记账愉快!

Beancount 速查表

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

账户名称示例

Assets:US:BofA:Checking

cheatsheet-en

账户类型

Assets          +
Liabilities -
Income -
Expenses +
Equity -

商品/货币

CNY, EUR, CAD, AUD
GOOG, AAPL, RBF1005
HOME_MAYST, AIRMILES
HOURS

指令

通用语法

YYYY-MM-DD <Directive> <Parameters...>

开立与关闭账户

2001-05-29 open Expenses:Restaurant
2001-05-29 open Assets:Checking USD,EUR ; 货币限制

2015-04-23 close Assets:Checking

声明商品/货币 (可选)

1998-07-22 commodity AAPL
name: "苹果电脑公司"

价格

2015-04-30 price AAPL   125.15 CNY
2015-05-30 price AAPL 130.28 CNY

备注

2013-03-20 note Assets:Checking "致电询问回扣事宜"

文档

2013-03-20 document Assets:Checking "path/to/statement.pdf"

交易

2015-05-30 * "关于此交易的描述"
Liabilities:CreditCard -101.23 CNY
Expenses:Restaurant 101.23 CNY

2015-05-30 ! "有线电视公司" "电话账单" #tag ˆlink
id: "TW378743437" ; 元数据
Expenses:Home:Phone 87.45 CNY
Assets:Checking ; 你可以省略其中一个金额

分录

  ...    123.45 USD                             简单
... 10 GOOG {502.12 USD} 带单位成本
... 10 GOOG {{5021.20 USD}} 带总成本
... 10 GOOG {502.12 # 9.95 USD} 带两种成本
... 1000.00 USD @ 1.10 CAD 带单位价格
... 10 GOOG {502.12 USD} @ 1.10 CAD 带成本与价格
... 10 GOOG {502.12 USD, 2014-05-12} 带日期
! ... 123.45 USD ... 带标记

余额断言与填充

; 仅断言指定货币的金额:
2015-06-01 balance Liabilities:CreditCard -634.30 CNY

; 自动插入交易以满足以下断言:
2015-06-01pad Assets:Checking Equity:Opening-Balances

事件

2015-06-01 event "location" "美国纽约"
2015-06-30 event "address" "梅街123号"

选项

option "title" "我的个人账本"

其他

pushtag #trip-to-peru
...
poptag #trip-to-peru
; 注释以分号开头

Beancount.io 简介

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

现代簿记为何重要

你还在用电子表格管理投资吗?虽然电子表格功能多样,但随着投资组合的增长,它们可能会变得笨重且容易出错。Beancount.io 应运而生——一个专为管理股票和加密货币投资组合而设计,既复杂又用户友好的投资追踪平台。Beancount.io 专为工程师和财务极简主义者打造,将强大的功能与直观的界面相结合,以简化你的投资追踪体验。

2019-09-07-introduction-to-beancount

Expenses

Income Statement

Balance Sheet

复式记账:准确性的基石

Beancount.io 建立在复式记账的原则之上——这是一种全球金融机构都在使用的久经考验的方法。该系统通过一个简单而强大的概念确保数学准确性:每笔财务交易都必须完美平衡。

在复式记账中,每笔交易至少需要两个分录——一个借方 (+) 和一个贷方 (-)——涉及不同的账户。这种内置的验证系统使得记录不平衡的交易几乎不可能,从而确保你的财务记录保持准确和可靠。

1970-01-01 open Income:BeancountCorp
1970-01-01 open Assets:Cash
1970-01-01 open Expenses:Food
1970-01-01 open Assets:Receivables:Alice
1970-01-01 open Assets:Receivables:Bob
1970-01-01 open Assets:Receivables:Charlie
1970-01-01 open Liabilities:CreditCard

2019-05-31 * "BeancountCorp" "Salary of May 15th to May 31st"
Income:BeancountCorp -888 USD
Assets:Cash 888 USD

2019-07-12 * "Popeyes chicken sandwiches" "dinner with Alice, Bob, and Charlie"
Expenses:Food 20 USD
Assets:Receivables:Alice 20 USD
Assets:Receivables:Bob 20 USD
Assets:Receivables:Charlie 20 USD
Liabilities:CreditCard -80 USD

如你在上面两个示例中所见,每笔交易都必须满足会计等式。

资产 = 负债 + 权益(即净资产)

我们使用 Martin Blais 的 Beancount 语法和 Jakob Schnitzer 的 Fava 网络项目来构建本网站。如果任何交易的分录总和不为零,它将向你发出警报。

Error Alert

现在你了解了我们如何强制执行账本的正确性。但你可能会问,这些“账户”是什么?

理解账户:水桶类比

将你的财务账户想象成一个相互连接的水桶系统,金钱像水一样在其中流动。这个类比使得复式记账变得直观:当你将资金从一个账户转移到另一个账户时,就像将水从一个水桶倒入另一个水桶一样——系统中水的总量(金钱)保持不变。

Beancount.io 引入了五种账户。

  1. 收入 — 其金额始终为负或在借方。这是因为你正在赚钱,然后资金从“收入”账户借记并贷记到你的“资产”账户。
  2. 支出 — 其金额始终为正或在贷方。这是因为你正在花钱,资金从“资产”或“负债”流向“支出”账户。
  3. 负债 — 其金额为正或为零。你的信用卡负债就是一个很好的例子,它会周期性地增减。
  4. 资产 — 其金额为正或为零。你的现金或房屋总是具有一定的价值。
  5. 权益 — 你的净资产。系统将自动为你计算。权益 = 资产 - 负债,它反映了你的财富状况。

现在你可以使用上述关键词打开你的自定义账户:

1970-01-01 open Assets:Cash
1970-01-01 open Assets:Stock:Robinhood
1970-01-01 open Assets:Crypto:Coinbase
1970-01-01 open Expenses:Transportation:Taxi
1970-01-01 open Equity:OpeningBalance

使用商品进行高级投资追踪

Beancount.io 擅长追踪多样化的投资,从股票到加密货币。让我们探讨它如何处理复杂的投资场景。例如,以下是你在 2014 年以每枚 100 美元的价格购买 10 枚比特币的记录方式:

2014-08-08 * "Buy 10 Bitcoin"
Assets:Trade:Cash -1000.00 USD
Assets:Trade:Positions 10 BTC {100.00 USD}

三年后,你以每枚 10,000 美元的价格出售它们(原始成本为每枚 100 美元,用 {100.00 USD} 标注),价格用 @ 10,000.00 USD 标注。

2017-12-12 * "Sell 2 Bitcoin"
Assets:Trade:Positions -2 BTC {100.00 USD} @ 10,000.00 USD
Assets:Trade:Cash 20,000.00 USD
Income:Trade:PnL -19,800.00 USD

或者相同的交易使用 @@ 20,000.00 USD,表示总价为 20,000 美元

2017-12-12 * "Sell 2 Bitcoin"
Assets:Trade:Positions -2 BTC {100.00 USD} @@ 20,000.00 USD
Assets:Trade:Cash 20,000.00 USD
Income:Trade:PnL -19,800.00 USD

交易所有分录的总和,包括 -2 BTC {100.00 USD},仍然和往常一样为零。

成本标签 {100.00 USD} 很重要,因为你可能以不同的成本购买了相同的商品。

100 BTC {10.00 USD, 2012-08-08}
10 BTC {100.00 USD, 2014-08-08}

如果你想简化流程,可以在开始时将账户设置为 FIFO 或 LIFO。FIFO 代表先进先出,而 LIFO 代表后进先出。在美国,美国国税局 (IRS) 使用 FIFO 来计算你的损益和相应税款。

1970-01-01 open Assets:Trade:Positions "FIFO"

然后当你以 -2 BTC {} 这样的简写形式出售时,Beancount 将自动应用 FIFO 策略并出售最旧的商品。

开始使用 Beancount.io

Beancount.io 是一个现代化的云端财务管理平台,它将你的文本交易记录转换为全面的财务报表,包括利润表、资产负债表和试算平衡表。通过将纯文本文件的可靠性与强大的可视化工具相结合,Beancount.io 帮助你精确控制财务生活,同时获得有关投资绩效的宝贵见解。

立即开始你的 Beancount.io 财务之旅——促销期间免费!