跳转到主要内容
透明且可审计的会计

透明且可审计的会计

Beancount 和 Fava 重新定义了簿记,采用透明、可追溯且可审计的方法,利用纯文本文件来实现财务管理的清晰性和问责制。

引言

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

Income statement of Apple's public Beancount ledger on beancount.io with net profit chart and income and expense breakdowns

Explore the live ledger →

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

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

2024-07-29 * "购买汉堡作为午餐"
    Assets:Cash            -5.00 USD
    Expenses:Food           5.00 USD

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

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

与版本控制 (Git) 集成: 纯文本会计的最大技术优势也许在于它与 Git 之类的版本控制系统无缝集成。 你的 .beancount 文件(或多个文件)可以存在于 Git 存储库中,从而允许你使用提交历史记录跟踪每个更改。 每次添加或修改交易都会变成一个 diff,可以逐行查看。 这提供了开箱即用的 “审计跟踪、无限‘撤消’和协作”。 例如,如果某个条目被编辑或删除,Git 将显示 更改了它、何时 更改以及 究竟更改了什么 – 类似于跟踪源代码中的更改。 这与不透明的会计数据库形成鲜明对比,后者可能只显示上次修改日期或需要特殊日志进行审计。 一家采用 Beancount 的公司报告说,使用 Git 允许多个会计师同时工作,并且知道 “谁在何时何地做了什么更改”,从而解决了他们在传统软件中面临的协作和更改跟踪问题。 在实践中,你甚至可以在 Git 中强制执行验证(例如,pre-commit hook 运行 Beancount 的检查并防止提交未平衡的总账)。 将总账视为代码意味着所有用于代码管理的强大工具 – diff、pull request、代码审查 – 都可以用于你的会计记录。

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

纯文本总账的可审计性优势

以纯文本格式存储财务记录可带来显着的可审计性和错误检查优势:

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

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

  • 自动错误检查: Beancount 包括强大的内置验证。 当你处理文件时,如果任何交易未平衡(借方 ≠ 贷方)、如果账户的交易与断言的余额不匹配,或者如果存在重复交易标识符之类的不一致,它将 出错。 一位用户指出 “由于 Beancount 的内部检查,我确信 [我的记录] 在输入到总账后是正确的。 没有失败的可能性……”。 换句话说,如果 Beancount 文件导入时没有错误,你可以高度确信基本的会计完整性(例如,所有交易平衡)完好无损。 例如,你可以从银行对账单中添加每月余额断言,如果你的交易与预期期末余额不符,Beancount 将 “抛出错误”。 这会立即捕获遗漏或拼写错误。 传统软件也可能强制执行复式记账平衡,但由于 Beancount 向用户公开更多内容,因此鼓励你添加显式检查(如余额断言)并直接查看这些检查的结果。

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

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

  • 无限撤消和实验: 由于文本 + 版本控制的结合,你可以尝试重组或重构你的账户而无需担心。 如果某个想法不起作用,你可以恢复到先前的提交。 这种自由鼓励随着时间的推移对会计结构进行改进和调整(例如,将一个账户拆分为多个账户,或添加新类别),这在传统系统中可能存在风险或一旦输入交易就不可逆转。 用户指出,通过 Git 检查点, “不用担心我们在尝试修改总账时会破坏某些内容”,因为可以随时回滚。 这意味着会计系统可以平稳地发展,并且可以在每个步骤中保留可审计的历史记录。

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

Beancount 的方法最大限度地提高了数据和逻辑的透明度:

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

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

  • 数据和应用程序的分离: 纯文本会计的一个关键设计方面是工具(Beancount、Fava)不 拥有 数据 – 你拥有。 数据文件是独立的,并被工具视为只读输入。 正如 plaintextaccounting.org 简介中指出的那样,该软件 “读取输入数据而不更改它,并且 [仅] 输出报告”,这使其 “易于理解和依赖”。 Beancount 永远不会自行写回你的总账文件; 任何更改都必须来自你(或你故意使用的编辑器工具)。 这使得人们非常有信心你所看到的就是你所输入的,没有任何隐藏的修改。 如果软件行为不端或出现错误,你的数据仍然安全且未更改 – 这是信任的关键点。 相比之下,不透明的会计系统可能会在升级期间或发生错误时更改数据,并且如果没有直接访问原始数据,你甚至可能没有意识到这一点。 使用 Beancount,如果报告中出现问题,你可以打开文本文件并直接检查它。

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

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

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

当使用专有会计解决方案将你绑定到特定公司或产品时,就会发生供应商锁定,这使得独立迁移或维护你的记录变得困难。 Beancount 和 Fava 由于是开源且基于纯文本,因此 实际上消除了锁定

  • 开源许可证和社区: Beancount(由 Martin Blais 于 2008 年左右启动)是免费和开源的,Fava 也是如此。 没有许可费、订阅费或使用限制。 你可以未经许可将这些工具用于个人财务、企业会计、非营利组织或任何目的。 由于源代码是开放的,因此如果 Beancount 的开发速度减慢或停止,社区可以继续维护或 fork 它。 你的软件不会突然消失或更改条款。 与可能关闭或更改定价的基于云的会计服务相比,这是一个安全网。 这也意味着你可以 拥有该流程:正如一位用户所说, “如果有什么我不喜欢的地方,我可以修改源代码,并确保我的数据在 20 年后仍然可用。” 数据的寿命是一个核心承诺 – 由于数据格式是纯文本且已记录,因此即使在几十年后,对其进行解析也应该是微不足道的。 相比之下,想想几十年前的 QuickBooks 文件或古代专有格式,这些格式今天很难打开(如果该软件甚至可以在现代系统上运行)。

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

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

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

  • 没有功能锁定: Fava(Web UI)的开源理念也意味着即使是高级功能也不是旨在锁定你。 例如,Beancount 托管服务的创建者指出,他们避免添加任何“绑定用户的私有功能” – 相反,他们将改进贡献回开源 Fava/Beancount 项目。 社区中的这种心态确保增强功能使每个人都受益,并且你不会停留在修改后的版本上。 换句话说,你可以随时自行托管或迁移到其他服务; 工作流程保持标准。 这与可能提供“导出”的供应商形成对比,但仅以竞争对手无法轻松导入的格式提供,从而将你困住,除非你与他们保持联系。

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

Fava:Beancount 的人类可读界面

Fava 是 Web 前端,可以补充 Beancount 的纯文本引擎。 它不会引入专有层 – 相反,它通过使数据更易于浏览来增强透明度和可审计性:

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

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

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

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

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

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

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

用例和现实场景

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

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

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

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

  • 与电子表格的比较: 值得注意的是,许多个人和小型组织都从电子表格开始进行会计。 Beancount 和类似的工具提供了一种更强大、可审计的替代方案。 电子表格缺乏强制执行的复式记账、易于破坏且难以进行版本控制。 正如一位用户指出的那样, “很难对电子表格进行版本控制”,并且错误可能会在不知不觉中蔓延。 迁移到纯文本会计可以提供电子表格灵活性的好处(因为你始终可以通过查询或脚本进行自定义计算) 而没有 不透明和脆弱的缺点。 每个条目都是显式的,你仍然可以通过 Fava 或命令行查询获得所有总和和类似于数据透视表的分项。 本质上,Beancount 可以被视为提供结构良好的总账的透明度以及数字处理的便利性。 它是为那些超出电子表格的可靠性但不希望将控制权交给黑匣子软件的人提供的解决方案。

与传统会计软件的比较

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

方面Beancount 和 Fava(纯文本会计)传统会计软件
数据格式纯文本文件 (UTF-8) – 人类可读、易于导出或操作。 根本没有专有编码。 你可以在任何文本编辑器中打开总账并理解它。通常是专有文件格式或数据库。 数据可能存储在需要软件解释的二进制 blob 中。 有限的直接可读性 – 通常必须使用应用程序的导出功能才能导出数据。
审计跟踪和历史记录通过 Git 或其他 VCS 在外部跟踪完整历史记录。 每次添加/修改都会通过提交元数据记录作者和时间戳。 没有什么真正丢失; 通过恢复到以前的提交,“撤消”是无限的。 总账本身可以包括用于更正的注释或标志,并且 Git 提供对更改的问责制。审计跟踪通常是 可选的 功能(如果它存在)。 某些软件会记录谁上次编辑了交易,但很少有每个字段更改的精细版本历史记录。 通常可以编辑甚至删除交易而没有永久跟踪,尤其是在单用户桌面设置中。 多用户系统(如 QuickBooks Enterprise 或 Oracle Netsuite)具有一些更改跟踪,但它不如 Git 历史记录透明或可访问。
逻辑的透明度完全透明的计算。 复式记账规则公开强制执行,并且报告是通过汇总总账数据生成的。 这些算法(开源代码)受到社区审查。 如果报告中出现一个数字,你可以准确地追踪哪些交易促成了它。 除非由总账指令或 Beancount 的良好记录的规则定义,否则不会发生任何事情。不透明的内部流程。 用户必须信任软件的报告模块才能准确地反映数据。 如果出现不一致,可能需要供应商支持才能进行调查。 如果软件不公开,则某些计算(例如,收入确认、折旧)的公式可能对最终用户不可见。 在闭源系统中,错误或怪癖可能仍然隐藏。
错误检查严格的复式记账强制执行和可选的断言。 如果账簿不平衡,系统会拒绝继续,从而强制修复错误。 其他插件可用于自定义验证。 用户立即意识到问题(在运行该工具时或通过 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 等工具进行纯文本会计比传统会计软件能带来更高的透明度、更容易的审计以及对个人财务数据的更多控制这一共识。