跳转到主要内容

Beancount 如何让账本保持透明且可审计

纯文本的 Beancount 和 Fava 账本保持透明且可审计:每一次更改都是可审查的文件差异,你可以追溯。详见正文说明。详见正文说明。详见正文说明。

引言

BeancountFava 是开源会计工具,旨在让簿记变得透明、可追溯且可审计。Beancount 是一个使用纯文本文件记录交易复式记账系统,而 Fava 是一个网页界面,以人类可读的报告和可视化的形式呈现这些记录。通过消除专有数据格式并利用版本控制,Beancount 实现了传统会计软件往往难以提供的清晰度和问责性。本报告探讨了 Beancount 的纯文本方法和 Fava 的用户友好界面如何协同工作,以增强各种场景下的透明度、可审计性和用户控制力。

探索一个实时示例账本:

在新标签页中打开 示例账本

Apple 在 beancount.io 上的公开 Beancount 账本损益表,包含净利润图表以及收入和支出明细

探索实时账本 →

使用 Beancount 进行纯文本簿记(技术方面)

纯文本数据: Beancount 将所有金融交易存储在纯文本文件中。每条记录都是代表一笔交易的人类可读行(或几行)。例如,一笔 5 美元的现金午餐购买可能记录为:

2024-07-29 * "Buy burger as lunch"
    Assets:Cash            -5.00 USD
    Expenses:Food           5.00 USD

在这种格式中,日期、描述和账户清晰可见。每笔交易必须平衡(总借方等于总贷方),因此像缺少账户或金额错误这样的问题会立即被软件的解析器捕获。这种简单的基于文本的领域特定语言意味着你的财务数据可以用任何文本编辑器读取或编辑,也可以用简单的脚本或命令处理。

文件结构: 一个 Beancount 账本文件通常包含开设账户、定义商品(货币)、记录交易以及可能的断言或余额检查的指令。账户按层级命名(例如 Assets:Bank:CheckingExpenses:Food:Grocery),使你的财务结构明确。你可以按时间顺序或逻辑顺序组织条目,甚至可以将账本拆分为多个文件(在主文件中包含它们)以便更好地组织。因为数据只是文本,你可以轻松地重新排列或重构账户——例如,在整个账本中重命名账户可以通过简单的查找替换或命令行脚本完成。Beancount 的创建者 Martin Blais 指出,“文本赋予力量”——你甚至可以使用像 sed 这样的工具在几秒钟内重新组织整个历史中的账户。

与版本控制(Git)的集成: 纯文本会计最大的技术优势可能是它与 Git 等版本控制系统的无缝集成。你的 .beancount 文件(或多个文件)可以放在 Git 仓库中,这样一旦你提交更改,它就会被记录在历史中。这是你自行设置的做法,而不是 Beancount 自动完成的:每次编辑在提交时进入审计跟踪,因此提交的纪律(或为你自动提交的钩子)将日常编辑变成可审查的记录。有了这一点,每笔交易的每次提交添加或修改都成为一个可以逐行审查的差异,提供了_“审计跟踪、无限的‘撤销’和协作”。对于已提交的更改,Git 显示做了更改、何时以及具体更改了什么——类似于跟踪源代码的更改;未提交的编辑留在你的工作文件中,还不是该历史的一部分。这与不透明的会计数据库形成鲜明对比,后者可能只显示最后修改日期或需要特殊日志进行审计。一家采用 Beancount 的公司报告说,使用 Git 允许多个会计师同时工作,并知道“谁在何时何地做了什么更改”_,解决了他们在传统软件中面临的协作和更改跟踪问题。在实践中,你甚至可以在 Git 中强制执行验证(例如,一个 pre-commit 钩子 来运行 Beancount 的检查并防止提交不平衡的账本)。将账本视为代码意味着所有强大的代码管理工具——差异、拉取请求、代码审查——都可以用于你的会计记录。

数据输入和可移植性: 因为 Beancount 的格式是纯文本,所以很容易从其他来源导入数据或导出用于其他用途。你可以手动编写条目或编写脚本将银行对账单转换为 Beancount 格式。Beancount 社区为常见格式提供了导入器,其他纯文本会计工具(Ledger、hledger)也有类似的格式,并且有转换器可用。你的数据不依赖于单一程序——正如一位指南所强调的,“你永远不会遇到你的交易数据以未知格式的二进制块形式存在的情况”。事实上,如果需要,你可以拿你的 Beancount 文件编写一个简单的解析器或使用另一个工具来读取它。这使得技术基础非常面向未来。

纯文本账本的审计优势

将财务记录存储在纯文本中带来了显著的审计和错误检查优势:

  • 细粒度的更改历史: 对账簿的每次已提交更改都通过版本控制跟踪。这创建了一个按时间顺序的编辑记录,如果使用 GitHub 等服务或签名提交实践,很难篡改。这类似于拥有所有交易的详细审计日志。错误可以追溯到引入它们的精确提交,历史版本的账簿很容易检索。在纯文本账本中,“数据可以有效地进行版本控制,提供审计跟踪和无限的‘撤销’” 用于更正。相比之下,许多传统会计系统要么不保留完整的编辑历史,要么以难以理清的方式混合数据和调整。

  • 可追溯性和同行评审: 因为账本是文本,多人可以像审查代码一样审查它。例如,在一个小型组织中,一个人可以提议更改账本(添加交易、调整条目)并打开拉取请求供第二个人审查。这种同行评审过程可以在错误或不一致被接受之前捕获它们,就像代码审查捕获错误一样。上面提到的协作工作流程对于使用 QuickBooks 的团队来说是不可能的,这促使他们迁移到 Beancount 以获得更好的多用户支持。纯文本方法使_协作_变得自然——协调差异和合并来自不同会计师的更改很简单,避免了某些桌面会计文件的“文件锁定”或单用户限制。

  • 自动化错误检查: Beancount 包含强大的内置验证。当你处理文件时,如果任何交易不平衡(借方 ≠ 贷方)、账户的交易与断言的余额不匹配,或者存在重复交易标识符等不一致,它会报告错误。值得精确说明机制,因为它决定了你能多大程度依赖它。bea check 以非零状态退出并打印这些问题,因此干净运行是一个真正的信号。相比之下,Python 加载器返回解析的条目错误列表一起——它不会停止——因此任何基于 Beancount 构建的工具都必须检查该错误列表;忽略它的工具可能会带着无效账本继续运行。余额断言以同样的方式工作:从银行对账单添加月度断言,Beancount 会在你的交易与预期期末余额_“不匹配时抛出错误”_,一旦你运行检查就会浮现遗漏或拼写错误。诚实的总结是,Beancount 验证它被要求检查的内容——平衡、断言、重复 ID——并直接呈现结果;它不保证每个下游脚本或报告都会处理这些结果,因此将干净的 bea check 视为检查点,而不是自动保证。因为 Beancount 比封闭软件向用户暴露更多,你被鼓励添加显式检查,如余额断言,并自己阅读结果。

  • 更正条目保留历史: 在正确的会计中,人们不会删除错误的交易,而是添加更正条目。纯文本账本鼓励这种做法(而且使用 Git,即使你_确实_更改了过去的条目,以前的版本仍保留在历史中)。审计员可以清楚地看到更正轨迹,而不是怀疑数据被更改而没有记录。虽然技术上没有什么阻止用户编辑文本文件的历史(如果他们有权访问),但使用具有提交完整性(甚至签名提交)的 Git 可以减轻未经授权或未跟踪的更改。开放性也培养了好习惯:一个讨论指出,在纯文本会计中,你_“不能[简单地]静默更正条目”而不被察觉;你应该“制作更正条目……[以]保留审计跟踪”_。总之,系统本身是透明的,因此任何篡改账簿的尝试都可能留下痕迹。

  • 外部审计员的审计跟踪: 如果你需要接受正式审计(对于企业或非营利组织),提供 Beancount 账本就像提供带有完整版本历史的源代码。审计员可以审查原始交易日志,或者你可以直接从源数据生成支持文档(如日记账报告或资产负债表),确保一致性。一位需要向当局证明税务计算的 Beancount 用户赞赏拥有_“每个资产批次完整历史的可靠记录”,使得“很容易指出”_并证明数字是如何得出的。纯文本记录的清晰性,加上导出的报告,可以加快审计,因为没有任何东西隐藏在软件后面——报告中的每个数字都可以追溯到账本文件中的一行。

  • 无限撤销和实验: 因为文本 + 版本控制的组合,你可以尝试重组或重构账户而不用担心。如果某个想法不奏效,你可以回退到之前的提交。这种自由鼓励随着时间的推移改进和调整会计结构(例如,将一个账户拆分为几个,或添加新类别),而在传统系统中,一旦输入交易,这可能是危险的或不可逆的。用户指出,使用 Git 检查点,“不用担心在实验更改账本时会破坏某些东西”,因为总是可以回滚。这意味着会计系统可以优雅地发展,并且在每一步都保留可审计的历史。

通过开放数据和开源实现透明度

Beancount 的方法在数据和逻辑方面都最大化了透明度:

  • 消除不透明格式: Beancount 使用任何人都能阅读的简单开放格式。与可能将数据存储在专有二进制文件或锁定数据库中的典型会计软件不同,Beancount 账本只是文本。这种_“开放格式”意味着“你的数据是开放的,并将永远保持开放”。你不需要 Beancount 来理解数据——在紧急情况下,你可以在文本编辑器中打开账本或打印出来。通过消除专有数据孤岛,Beancount 确保你永远不会依赖特定供应商的软件来访问自己的财务记录。例如,许多 QuickBooks 用户经历过难以导出所有数据或将其转换到新系统的问题。使用 Beancount,转换很简单:数据已经是通用格式。用 Beancount 文档的话说,“使用开放格式,你永远不会遇到数据以未知格式的二进制块形式存在且软件不受支持的情况”_。

  • 会计逻辑的清晰性: 传统会计程序在幕后进行大量计算——汇总账户、应用汇率、计算余额等。虽然 Beancount 也这样做,但逻辑对用户并不隐藏。复式记账的规则是透明且一致的:例如,如果余额不对,Beancount 会告诉你确切是哪个账户和哪笔交易导致的。此外,Beancount 本身是开源 Python 代码;如果有人真的想审计_如何_计算,比如说,投资的平均成本基础或如何生成资产负债表,他们可以检查源代码或依赖社区对该代码的审查。软件的行为是有文档记录且确定性的——没有神秘的自动更正条目或未披露的假设。这与一些金融软件形成对比,这些软件可能会自动调整条目(创建隐藏的“舍入差异”账户等)而用户不完全知情。使用 Beancount,每个报告中的每个数字都来自用户提供的交易,通过开放的计算过程。

  • 数据与应用程序的分离: 纯文本会计的一个关键设计方面是工具(Beancount、Fava)不_拥有_数据——你拥有。数据文件是独立的,工具将其视为只读输入。正如 plaintextaccounting.org 的介绍所指出的,软件_“读取输入数据而不更改它,[并且]只输出报告”,这使得它“易于理解和依赖”_。Beancount 永远不会自行写回你的账本文件;任何更改都必须来自你(或你特意使用的编辑器工具)。这让你非常有信心,你看到的就是你输入的,没有隐藏的修改。如果软件行为异常或有错误,你的数据保持安全且不变——这是信任的关键点。相比之下,不透明的会计系统可能在升级或出现错误时更改数据,而无需直接访问原始数据,你可能甚至不会意识到。使用 Beancount,如果报告中有似乎不对的地方,你可以打开文本文件直接检查。

  • 开源社区和审查: Beancount 和 Fava 都是开源的,这意味着成百上千双眼睛可以审查它们的代码并贡献改进。不仅在数据上,而且在工具本身也有透明度——没有不透明的算法。例如,如果对折旧计算方式或货币转换处理方式有任何担忧,可以检查 Beancount 源代码或与开发者社区讨论。这种社区驱动的方法也导致快速识别错误或不一致,这些通常公开记录(例如,在 GitHub 问题上)并公开修复。用户甚至可以编写插件来扩展 Beancount 的功能或强制执行自定义规则,所有这些都在开放环境中进行。在某种程度上,这种开放类似于科学透明度——方法论可供审查,而不是“黑匣子”。

  • 对非技术利益相关者的透明度: 纯文本并不意味着非技术人士被蒙在鼓里。事实上,它可以增强对会计师、审计员或团队成员等利益相关者的透明度,因为很容易向他们提供可以用基本工具检查的完整记录。可以从账本生成 PDF 或 HTML 报告以提高可读性,但这些始终与源数据相关联。没有秘密的“第二套账簿”。这个特性对于重视开放性的组织尤其重要。例如,非营利组织可以在网上或 GitHub 上公开发布其 Beancount 账本文件,供任何人检查,确信读者可以自己验证总数或查看交易细节,而无需特殊软件。事实上,有人建议使用此类工具_“开源[组织的]财务数据”_将有利于非营利组织和政府机构的透明度。纯文本会计使这种场景成为可能。

使用开源工具避免供应商锁定

当使用专有会计解决方案将你绑定到特定公司或产品,使得难以独立迁移或维护记录时,就会发生供应商锁定。Beancount 和 Fava,凭借开源和基于纯文本的特性,几乎消除了锁定

  • 开源许可证和社区: Beancount(由 Martin Blais 大约在 2008 年创建)是免费开源的,Fava 也是如此。没有许可费、订阅或使用限制。你可以将工具用于个人财务、企业会计、非营利组织或任何目的,无需许可。因为源代码是开放的,如果 Beancount 的开发曾经放缓或停止,社区可以继续维护或分叉它。你的软件不会突然消失或改变条款。与可能关闭或改变定价的基于云的会计服务相比,这是一个安全网。这也意味着你可以拥有过程:正如一位用户所说,“如果有什么不合我意,我可以修改源代码,并确保我的数据在 20 年后仍然可用。” 数据的寿命是一个核心承诺——由于数据格式是纯文本且有文档记录,即使几十年后,解析它也应该很简单。相比之下,想想几十年前的 QuickBooks 文件或古老的专有格式,今天很难打开(如果软件甚至能在现代系统上运行的话)。

  • 没有专有数据孤岛: 你在 Beancount 中的会计数据不会锁定在供应商的导出/导入门后面。你可以拿 .beancount 文件在任何文本编辑器中打开,或使用纯文本会计生态系统中的各种工具(鉴于该格式的流行,有很多)。迁移到不同系统很简单:例如,存在将 Ledger 或 CSV 数据转换为 Beancount 以及反向转换的工具。没有锁定也意味着你不会被迫升级。如果 Beancount 发布新版本,你可以选择使用或不使用;你现有的数据仍然有效。没有强制数据迁移的概念,因为供应商决定更改他们的数据库格式或 API。

  • 避免商业依赖: 许多企业超越了其会计软件的能力,或对供应商的限制感到沮丧。前面提到的切换到 Beancount 的公司指出了本地和云专有解决方案的问题,包括对_“提供软件的公司的持久性或寿命”_的担忧。通过切换到开源工具,他们确保会计过程在自己的控制之下,不受供应商命运的影响。本质上,Beancount 使用户摆脱了对单一供应商的依赖,或在扩展时面临昂贵的企业升级。也没有附加模块的追加销售——一切都在你手中,可以根据需要扩展。

  • 数据可移植性: 因为 Beancount 的数据可以轻松导出为常见格式(CSV、JSON 通过各种命令,或者数据可以加载到 Python 中进行自定义导出),你可以不受限制地与其他系统集成。例如,如果需要向税务申报软件提供财务数据,你可以编写导出脚本。或者如果以后决定迁移到基于 SQL 的系统,你可以将账本导入那里。关键是你的数据始终以可用形式属于你。在专有系统中,即使你可以导出,也常常会丢失一些信息或保真度(例如,丢失附件、元数据或确切的更改审计跟踪)。使用 Beancount,所有信息(除了你仍然存储在常规文件中的任何附加文档)都是纯文本并留在你身边。

  • 没有功能锁定: Fava(网页界面)的开源哲学也意味着即使是高级功能也不是为了锁定你。例如,Beancount 托管服务的创建者指出,他们避免添加任何“绑定用户的私有功能”——相反,他们将改进贡献回开源的 Fava/Beancount 项目。社区中的这种心态确保改进惠及每个人,你不会被困在修改版本上。换句话说,你可以随时自托管或迁移到另一个服务;工作流程保持标准。这与可能提供“导出”的供应商形成对比,但只提供竞争对手不容易导入的格式,从而困住你,除非你留在他们那里。

总之,通过使用 Beancount 和 Fava,你避开了供应商锁定的常见陷阱。你的数据保持可访问,软件在你的控制之下,你有自由根据需要调整或迁移,而不会失去记录的完整性。没有年费或强制升级——透明度和简单性保护你免受这些依赖。

Fava:Beancount 的人类可读界面

Fava 是补充 Beancount 纯文本引擎的网页前端。它不引入专有层——相反,它通过使数据更容易探索来放大透明度和可审计性:

(Fava) Fava 的网页界面提供丰富、人类可读的账本视图。例如,截图显示了一个按类别划分的收入和支出的“损益表”树状图分解。这样的可视化和报告帮助用户和审计员快速掌握财务模式并识别异常。

功能和报告: Fava 读取你的 Beancount 文件并生成各种报告:损益表、资产负债表、试算平衡表、现金流量表等,全部通过网页浏览器。它还提供可导航的交易日记账(你可以点击一个账户并查看所有过账)、随时间变化的账户余额,甚至还有用于自定义问题的查询界面。至关重要的是,这些报告是从文本账本即时生成的,这意味着它们始终与源数据保持同步,并反映账本中的任何更改。没有单独的数据库会失去同步。出于审计目的,Fava 可以作为利益相关者检查账簿的只读门户(除非你启用编辑功能)。会计师或审计员可以使用 Fava 轻松地从高级报表深入到基础交易,这比逐行检查原始文本文件用户友好得多。

使审计更容易: 通过以熟悉的会计报表和交互式图表呈现数据,Fava 允许非技术用户审计和理解 Beancount 中维护的账簿。例如,外部会计师可以被授予 Fava 的访问权限(或 Fava 报告的导出)。一家使用 Beancount 的公司指出,为了税务目的,他们生成财务的 HTML 导出,他们的注册会计师_“可以毫无困难地浏览[财务]”,并且他们“使用 Fava(一个 Beancount 网页界面)获取各种报告”_来帮助这个过程。Fava 也可以突出显示错误或警告——如果 Beancount 报告任何问题(如不平衡的交易或失败的断言),Fava 的界面将显示错误指示器,因此你立即知道有些事情需要注意。这实际上是在 GUI 中方便地呈现审计检查。

Fava 中数据的透明度: 重要的是要注意,Fava 不会掩盖数据或允许“秘密”编辑。通过 Fava 的网页编辑器(Fava 有一个编辑器和交易输入表单)添加的任何交易实际上都会写入 Beancount 文本文件。这意味着唯一的事实来源仍然是文本账本。Fava 的角色是以各种有用的方式呈现该事实来源。例如,Fava 的图表可以显示你的净资产随时间变化,或按类别划分的费用饼图。这些是从数据动态生成的,并提供了原始数据中可能难以发现的趋势的透明视图。异常,如费用类别的突然飙升,变得视觉上明显,可以点击查看底层条目。在传统系统中,你可能必须运行多个报告或查询来调查异常;Fava 使其交互式。

没有黑匣子计算: 因为 Fava 在底层使用 Beancount,它继承了开放的计算逻辑。如果 Fava 显示一个余额,你可以相信它是账本文件中所有相关交易的总和。如果某些事情似乎不对,可以在 Fava 中通过检查账户的交易直接追踪。Fava 甚至允许将查询结果导出为 CSV 或 Excel,因此审计员可以获取数字并独立交叉验证。本质上,Fava 充当透明 Beancount 数据的_透镜_,而不是改变数据的过滤器。这种设计意味着你得到两全其美:文本形式的清晰审计跟踪,以及用于分析的友好界面。

用户体验和采用: 通过提供现代网页界面,Fava 降低了不习惯命令行工具的人的障碍。例如,在个人财务使用中,一个伴侣可能处理文本编辑,但另一个伴侣可以简单地登录 Fava 查看账户的当前状态。(这个确切场景是一个 Beancount 用户的动机,他构建了一个协作网络服务——他的伴侣发现纯文本**“是一个负担”**,所以他设置了共享的 Fava 访问以便轻松查看。)Fava 可以在本地运行或托管在服务器上,多个查看者可以以只读方式并发访问,使其适合团队中的透明度。值得注意的是,Fava 还支持添加文档链接:例如,你可以将收据或发票的 PDF 附加到交易(通过元数据),Fava 将显示一个超链接。在审计期间,这非常方便——在 Fava 中审查账簿的审计员可以点击交易的文档链接,立即看到原始收据或发票图像进行验证。记录和文档的这种紧密耦合使审计跟踪更加强大(无需翻找文件柜;证据只需点击一下)。

总之,Fava 通过将账本变成可访问的交互式账簿来加强 Beancount 的透明度使命。它在某种意义上实现了实时审计——任何有权访问的人都可以探索数据、应用过滤器(按日期、账户、收款人、标签等),并确保报告的财务与底层交易匹配。所有这些都不会损害系统的开放性,因为 Fava 本身是开源的,并且在任何时候都不会引入专有数据。

用例和现实世界场景

Beancount 和 Fava 的透明度和可审计性惠及从个人财务到组织会计的各种场景。以下是一些值得注意的用例:

  • 个人财务爱好者: 管理自己财务的个人可以使用 Beancount 实现高水平的清晰度和控制力。对于熟悉技术的人来说,拥有纯文本账本意味着他们可以精确跟踪每笔费用、投资和预算类别。这里的_可审计性_转化为个人安心——你可以通过审查差异或使用 Fava 的图表回答诸如“我记录那笔交易了吗?”或“我上个月的支出如何变化?”这样的问题。错误检查和复式记账系统确保跟踪中的错误被最小化或标记。一位博主将他们的理想系统描述为_“万无一失:很难搞乱我的报告,并且很容易知道我何时犯了错误”,这正是 Beancount 的验证所提供的。这样的用户也重视系统是_详尽_的(可以处理他们财务的所有方面)和_面向数据_的(允许随时间分析)。Fava 的界面满足了“漂亮界面和导出能力”的需求,以便与财务顾问分享数据或只是自己可视化。工具是 FOSS(自由开源软件)的事实给个人信心,“数据在 20 年后仍将可用”_——这是终身财务记录的重要考虑因素。在实践中,个人用户已经自动化了银行导入,编写了自定义脚本对费用进行分类,甚至使用 Beancount 跟踪忠诚度积分或加密货币。他们以与软件项目相同的严谨性对待财务,产生可以非常详细的个人审计跟踪。例如,如果需要与银行争议交易,或者只是想以完全透明的方式反思支出习惯,知道每一美元去了哪里,这可能非常宝贵。

  • 小型企业和初创公司: 小型公司和初创公司通常需要协作簿记和审计就绪的记录,但可能没有预算购买高端会计系统。带有 Git 仓库的 Beancount 可以充当_轻量级会计系统,支持多用户_。多个团队成员可以通过拉取请求或共享仓库为账本做出贡献(例如,一个输入费用,另一个记录销售),并且每次更改都被跟踪。前面提到的拥有约 60 名员工的公司切换到 Beancount 的例子很有说服力:他们引用多用户协作历史更改跟踪作为放弃 QuickBooks 的原因。使用 Beancount,他们可以看到每笔条目的确切作者,并在需要时回退更改,这在以前的软件中是不可能的。对企业的另一个实际好处是与其他系统的集成——由于 Beancount 数据是可访问的,公司的开发人员可以编写脚本将会计数据与其他工具(用于预算、财务建模等)集成,而无需处理供应商的 API 或导出怪癖。Fava 可以在内部使用,让经理按需查看财务报告,而不会冒意外修改数据的风险。此外,企业可以通过链接附加发票、收据和合同文档,因此账本成为每笔交易的一站式审计文件(非常适合会计师进行季度审查或准备税务申报)。至关重要的是,使用开源工具意味着企业不支付订阅费,并避免超出软件能力的风险。如果他们需要新报告或自定义功能,他们可以自己实现插件或查询。例如,一家处理多币种和股票期权会计的初创公司发现 Beancount 的灵活性(处理成本基础、批次等)优越,并根据自己的需求定制——这在锁定系统中很难或不可能做到。简而言之,小型企业获得一个任何利益相关者或审计员都可以检查的_透明账本_,并保留对如何管理和呈现财务数据的完全控制。

  • 非营利组织和非政府组织: 重视透明度的组织——如慈善机构、开源项目资助团体或非政府组织——发现与 Beancount/Fava 的意识形态一致。他们可以保持账簿对捐助者、董事会和公众开放和负责。通过发布账本(或应要求提供),他们允许外部观察者验证资金是否按预期使用。因为一切都是复式记账且可审计的,捐助者获得更高的保证,财务报表没有被篡改——他们可以追踪从收入账本到费用分配的捐赠。一些非营利组织也有志愿会计师;使用纯文本工作流程意味着志愿者可以从任何地方贡献,使用标准的 Git 协作,而无需昂贵的许可证。关于非营利组织甚至政府预算的_“开源会计账簿”_的讨论越来越多。纯文本账本使这成为可能,因为访问障碍低(只需打开文件或在 GitHub 等平台上查看),数据完整性受格式和历史保护。想象一个接受赠款的非政府组织——每笔赠款的使用可以通过账本标记和跟踪,审查者可以在 Fava 中按该标签过滤,查看赠款覆盖的所有费用。这种透明度水平建立利益相关者的信任。此外,没有供应商锁定在这里至关重要:非政府组织可能存在几十年,他们需要确保财务记录不会因为软件公司倒闭或开始收取他们负担不起的费用而变得不可读。使用 Beancount 通过保证长期可访问性解决了这个问题。甚至监管合规也可以简化:如果审计员需要不常见的报告,数据的开放性意味着可以生成它,而无需等待供应商。例如,如果监管机构要求按特定项目细分所有支出,非政府组织可以编写一个快速的 Beancount 查询(或使用 Fava 的过滤器)来精确生成,而不是局限于软件供应商提供的任何报告。

  • 与电子表格的比较: 值得注意的是,许多个人和小型组织从电子表格开始进行会计。Beancount 和类似工具提供了更强大、可审计的替代方案。电子表格缺乏强制性的复式记账,容易损坏,且难以版本控制。正如一位用户指出的,“对电子表格进行版本控制非常困难”,错误可能在没有通知的情况下悄悄出现。转向纯文本会计提供了电子表格灵活性的好处(因为你可以随时通过查询或脚本进行自定义计算)没有不透明和脆弱的缺点。每个条目都是明确的,你仍然可以通过 Fava 或命令行查询获得所有总和和类似数据透视表的分解。本质上,Beancount 可以被视为提供了结构良好的账本的透明度,同时具有数字处理的便利性。对于那些超越了电子表格可信度但不想将控制权交给黑匣子软件的人来说,这是一个解决方案。

与传统会计软件的比较

很明显,Beancount+Fava 在透明度、可审计性和控制力方面与传统会计软件(如 QuickBooks、Xero、Sage,甚至一些开源工具如 GnuCash)有显著不同。下表突出了关键差异:

方面Beancount 和 Fava(纯文本会计)传统会计软件
数据格式纯文本文件(UTF-8)——人类可读,易于导出或操作。完全没有专有编码。你可以在任何文本编辑器中打开账本并理解它。通常是专有文件格式或数据库。数据可能存储在需要软件解释的二进制块中。直接可读性有限——通常必须使用应用程序的导出功能才能取出数据。
审计跟踪和历史通过 Git 或其他 VCS 在外部跟踪完整历史。每次添加/修改都记录作者和时间戳(通过提交元数据)。没有任何东西真正丢失;“撤销”通过回退到以前的提交是无限的。账本本身可以包含更正注释或标志,Git 为更改提供问责。审计跟踪通常是_可选_功能(如果存在的话)。一些软件记录谁最后编辑了交易,但每个字段更改的细粒度版本历史很少见。通常可以编辑甚至删除交易而没有永久痕迹,尤其是在单用户桌面设置中。多用户系统(如 QuickBooks Enterprise 或 Oracle Netsuite)有一些更改跟踪,但不像 Git 历史那样透明或可访问。
逻辑透明度完全透明的计算。复式记账规则公开执行,报告通过汇总账本数据生成。算法(开源代码)受社区审查。如果报告中出现一个数字,你可以追踪确切哪些交易贡献了它。除非由账本指令或 Beancount 有据可查的规则定义,否则不会发生任何事情。不透明的内部过程。用户必须信任软件的报告模块准确反映数据。如果出现不一致,可能需要供应商支持来调查。某些计算(例如,收入确认、折旧)的公式可能对最终用户不可见,如果软件不暴露它们。在闭源系统中,错误或怪癖可能保持隐藏。
错误检查严格的复式记账强制和可选断言。运行 bea check 报告每个不平衡交易或失败的断言并以非零状态退出,因此问题立即浮现,应在你依赖报告之前修复(可嵌入的加载器返回这些错误以及条目,而不是停止)。额外的插件可用于自定义验证。用户在运行工具或通过 Fava 的错误指示时被告知问题。差异很大——许多系统在每笔交易中强制平衡,但有些允许暂时不平衡状态或自动平衡条目。批量数据导入可能不会标记重复或逻辑错误,除非手动运行审计报告。用户可能只在核对期间或根本不会发现错误。一些软件有审计报告,但必须调用和解释,而不是错误提前出现。
控制和自定义用户拥有完全控制:他们可以编写自定义脚本(在 Python 中或使用 Beancount 的查询语言)生成专门报告或自动化任务。数据可以用标准文本工具进行批量编辑。作为开源,可以扩展功能或修复错误。Beancount 有插件系统,Fava 也支持扩展。这意味着会计系统可以适应独特需求(例如,跟踪非货币单位、与其他系统集成),而无需等待供应商。通常限于供应商提供的内容。一些软件允许插件或附加组件,但在受限框架内。自定义报告可能需要使用供应商的脚本语言或外部 API(如果可用)——这可能是有限的或需要额外购买。批量编辑或全局更改(如跨所有交易重命名账户)可能需要编写 SQL(对于有权访问的人)或完全不可能,除非导出 CSV 并重新导入。用户通常不能自己修复软件中的问题,必须等待官方更新。
供应商锁定没有。软件免费使用,数据格式开放。你可以随时通过转换文本迁移到另一个系统(甚至到其他纯文本系统如 Ledger/hledger 或 CSV 用于电子表格使用)。不依赖单一公司;更新由社区驱动。即使 Beancount 停产,由于格式的简单性,你的数据仍然可访问锁定风险高。数据通常需要特定的导出程序才能在其他地方使用,这可能无法捕获所有内容(例如,附件或完整审计日志可能无法导出)。切换软件可能昂贵且耗时,通常需要第三方转换工具或重新开始。如果软件是订阅制的,当你停止支付时,你可能失去对数据的访问,或者如果公司关闭服务。即使是使用 XML 或 SQL 后端的开源 GUI 软件(如 GnuCash)也更难进行版本控制,并可能将你绑定到该格式。

(来源:Beancount 文档和用户报告,以及典型专有软件行为的各种供应商文档。)

如上所示,Beancount 和 Fava 强调透明度、可审计性和用户赋权,而传统会计软件通常以不透明和对软件供应商的依赖为代价来优先考虑便利性。在理解“我的账簿中发生了什么变化以及为什么”方面,差异尤其明显——使用版本控制下的纯文本账本,这个问题很容易回答,但使用封闭的会计程序可能需要梳理日志(如果存在的话)。权衡是纯文本会计可能需要更多的初始设置和技术知识(编辑文本文件、使用 Git 等),但回报是一个你完全控制并可以随时审计的记录系统。

结论

Beancount 和 Fava 共同展示了会计如何从黑匣子操作转变为开放、可验证的过程。通过使用纯文本账本文件,Beancount 使每笔交易都可检查,每次更改都可跟踪,产生一个具有固有完整性和审计跟踪的会计系统。Fava 通过以可访问的格式呈现数据——将原始账本变成动态报告和图表——建立在这个基础上,而不会损害底层数据的透明度。

在一个财务错误和欺诈可能隐藏在专有系统背后的世界里,Beancount 采取的方法提供了一种令人耳目一新的替代方案:完全透明,数据和逻辑都公开。无论是为了个人安心、协作的企业簿记,还是公共问责,这个纯文本会计生态系统提供了强有力的保证,数字可以被信任和验证。它避免了供应商锁定的陷阱,确保一个人的财务记录仍然是自己的。简而言之,Beancount 和 Fava 不仅使会计更用户友好和灵活,而且从根本上更值得信赖——这是任何管理财务信息的人不可估量的属性。

参考: 本报告中的所有信息均来自官方 Beancount 文档、用户体验和纯文本会计社区的讨论。主要来源包括 Martin Blais 的 Beancount 设计笔记、plaintextaccounting.org 知识库、来自 Hacker News 和社区论坛的用户案例研究,以及 Fava 的文档。这些说明了共识,即使用 Beancount 和 Fava 等工具的纯文本会计比传统会计软件带来更大的透明度、更容易的审计和对财务数据的更多控制。

来源:https://beancount.io/zh/docs/Solutions/transparent-and-auditable