使用 Beancount 和 Fava 实现透明且可审计的会计
引言
Beancount 和 Fava 是开源会计工具,旨在使簿记 透明、可追溯且可审计。 Beancount 是一个复式记账系统,它使用纯文本文件来记录交易,而 Fava 是一个 Web 界面,它以人类可读的报告和可视化形式呈现这些记录。 通过消除专有数据格式并利用版本控制,Beancount 实现了一种清晰度和问责制,这是传统会计软件通常难以提供的。 本报告探讨了 Beancount 的纯文本方法和 Fava 的用户友好界面如何协同工作,以增强各种情况下的透明度、可审计性和用户控制。
使用 Beancount 进行纯文本簿记(技术方面)
纯文本数据: Beancount 将所有财务交易存储在纯文本文件中。 每个条目都是人类可读的行(或多行),表示一笔交易。 例如,一笔 5 美元的现金午餐购买可以记录为:
2024-07-29 * "购买汉堡作为午餐"
Assets:Cash -5.00 USD
Expenses:Food 5.00 USD
在这种格式中,日期、描述和账户清晰可见。 每笔交易必须平衡(借方总额等于贷方总额),因此软件解析器会立即捕获诸如缺少账户或金额不正确之类的错误。 这种用于会计的简单的基于文本的 领域特定语言 意味着您可以使用任何文本编辑器读取或编辑您的财务数据,并使用简单的脚本或命令进行处理。
文件结构: Beancount 总账文件通常包含用于打开账户、定义商品(货币)、记录交易以及断言或余额检查的指令。 账户按层次结构命名(例如 Assets:Bank:Checking、Expenses: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 浏览器生成各种报告:损益表、资产负债表、试算平衡表、现金流量表等。 它还提供可导航的交易