跳转到主要内容

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

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

引言​

Beancount 和 Fava 是开源会计工具,旨在让记账变得透明、可追溯、可审计。Beancount 是一个复式记账系统,使用纯文本文件记录交易;Fava 则是一个 Web 界面,将这些记录以人类可读的报告和可视化形式呈现出来。通过摒弃专有数据格式并借助版本控制,Beancount 实现了传统会计软件往往难以提供的清晰度和可问责性。本报告探讨 Beancount 的纯文本方法与 Fava 的用户友好界面如何协同工作,在各种场景中提升透明度、可审计性和用户掌控力。

看看一个实时账簿示例:

在新标签页中打开 Example Ledger

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

探索实时账簿 →

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

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

2024-07-29 * "Buy burger as lunch"
    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 仓库中,这样一旦你提交(commit)改动,它就被记录在历史里。这是一种你需要自己建立的实践,而不是 Beancount 自动完成的:每次编辑在提交时才进入审计轨迹,因此提交的纪律(或者一个替你自动提交的钩子)才是将日常编辑变成可审查记录的关键。有了这套机制,每次提交的交易新增或修改都会变成一个可以逐行审查的 diff,提供了*“审计轨迹、无限次的‘撤销’以及协作能力”。对于已提交的改动,Git 会显示谁做的、何时做的、具体改了什么——类似于跟踪源代码中的变更;而工作文件中尚未提交的编辑还不属于这段历史。这与不透明的会计数据库形成鲜明对比——后者可能只显示一个最后修改日期,或者需要特殊的日志才能审计。一家采用 Beancount 的公司报告说,使用 Git 让多名会计可以同时工作,并知道“谁在何时何地做了什么改动”,解决了他们在传统软件中遇到的协作和变更跟踪问题。在实践中,你甚至可以在 Git 中强制执行验证(例如用预提交钩子*运行 Beancount 的检查,阻止提交不平衡的账簿)。把账簿当作代码来对待,意味着代码管理的所有强大工具——diff、pull request、代码审查——都可以用于你的会计记录。

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

纯文本账本的审计优势​

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

  • 细粒度的变更历史: 账簿的每一次已提交改动都通过版本控制被跟踪。这创建了一份按时间顺序的编辑记录,如果使用 GitHub 这样的服务或签名提交的做法,就很难被篡改。这相当于为所有交易保留了一份详细的审计日志。错误可以追溯到引入它的那个确切提交,账簿的历史版本也很容易找回。在纯文本账簿中,*“数据可以被有效地进行版本控制,提供审计轨迹和无限次的‘撤销’”*以便更正。相比之下,许多传统会计系统要么不保留完整的编辑历史,要么以难以厘清的方式混合数据和调整。

  • 可追溯性与同行审查: 因为账簿是文本,多个人可以像审查代码一样审查它。例如,在一个小组织中,一个人可以提出对账簿的改动(添加交易、调整分录),然后发起一个 pull request 让第二个人审查。这个同行审查流程可以在错误或不一致被接受之前就发现它们,就像代码审查能发现 bug 一样。上面提到的协作工作流对使用 QuickBooks 的团队来说是不可能的,这促使他们迁移到 Beancount 以获得更好的多用户支持。纯文本方法让协作变得自然——调和差异、合并不同会计的改动都很简单,避免了某些桌面会计软件的“文件锁定”或单用户限制。

  • 自动错误检查: Beancount 内置了强大的验证功能。当你处理文件时,如果有任何交易不平衡(借方 ≠ 贷方)、某个账户的交易与断言余额不符,或者存在重复交易标识符之类的不一致,它都会报告错误。关于这个机制值得说得精确一些,因为它决定了你能在多大程度上依赖它。干净的账簿 bea check 退出码为 0;有错误时则以非零退出码列出,因此一次干净的运行是一个真实的信号。相比之下,Python 加载器会同时返回解析出的条目和一个错误列表——它不会中止——所以任何基于 Beancount 构建的工具都必须检查这个错误列表;忽略它的工具可能会带着一份无效账簿继续运行。余额断言也是同理:根据银行对账单添加每月断言,Beancount 会在*“你的交易对不上时抛出错误”*,一旦运行检查就会浮现遗漏或笔误。诚实的总结是:Beancount 验证它被要求检查的内容——平衡、断言、重复 id——并直接呈现结果;它不保证每一个下游脚本或报告都会对这些结果采取行动,所以把一次干净的 bea check 当作检查点,而不是自动保证。因为 Beancount 比封闭软件向用户暴露了更多东西,所以鼓励你添加余额断言这样的显式检查,并亲自读取它们的结果。

  • 更正分录保留历史: 在正规会计中,人们不会删除错误的交易,而是添加一笔更正分录。纯文本账簿鼓励这种做法(而且有了 Git,即使你真的改动了过去的记录,之前的版本仍留在历史中)。审计师可以清楚地看到更正的轨迹,而不必怀疑数据是否在无记录的情况下被改过。虽然如果有访问权限,技术上没有什么能阻止用户编辑文本文件的历史,但使用带提交完整性(甚至签名提交)的 Git 可以减轻未授权或未跟踪的改动。这种开放性也培养了良好习惯:一个讨论指出,在纯文本会计中你*“不能[简单地]更正一条记录”而不留下痕迹;你应该“做更正分录……[以]保留审计轨迹”*。总之,系统本身是透明的,所以任何做假账的企图都很可能留下痕迹。

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

  • 无限撤销与实验: 由于文本加版本控制的组合,你可以大胆尝试重构或重整账户。如果某个想法行不通,你可以回退到之前的提交。这种自由鼓励对会计结构进行持续的改进和调整(例如把一个账户拆成几个,或添加新类别),而在传统系统中,一旦交易录入,这可能是有风险或不可逆的。用户指出,有了 Git 检查点,在*“实验”账簿改动时“不用担心会弄坏什么东西”*,因为总能回滚。这意味着会计系统可以优雅地演进,每一步的可审计历史都被保留。

保留报告背后的价格数据​

实时价格会刷新受管理的估值数据,而不会重写你的账簿或产生提交。feed 元数据标识了来源和观测时间,对于同一日期和货币对,你自己的价格优先。仅对账簿做一次 Git 提交,并不能保留过去某份报告所用到的 feed 修订版本。当你需要可复现的结果时,请一并保留与账簿和报告一起使用的带日期价格。

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

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

  • 消除不透明格式: Beancount 使用一种任何人都能读的、纯开放格式。不像典型的会计软件可能把数据存在专有二进制文件或锁定的数据库中,Beancount 账簿就是文本。这种*“开放格式”意味着“你的数据是开放的,并将永远保持开放”。你不需要 Beancount 就能理解这些数据——紧急情况下,你可以在文本编辑器中打开账簿或把它打印出来。通过消除专有数据孤岛,Beancount 确保你永远不会依赖某个特定厂商的软件来访问自己的财务记录。例如,许多 QuickBooks 用户都经历过难以导出全部数据或将其转换到新系统的困难。用 Beancount,转换很直接:数据本身就是通用格式。用 Beancount 文档的话说,“有了开放格式,你永远不会落到你的数据躺在一个格式未知的二进制块里、而软件不再被支持”*的境地。

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

  • 数据与应用分离: 纯文本会计的一个关键设计是,工具(Beancount、Fava)并不拥有数据——你才拥有。数据文件是独立的,工具将其视为只读输入。正如 plaintextaccounting.org 的介绍所指出的,软件*“读取输入数据而不改变它,[仅]输出一份报告”,这使它“易于理解和依赖”*。Beancount 永远不会自行回写你的账簿文件;任何改动都必须来自你(或你刻意使用的编辑工具)。这让人非常确信,你看到的就是你录入的,没有隐藏的修改。如果软件行为异常或有 bug,你的数据依然安全、不变——这是信任的关键点。相比之下,不透明的会计系统可能在升级时或出现 bug 时改动数据,而没有对原始数据的直接访问,你甚至可能意识不到。用 Beancount,如果报告里有什么看着不对,你可以打开文本文件直接检查。

  • 开源社区与审查: Beancount 和 Fava 都是开源的,这意味着成百上千双眼睛可以审查它们的代码并贡献改进。不仅数据透明,工具本身也透明——没有不透明的算法。例如,如果对折旧如何计算或货币换算如何处理有疑虑,你可以查看 Beancount 源码或与开发者社区讨论。这种社区驱动的做法也带来了 bug 或不一致的快速识别,它们通常会公开记录(例如在 GitHub issue 上)并公开修复。用户甚至可以编写插件来扩展 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(Web 界面)的开源理念也意味着,即使是高级功能也不是为了锁定你。例如,一个 Beancount 托管服务的创造者指出,他们避免添加任何*“绑定用户的私有功能”*——而是把改进回馈给开源的 Fava/Beancount 项目。社区的这种心态确保增强功能惠及所有人,你不会被困在某个修改版上。换句话说,你可以随时自托管或迁移到另一项服务;工作流保持标准。这与那些可能提供“导出”的厂商形成对比——但仅以一种竞争对手无法轻易导入的格式,从而把你困住,除非你留在他们那里。

总之,使用 Beancount 和 Fava,你可以避开厂商锁定的常见陷阱。你的数据保持可访问,软件在你的掌控之下,你可以自由地按需调整或迁移,而不会丢失记录的完整性。没有年费或强制升级——透明和简洁让你免受这些依赖。

Fava:Beancount 的人类可读界面​

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

(Fava) Fava 的 Web 界面为你的账簿提供了丰富、人类可读的视图。例如,截图展示了一份“利润表”的树状图,按类别分解收入和支出。这类可视化和报告帮助用户和审计师快速把握财务模式并识别异常。

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

让审计更容易: 通过以熟悉的会计报表和交互式图表呈现数据,Fava 让非技术用户也能审计和理解 Beancount 维护的账簿。例如,可以给外部会计访问 Fava 的权限(或导出 Fava 的报告)。一家使用 Beancount 的公司指出,为了报税,他们生成财务的 HTML 导出,他们的注册会计师*“能毫无困难地浏览[这些]财务数据”,而且他们“使用 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 获得高度的清晰度和掌控力。对于熟悉技术的人来说,拥有一本纯文本账簿意味着他们可以精确地跟踪每一笔支出、投资和预算类别。这里的可审计性转化为个人安心——你可以通过查看 diff 或使用 Fava 的图表来回答诸如“我记下那笔交易了吗?”或“上个月我的支出怎么变了?”之类的问题。错误检查和复式记账系统确保跟踪中的错误被最小化或标记出来。一位博主将他们的理想系统描述为*“万无一失:很难搞砸我的报告,而且犯错时容易知道”,这正是 Beancount 的验证所提供的。这类用户也看重系统是穷尽的*(能处理他们财务的所有方面)和面向数据的(允许随时间分析)。Fava 的界面满足了*“漂亮界面和导出能力”的需求,以便与比如理财顾问分享数据,或仅仅是可视化给自己看。工具是 FOSS(自由开源软件)这一事实让个人确信“数据在 20 年后仍然可用”*——这是终身财务记录的重要考量。在实践中,个人用户已实现银行自动导入、编写自定义脚本对支出分类,甚至用 Beancount 跟踪积分或加密货币之类的东西。他们以对待软件项目同样的严谨对待自己的财务,产生了极其详细的个人审计轨迹。例如,在需要与银行争辩某笔交易时,或仅仅想回顾消费习惯、完全透明地了解每一美元的去向时,这可能非常宝贵。

  • 小企业和初创公司: 小公司和初创公司往往需要协作记账和随时可审计的记录,但可能没有高端会计系统的预算。Beancount 加上 Git 仓库可以作为带多用户支持的轻量级会计系统。多个团队成员可以通过 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)——人类可读,易于导出或操作。完全没有专有编码。你可以在任何文本编辑器中打开账簿并理解它。通常是专有文件格式或数据库。数据可能存储在需要软件解释的二进制块中。直接可读性有限——通常必须使用应用的导出功能才能取出数据。
审计轨迹与历史完整历史通过 Git 或其他 VCS 在外部跟踪。每次新增/修改都记录作者和时间戳(通过提交元数据)。没有任何东西会真正丢失;“撤销”通过回退到之前的提交而无限。账簿本身可以包含注释或更正标记,而 Git 为改动提供了问责性。审计轨迹通常是可选功能(如果存在的话)。某些软件记录谁最后编辑了一笔交易,但每个字段变更的细粒度版本历史很少见。往往可以编辑甚至删除交易而不留永久痕迹,尤其是在单用户桌面设置中。多用户系统(如 QuickBooks Enterprise 或 Oracle Netsuite)有一定的变更跟踪,但不如 Git 历史那样透明或易于访问。
逻辑透明度完全透明的计算。复式记账规则公开强制执行,报告通过汇总账簿数据生成。算法(开源代码)受社区审查。如果报告中出现一个数字,你可以确切追溯到是哪些交易贡献了它。除非由账簿指令或 Beancount 有文档记录的规则所定义,否则不会有任何事情发生。内部流程不透明。用户必须信任软件的报表模块能准确反映数据。如果出现不一致,可能需要厂商支持来调查。某些计算(如收入确认、折旧)的公式如果软件不暴露,终端用户可能看不到。在闭源系统中,错误或怪癖可能一直隐藏。
错误检查严格的复式记账执行和可选的断言。运行 bea check 会报告每一笔不平衡交易或失败的断言并以非零退出,因此问题会立即浮现,应该在你依赖报告之前修复(可嵌入的加载器把那些错误与条目一起返回,而不是中止)。可以用额外插件做自定义验证。用户在运行工具时或通过 Fava 的错误指示被告知问题。差异很大——许多系统强制每笔交易内部平衡,但有些允许暂时不平衡状态或自动平衡分录。批量数据导入可能不会标记重复或逻辑错误,除非手动运行审计报告。用户可能只在对账时才发现错误,或者根本发现不了。一些软件有审计报告,但必须主动调用和解读,而不是错误直接呈现。
控制与定制用户拥有完全控制:他们可以编写自定义脚本(用 Python 或使用 Beancount 的查询语言)来生成专门报告或自动化任务。数据可以用标准文本工具批量编辑。因为是开源的,可以扩展功能或修复 bug。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