什么是应付账款?Beancount友好指南:以纯文本跟踪供应商账单
应付账款(AP)是指企业因已收到但尚未付款的商品或服务而欠供应商的款项。在会计体系中,AP 被归类为资产负债表上的流动负债——通常在一年内(常见为 30 到 60 天)到期。
该概念是权责发生制会计的核心,您在收到发票的瞬间就记录费用及相应负债,而不是等到实际付款时才记录。本指南将展示如何使用纯文本会计工具 Beancount,干净且高效地管理整个 AP 工作流。
快速概览
在深入细节之前,先了解关键要点:
- 应付账款(AP) 代表您对供应商的短期债务。它位于资产负债表的
Liabilities
(负债)栏目下。 - 权责发生制 vs. 现金制:只有在采用 权责发生制 时才会出现 AP。Beancount 完全支持权责发生制工作流,其网页界面 Fava 会正确显示您的负债。
- AP vs. AR:简单来说:应付账款是您 欠 的,而应收账款(AR)是别人 欠 您的。
AP 在 Beancount(以及 Fava)中的位置
要开始跟踪 AP,首先需要在账本中声明一个对应的账户。常用约定为:
Liabilities:AccountsPayable
您可以为主要供应商创建子账户,例如 Liabilities:AccountsPayable:ForestPaintSupply
。
在 Fava 中,此账户会出现在资产负债表的 Liabilities
下。点击即可展开,查看所有未结和已结项目,清晰了解您的负债情况。您也可以在 Fava 的 公开示例账本 中看到 Liabilities:AccountsPayable
账户的实际展示。
Beancount 构建块
一个完整的 AP 工作流依赖以下核心功能:
- 账户:主要使用
Liabilities:AccountsPayable
、Assets:Bank:Checking
(现金账户)以及各种费用账户(如Expenses:Supplies
)。 - 元数据:可以为任意交易附加键值对。AP 常用的元数据包括
invoice:
、due:
、terms:
、document:
。Fava 还能识别document:
键,并在配置了文档文件夹后自动生成可点击的链接。 - 标签 & 链接:使用
#tags
(如#ap
)便于过滤,使用^links
(如^INV-10455
)将账单与后续付款关联,形成清晰、可审计的链路。 - 查询(BQL):Beancount 类 SQL 查询语言(BQL)让您可以直接在命令行使用
bean-query
,或在 Fava 的 “Query” 页面生成强大的报表,例如按到期日排序的未结应付账款列表。
核心 AP 工作流
管理 AP 包括两到三步:记录账单、付款,有时还需处理部分付款或折扣。
1) 记录供应商账单(创建负债)
当发票到达时,先记费用并生成应付账款。
; 可选:在主 Beancount 文件中设置文档文件夹
option "documents" "documents"
2025-08-05 * "Forest Paint Supply" "Paint order INV-10455" ^INV-10455 #ap
invoice: "INV-10455"
due: "2025-09-04"
terms: "2/10, n/30"
document: "invoices/2025-08-05-forest-paint-INV-10455.pdf"
Expenses:Supplies:Paint 500.00 USD
Liabilities:AccountsPayable -500.00 USD
此条目完成两件关键事:
- 立即在 8 月份确认 500 美元费用。
- 同时产生 500 美元负债,表明您欠 Forest Paint Supply。
^INV-10455
链接是唯一标识符,稍后在付款时使用相同链接,可将账单与付款逻辑关联。
2) 付款(冲销负债)
付款时创建交易,将资金从银行账户转出并冲销负债。
a) 标准付款(无折扣)
2025-09-01 * "Forest Paint Supply" "Payment INV-10455" ^INV-10455
Liabilities:AccountsPayable 500.00 USD
Assets:Bank:Checking -500.00 USD
此条目将 AP 减少 500 美元,同时支出 500 美元的银行余额,负债已清。
b) 提前付款折扣(如 “2/10, n/30”)
若在 10 天内付款,可享 2% 折扣。对 500 美元发票而言,折扣为 10 美元。以下两种记法均可,任选其一并保持一致即可。
; 方式 1:将折扣记为其他收入(冲减费用的效果)
2025-08-12 * "Forest Paint Supply" "Early payment discount INV-10455" ^INV-10455
Liabilities:AccountsPayable 500.00 USD
Assets:Bank:Checking -490.00 USD
Income:Discounts:Payables -10.00 USD
; 方式 2:直接冲减原费用
2025-08-12 * "Forest Paint Supply" "Early payment discount INV-10455" ^INV-10455
Liabilities:AccountsPayable 500.00 USD
Assets:Bank:Checking -490.00 USD
Expenses:Supplies:Paint -10.00 USD
两种方式均冲销 500 美元负债,银行账户实际支出 490 美元,并记录 10 美元的优惠。
3) 部分付款处理
Beancount 的链接功能让部分付款的追踪简洁明了。
; 发票 1,200 美元
2025-08-10 * "Acme Parts" "INV-9001" ^INV-9001
invoice: "INV-9001"
due: "2025-09-09"
Expenses:Parts 1200.00 USD
Liabilities:AccountsPayable -1200.00 USD
; 第一次付款 400 美元
2025-08-20 * "Acme Parts" "Payment INV-9001 (1/3)" ^INV-9001
Liabilities:AccountsPayable 400.00 USD
Assets:Bank:Checking -400.00 USD
; 最终付款 800 美元
2025-09-05 * "Acme Parts" "Payment INV-9001 (final)" ^INV-9001
Liabilities:AccountsPayable 800.00 USD
Assets:Bank:Checking -800.00 USD
通过在三条交易上使用相同的 ^INV-9001
链接,您可以轻松过滤出该账单的完整历史。
实用查询(BQL)
可在 Fava 的 “Query” 选项卡或命令行 bean-query
中运行。
小贴士:
any_meta()
函数非常适合把invoice:
、document:
等元数据字段拉进查询结果。
按供应商统计未结 AP(余额视图)
SELECT payee, COST(SUM(position)) AS amount
WHERE account "^Liabilities:AccountsPayable"
GROUP BY payee
ORDER BY payee;
按发票 + 到期日列出未结 AP
SELECT payee,
any_meta('invoice') AS invoice,
any_meta('due') AS due,
COST(SUM(position)) AS amount
WHERE account "^Liabilities:AccountsPayable"
GROUP BY payee, invoice, due
ORDER BY due, payee;
列出带 PDF 附件的账单
SELECT date, payee, any_meta('invoice') AS invoice, any_meta('document') AS file
WHERE account "^Liabilities:AccountsPayable"
ORDER BY date DESC;
在 Fava 中查看 AP
- 资产负债表:进入
Balance Sheet
→Liabilities
→AccountsPayable
,即可看到总余额并进一步钻取交易明细。 - 日记账:使用过滤
account:Liabilities:AccountsPayable
或特定链接^INV-xxxx
,查看单笔账单的完整生命周期。 - 文档侧栏:若使用
document:
元数据并配置option "documents"
,侧栏会列出所有已关联的文档。
AP 老化、周转率与现金流感知
- 老化表:将未结发票按逾期天数分组(如 1–30 天、31–60 天、60+ 天)。在 Beancount 中,可运行上面的 “按发票 + 到期日列出未结 AP” 查询,导出 CSV 后在电子表格或小型 Python 脚本中分桶统计。
- AP 周转率:衡量付款速度的快速健康指标,公式为
供应商采购总额 ÷ 平均应付账款
。相关指标 应付账款天数(DPO) 大约为365 ÷ 周转率
。 - 无法按时付款:AP 属于短期债务。如供应商同意更长期的分期付款,应将该债务从 AP 调整为
Notes Payable
(票据负债)。
2025-10-01 * "Helix Industries" "Convert overdue AP to 12-month note" ^INV-1110
Liabilities:AccountsPayable 2000.00 USD
Liabilities:NotesPayable -2000.00 USD
纯文本账本中的 AP 最佳实践
- 无纸化:将发票 PDF 存入
documents
文件夹,并使用document:
元数据关联。 - 一致使用链接:在账单和所有关联付款上使用唯一的发票号
^link
,保持逻辑连贯。 - 保持元数据整洁:统一使用
invoice:
、due:
、terms:
,提升搜索、查询和财务审查效率。 - 全程权责发生制:若想获得有价值的 AP 报表,请坚持使用权责发生制。Beancount 与 Fava 能完美支持。
复制粘贴示例:供应商账单 + 付款
; ---- Bill ----
2025-08-05 * "Forest Paint Supply" "Paint order INV-10455" ^INV-10455 #ap
invoice: "INV-10455"
due: "2025-09-04"
document: "invoices/2025-08-05-forest-paint-INV-10455.pdf"
Expenses:Supplies:Paint 500.00 USD
Liabilities:AccountsPayable -500.00 USD
; ---- Payment (no discount) ----
2025-09-01 * "Forest Paint Supply" "Payment INV-10455" ^INV-10455
Liabilities:AccountsPayable 500.00 USD
Assets:Bank:Checking -500.00 USD
本指南仅供学习使用,不构成税务、法律或财务建议。