Кредиторская задолженность (AP) — это деньги, которые ваш бизнес должен своим поставщикам за товары или услуги, которые вы уже получили, но ещё не оплатили. В бухгалтерском учёте AP классифицируется как текущее обязательство в вашем балансе — сумма, обычно подлежащая оплате в течение следующего года, и часто в течение 30–60 дней.
Эта концепция является центральной для учёта по методу начисления, где вы фиксируете расход и соответствующее обязательство в момент поступления счёта, а не когда вы фактически отправляете деньги. Это руководство покажет вам, как управлять всем рабочим процессом AP чисто и эффективно с помощью инструмента текстового учёта Beancount.
Краткое резюме
Прежде чем мы углубимся в детали, давайте рассмотрим основы:
- Кредиторская задолженность (AP) представляет собой ваши краткосрочные долги перед поставщиками. Вы найдёте её в разделе
Обязательствавашего баланса. - Метод начисления против кассового: AP — это концепция, которая существует только если вы ведёте свой учёт по методу начисления. Beancount полностью поддерживает рабочие процессы по методу начисления, и его веб-интерфейс Fava будет правильно отображать ваши обязательства.
- AP против AR: Всё просто: Кредиторская задолженность — это то, что вы должны, а Дебиторская задолженность (AR) — это то, что должны вам.
Где AP находится в Beancount (и Fava)
Чтобы начать отслеживать AP, вам сначала нужно объявить для неё счёт в вашей главной книге. Стандартное соглашение:
Liabilities:AccountsPayable
Вы можете дополнительно создавать субсчета для крупных поставщиков (например, Liabilities:AccountsPayable:ForestPaintSupply).
В Fava этот счёт появится в вашем Балансе в разделе Обязательства. Вы можете нажать на него, чтобы углубиться и увидеть проводки, составляющие баланс. Вы даже можете увидеть это в действии в публичном примере главной книги Fava, который включает счёт Liabilities:AccountsPayable.
Соглашение о знаках: Beancount хранит остатки по обязательствам как кредиты (отрицательные числа). Остаток -500.00 USD на Liabilities:AccountsPayable означает, что вы должны $500. Отчёт по открытым позициям ниже меняет знак с помощью -SUM(number), чтобы каждый неоплаченный счёт показывал положительную непогашенную сумму. Полностью оплаченный счёт даёт в сумме ноль и исключается с помощью HAVING.
Основные строительные блоки Beancount, которые вы будете использовать
Надёжный рабочий процесс AP в Beancount опирается на несколько ключевых функций:
- Счета: Вы будете в основном использовать свой счёт
Liabilities:AccountsPayable, денежный счёт, такой какAssets:Bank:Checking, и свои различные счета расходов (например,Expenses:Supplies). - Метаданные: Вы можете прикрепить данные в формате «ключ-значение» к любой транзакции. Для AP вы будете использовать такие метаданные, как
invoice:,due:,terms:иdocument:. Установитеoption "documents"на папку, чтобы Beancount мог находить файлы там; в Fava перетаскивание файла на строку журнала вставляет запись метаданныхdocument:, а включениеplugin "fava.plugins.link_documents"связывает эти записи с обнаруженными директивами Document. - Теги и ссылки: Используйте
#теги(например,#ap) для удобной фильтрации и^ссылки(например,^INV-10455) для программной привязки счёта и его последующей оплаты. Это создаёт чёткий, проверяемый след в журнале — но одних ссылок недостаточно для запроса открытых счетов ниже. - Запросы (BQL): Похожий на SQL язык запросов Beancount (BQL) позволяет выполнять мощные отчёты, например, список всех открытых счетов к оплате, отсортированных по дате платежа, непосредственно из командной строки с помощью
bean-queryили на странице «Запрос» в Fava.
Идентификация счёта (обязательна для запросов открытых счетов): Каждый счёт и каждая оплата — полная, частичная или со скидкой за ранний платёж — должны содержать одинаковые метаданные транзакции invoice: и due:, а также ту же самую ^ссылку. Запрос группирует по payee, any_meta('invoice') и any_meta('due'). Если в оплате отсутствуют эти ключи, её проводка по AP попадает в отдельную группу (payee, null, null), и оплаченный счёт всё равно будет выглядеть открытым. Держите (payee, invoice) уникальным для разных поставщиков. Дополнительные поля, относящиеся только к счету, такие как terms: и document:, не нужно повторять в платежах.
Основной рабочий процесс AP в Beancount
Управление AP в вашей главной книге включает два или три ключевых шага: запись счёта, его оплату, а иногда и обработку частичных платежей или скидок.
1) Запись счёта поставщика (это создаёт обязательство)
Сначала вы учитываете расход и создаёте кредиторскую задолженность при поступлении счёта.
; Optionally set your documents folder in your main Beancount file:
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Эта единственная запись выполняет две важные задачи:
- Она немедленно признаёт расход в размере $500 в правильном периоде (август) — один раз. Не повторяйте проводку расхода при оплате.
- Она кредитует AP на $500 (
-500.00 USD), фиксируя, что вы должны Forest Paint Supply эту сумму.
Ссылка ^INV-10455 вместе с метаданными invoice: / due: образуют идентичность счёта. Каждый последующий платёж по этому счету должен повторно использовать все три элемента.
2) Оплата счёта (это погашает обязательство)
Когда вы оплачиваете счёт, вы создаёте транзакцию, которая переводит деньги с вашего банковского счёта для погашения обязательства. Скопируйте invoice: и due: из счёта в платёж, чтобы обе проводки попадали в одну группу запроса.
а) Стандартный платёж (без скидки):
2025-09-01 * "Forest Paint Supply" "Payment INV-10455" ^INV-10455
invoice: "INV-10455"
due: "2025-09-04"
Liabilities:AccountsPayable 500.00 USD
Assets:Bank:Checking -500.00 USDЭта запись уменьшает ваш остаток по AP на $500 и остаток на вашем расчётном счёте на ту же сумму. Обязательство по этому счёту теперь погашено (сумма AP по группе равна нулю). Расход остаётся в августовском счете — платёж не затрагивает Expenses:.
б) Скидка за ранний платёж (например, «2/10, n/30») — выберите ровно один метод:
Если условия «2/10, n/30», вы можете получить скидку 2% при оплате в течение 10 дней. Для нашего счёта на $500 это скидка $10. Блок ниже показывает две взаимоисключающие альтернативы: Вариант 1 активен; Вариант 2 полностью закомментирован, чтобы вставка не провела обе проводки. Чтобы использовать Вариант 2, закомментируйте Вариант 1 и раскомментируйте Вариант 2. Никогда не оставляйте оба активными — это дважды погасит AP и создаст вторую выгоду в $10. Какой счёт — доходов или расходов — вы используете, является вопросом учётной политики для ваших книг; Beancount не требует одного над другим.
; Pick EXACTLY ONE of the two transactions below for a given invoice.
; Do not paste both into the same ledger — that clears AP twice.
; Option 1: Record the discount as other income
2025-08-12 * "Forest Paint Supply" "Early payment discount INV-10455" ^INV-10455
invoice: "INV-10455"
due: "2025-09-04"
Liabilities:AccountsPayable 500.00 USD
Assets:Bank:Checking -490.00 USD
Income:Discounts:Payables -10.00 USD
; Option 2: Reduce the original expense directly
; 2025-08-12 * "Forest Paint Supply" "Early payment discount INV-10455" ^INV-10455
; invoice: "INV-10455"
; due: "2025-09-04"
; Liabilities:AccountsPayable 500.00 USD
; Assets:Bank:Checking -490.00 USD
; Expenses:Supplies:Paint -10.00 USDВ любой из альтернатив по отдельности вы погашаете полное обязательство в $500, уменьшаете свой банковский остаток на фактически уплаченные $490 и учитываете выгоду в $10. Замените стандартную транзакцию полной оплаты выбранной альтернативой — не добавляйте платёж со скидкой поверх денежного платежа в $500 и не комбинируйте этот блок с разделом 2а для одного и того же счёта.
3) Обработка частичных платежей
Используйте ту же самую идентичность invoice: / due: / ^link в каждом платеже, чтобы каждый платёж уменьшал одну и ту же группу открытых счетов.
; Invoice for $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
; First payment of $400
2025-08-20 * "Acme Parts" "Payment INV-9001 (1/3)" ^INV-9001
invoice: "INV-9001"
due: "2025-09-09"
Liabilities:AccountsPayable 400.00 USD
Assets:Bank:Checking -400.00 USD
; Final payment of $800
2025-09-05 * "Acme Parts" "Payment INV-9001 (final)" ^INV-9001
invoice: "INV-9001"
due: "2025-09-09"
Liabilities:AccountsPayable 800.00 USD
Assets:Bank:Checking -800.00 USDПосле первого платежа сумма AP по группе счетов составляет -800.00 USD (вы всё ещё должны $800). После финального платежа она равна нулю. Фильтрация журнала по ^INV-9001 по-прежнему показывает всю историю.
Полезные запросы (BQL)
Вы можете выполнять эти запросы на вкладке «Запрос» в Fava или из командной строки с помощью bean-query (справочник по BQL). Проверено на Beancount 3.2.3 и beanquery 0.2.0.
Совет: Функция
any_meta()сначала ищет ключ метаданных в проводке, а затем возвращается к транзакции — поэтому значенияinvoice:/due:на уровне транзакции появляются в результирующем наборе.
Открытая AP по поставщикам (просмотр баланса):
Этот запрос суммирует инвентаризацию обязательств по каждому поставщику. Кредит (отрицательная сумма) — это то, что вы всё ещё должны этому поставщику.
SELECT payee, COST(SUM(position)) AS amount
WHERE account ~ "^Liabilities:AccountsPayable"
GROUP BY payee
ORDER BY payee;Открытые счета на фиксированную дату (отчёт по открытым позициям):
Отчёт по открытым позициям отвечает на вопрос «что осталось неоплаченным?». Он должен (1) ограничиваться явной датой отчёта, чтобы более поздние платежи не могли молча очистить более ранний снимок, (2) группироваться по общей идентичности счёта (payee + invoice: + due:), (3) исключать погашенные (нулевые) группы и (4) показывать положительную непогашенную сумму, а не исходный подписанный кредит AP.
Дата отчёта, используемая везде ниже: 2025-09-04.
Загружаемая стартовая главная книга AP
Скачайте accounts-payable-starter.bean — одну самодостаточную главную книгу, созданную из полного блока ниже (открытие счетов, вымышленные начальные денежные средства, оплаченные / частично оплаченные / неоплаченные счета, на дату 2025-09-04). Все имена и суммы являются вымышленными примерами данных. Для проверки или запроса не требуется PDF-файл счёта, папка с документами или любой другой файл.
Первый запуск из чистой временной директории (закреплённые Beancount 3.2.3 / beanquery 0.2.0):
# Save the download as accounts-payable-starter.bean in this directory, then:
uvx --from beancount==3.2.3 bean-check accounts-payable-starter.bean
uvx --from beanquery==0.2.0 --with beancount==3.2.3 bean-query accounts-payable-starter.bean \
"SELECT payee, any_meta('invoice') AS invoice, any_meta('due') AS due, -SUM(number) AS outstanding WHERE account ~ '^Liabilities:AccountsPayable' AND date <= 2025-09-04 GROUP BY payee, invoice, due HAVING SUM(number) < 0 ORDER BY due, payee"bean-check завершается с кодом 0 и без вывода. Запрос возвращает пять открытых строк в ожидаемой таблице ниже (Forest отсутствует; Acme непогашенная 800.00; сумма положительной непогашенной задолженности = 1500.00). Перегенерируйте закоммиченную загрузку с помощью yarn generate:ap-starter после редактирования блока; yarn generate:ap-starter --check завершится ошибкой, если артефакт устарел.
Вставьте этот полный фикстур (открытия + начальные денежные средства + три формы счетов, плюс строки со сроком сегодня / просроченные / крайние случаи для старения). Альтернативы скидки за ранний платёж для INV-10455 остаются полностью закомментированными — активируйте ровно одну, только если вы заменяете стандартный платёж Forest; никогда не оставляйте обе опции скидки активными вместе с этим платежом.
; accounts-payable-starter — complete runnable AP workflow
option "operating_currency" "USD"
2025-01-01 open Assets:Bank:Checking USD
2025-01-01 open Equity:Opening-Balances USD
2025-01-01 open Liabilities:AccountsPayable USD
2025-01-01 open Expenses:Supplies:Paint USD
2025-01-01 open Expenses:Parts USD
2025-01-01 open Expenses:Office USD
2025-01-01 open Income:Discounts:Payables USD
; Fictional opening cash — enough to cover every payment in this ledger
2025-01-01 * "Opening balance"
Assets:Bank:Checking 5000.00 USD
Equity:Opening-Balances -5000.00 USD
; Settled before as-of — must disappear from the open report
2025-08-05 * "Forest Paint Supply" "Paint order INV-10455" ^INV-10455 #ap
invoice: "INV-10455"
due: "2025-09-04"
Expenses:Supplies:Paint 500.00 USD
Liabilities:AccountsPayable -500.00 USD
2025-09-01 * "Forest Paint Supply" "Payment INV-10455" ^INV-10455
invoice: "INV-10455"
due: "2025-09-04"
Liabilities:AccountsPayable 500.00 USD
Assets:Bank:Checking -500.00 USD
; Early-payment discount alternatives for INV-10455 — mutually exclusive with
; the standard payment above AND with each other. To take 2/10 instead: delete
; (or comment out) the 2025-09-01 payment, then uncomment EXACTLY ONE option.
; Never leave both options active — that clears AP twice.
;
; Option 1: Record the discount as other income
; 2025-08-12 * "Forest Paint Supply" "Early payment discount INV-10455" ^INV-10455
; invoice: "INV-10455"
; due: "2025-09-04"
; Liabilities:AccountsPayable 500.00 USD
; Assets:Bank:Checking -490.00 USD
; Income:Discounts:Payables -10.00 USD
;
; Option 2: Reduce the original expense directly
; 2025-08-12 * "Forest Paint Supply" "Early payment discount INV-10455" ^INV-10455
; invoice: "INV-10455"
; due: "2025-09-04"
; Liabilities:AccountsPayable 500.00 USD
; Assets:Bank:Checking -490.00 USD
; Expenses:Supplies:Paint -10.00 USD
; Partial before as-of; final $800 payment is AFTER 2025-09-04
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
2025-08-20 * "Acme Parts" "Payment INV-9001 (1/3)" ^INV-9001
invoice: "INV-9001"
due: "2025-09-09"
Liabilities:AccountsPayable 400.00 USD
Assets:Bank:Checking -400.00 USD
2025-09-05 * "Acme Parts" "Payment INV-9001 (final)" ^INV-9001
invoice: "INV-9001"
due: "2025-09-09"
Liabilities:AccountsPayable 800.00 USD
Assets:Bank:Checking -800.00 USD
; Unpaid — not yet due as of 2025-09-04
2025-08-15 * "Bright Office Co" "INV-220" ^INV-220
invoice: "INV-220"
due: "2025-09-14"
Expenses:Office 300.00 USD
Liabilities:AccountsPayable -300.00 USD
; Unpaid — due today (as-of == due)
2025-08-20 * "Helix Industries" "INV-440" ^INV-440
invoice: "INV-440"
due: "2025-09-04"
Expenses:Parts 200.00 USD
Liabilities:AccountsPayable -200.00 USD
; Unpaid — 30 days overdue as of 2025-09-04
2025-07-06 * "Metro Hardware" "INV-77" ^INV-77
invoice: "INV-77"
due: "2025-08-05"
Expenses:Parts 150.00 USD
Liabilities:AccountsPayable -150.00 USD
; Overpayment — credit balance (not an amount due; see edge cases)
2025-08-01 * "Credit Vendor" "INV-C1" ^INV-C1
invoice: "INV-C1"
due: "2025-08-20"
Expenses:Parts 100.00 USD
Liabilities:AccountsPayable -100.00 USD
2025-08-18 * "Credit Vendor" "Overpay INV-C1" ^INV-C1
invoice: "INV-C1"
due: "2025-08-20"
Liabilities:AccountsPayable 150.00 USD
Assets:Bank:Checking -150.00 USD
; Missing due metadata — still open; age into a separate bucket, do not drop
2025-08-12 * "No Due Co" "INV-ND" ^INV-ND
invoice: "INV-ND"
Expenses:Office 50.00 USD
Liabilities:AccountsPayable -50.00 USDЗапрос открытых позиций (beanquery 0.2.0 поддерживает HAVING SUM(number) < 0; он не поддерживает сравнение inventory с 0 с помощью COST(SUM(position)) != 0):
SELECT payee,
any_meta('invoice') AS invoice,
any_meta('due') AS due,
-SUM(number) AS outstanding
WHERE account ~ "^Liabilities:AccountsPayable"
AND date <= 2025-09-04
GROUP BY payee, invoice, due
HAVING SUM(number) < 0
ORDER BY due, payee;Ожидаемые строки на 2025-09-04 (получены независимо из транзакций: счёт — платежи с датой ≤ даты отчёта; Forest даёт ноль и отсутствует):
| payee | invoice | due | outstanding |
|---|---|---|---|
| No Due Co | INV-ND | (пусто) | 50.00 |
| Metro Hardware | INV-77 | 2025-08-05 | 150.00 |
| Helix Industries | INV-440 | 2025-09-04 | 200.00 |
| Acme Parts | INV-9001 | 2025-09-09 | 800.00 |
| Bright Office Co | INV-220 | 2025-09-14 | 300.00 |
Сумма положительной непогашенной задолженности = 1,500.00. Счёт Forest на $500 исчез. Acme всё ещё показывает $800 ($1,200 − $400); платёж в $800 от 2025-09-05 после даты отчёта, поэтому он не может закрыть этот снимок.
Сверьте с обязательством AP на ту же дату отсечения:
SELECT COST(SUM(position)) AS ap_balance
WHERE account ~ "^Liabilities:AccountsPayable"
AND date <= 2025-09-04;Ожидается: ap_balance = (-1450.00 USD). Независимо: открытая непогашенная задолженность $1,500 минус кредит поставщика $50 (ниже) = $1,450 к оплате → инвентаризация обязательств -1450.00 USD.
Сдвиньте дату отчёта на один день вперёд (date <= 2025-09-05) и повторно выполните запрос открытых позиций: строка Acme исчезает (включён финальный платёж), а ap_balance становится (-650.00 USD). Платёж после даты отчёта никогда не переписывает более ранний отчёт.
Кредиты поставщиков / переплаты: HAVING SUM(number) < 0 оставляет только суммы, которые вы всё ещё должны. Переплата меняет знак суммы AP группы на положительный. Перечислите их отдельно — не рассматривайте положительный остаток AP как «сумму к оплате»:
SELECT payee,
any_meta('invoice') AS invoice,
any_meta('due') AS due,
SUM(number) AS credit
WHERE account ~ "^Liabilities:AccountsPayable"
AND date <= 2025-09-04
GROUP BY payee, invoice, due
HAVING SUM(number) > 0
ORDER BY payee;Ожидается: одна строка — Credit Vendor / INV-C1 / 2025-08-20 / credit = 50.00 (вы переплатили $50).
Отсутствует due:: INV-ND по-прежнему появляется в открытом отчёте с пустым сроком. Распределите его по возрасту в отдельную корзину missing-due (ниже); никогда молча не опускайте его.
Список счетов с прикреплёнными PDF-файлами:
SELECT date, payee, any_meta('invoice') AS invoice, any_meta('document') AS file
WHERE account ~ "^Liabilities:AccountsPayable"
ORDER BY date DESC;Где увидеть AP в Fava
- Баланс: Перейдите в
Баланс→Обязательства→AccountsPayable, чтобы увидеть общий остаток и углубиться в детали транзакций. - Журнал: Отфильтруйте журнал по
account:Liabilities:AccountsPayableили конкретной ссылке, такой как^INV-xxxx, чтобы увидеть полный жизненный цикл счёта. - Документы: С установленным
option "documents"Beancount обнаруживает файлы в этом дереве. Просмотры документов Fava и плагинlink_documents(см. выше) связывают эти файлы с транзакциями, содержащими метаданныеdocument:.
Старение AP, оборачиваемость и осведомлённость о денежных потоках
График старения (воспроизводимый экспорт + корзины): beanquery 0.2.0 может выдать строки открытых позиций выше, но не предоставляет встроенного выражения для корзин старения по метаданным due. Экспортируйте открытый отчёт, затем распределите по корзинам детерминированно относительно той же даты отчёта.
bean-query -f csv -o open-ap.csv accounts-payable-starter.bean \
"SELECT payee, any_meta('invoice') AS invoice, any_meta('due') AS due, -SUM(number) AS outstanding WHERE account ~ '^Liabilities:AccountsPayable' AND date <= 2025-09-04 GROUP BY payee, invoice, due HAVING SUM(number) < 0 ORDER BY due, payee"Столбцы CSV: payee, invoice, due, outstanding.
Правило распределения по корзинам для даты отчёта D = 2025-09-04 и каждого due строки (ISO YYYY-MM-DD):
| Условие | Корзина |
|---|---|
due пусто | missing-due |
due > D | not-yet-due |
due == D | due-today |
1 ≤ (D − due) ≤ 30 | 1-30-overdue |
31 ≤ (D − due) ≤ 60 | 31-60-overdue |
(D − due) ≥ 61 | 61+-overdue |
Компактный Python (только стандартная библиотека), реализующий эту таблицу:
from datetime import date
AS_OF = date(2025, 9, 4)
# Apply bucket() to each CSV row's due column (ISO YYYY-MM-DD or empty).
def bucket(due: str | None) -> str:
if not due:
return "missing-due"
days = (AS_OF - date.fromisoformat(due)).days
if days < 0:
return "not-yet-due"
if days == 0:
return "due-today"
if days <= 30:
return "1-30-overdue"
if days <= 60:
return "31-60-overdue"
return "61+-overdue"Ожидаемое старение для открытых строк на 2025-09-04:
| invoice | due | дней просрочки | корзина | outstanding |
|---|---|---|---|---|
| INV-ND | (пусто) | — | missing-due | 50.00 |
| INV-77 | 2025-08-05 | 30 | 1-30-overdue | 150.00 |
| INV-440 | 2025-09-04 | 0 | due-today | 200.00 |
| INV-9001 | 2025-09-09 | −5 | not-yet-due | 800.00 |
| INV-220 | 2025-09-14 | −10 | not-yet-due | 300.00 |
Due-today не включается в «текущие»: due == as-of — это отдельная корзина. Not-yet-due требует due > as-of.
- Коэффициент оборачиваемости AP:
Общие закупки у поставщиков ÷ Средняя AP. Связанный показатель, Срок оплаты кредиторской задолженности (DPO), примерно равен365 ÷ Коэффициент оборачиваемости. - Если вы не можете платить вовремя: AP предназначена для краткосрочного долга. Если поставщик соглашается на официальное, более долгосрочное погашение, переклассифицируйте сумму из AP в вексель к оплате — сохраните ту же идентичность счёта при конвертации, чтобы группа AP очистилась.
2025-10-01 * "Helix Industries" "Convert overdue AP to 12-month note" ^INV-1110
invoice: "INV-1110"
due: "2025-09-15"
Liabilities:AccountsPayable 2000.00 USD
Liabilities:NotesPayable -2000.00 USDЛучшие практики для AP в текстовой главной книге
- Откажитесь от бумаги: Храните PDF-файлы счетов в дереве документов и прикрепляйте их с помощью ключа метаданных
document:(и загрузки в Fava /link_documents, когда вы используете Fava). - Используйте идентичность счёта в платежах повторно: Указывайте одинаковые
invoice:,due:и^ссылкув счете и в каждом платеже, который его погашает. - Отчитывайтесь на дату: Ограничивайте запросы открытых позиций и старения с помощью
date <= ГГГГ-ММ-ДД, чтобы более поздний платёж не мог переписать более ранний снимок; распределяйте по возрасту с той жеD. - Содержите метаданные в порядке: Последовательное использование
invoice:,due:иterms:улучшает поиск, запросы и финансовые проверки. - Метод начисления во всём: Если вы хотите полезную отчётность по AP, стремитесь вести свои книги по методу начисления. Beancount и Fava обрабатывают остатки по методу начисления в Балансе без специальных плагинов.
Стартовый набор для копирования: Счёт поставщика + Платёж
Для полного рабочего процесса открытых позиций (оплаченные + частичные + неоплаченные, дата отчёта, старение) предпочтите загружаемый стартовый AP-набор выше. Минимальная пара счёт+платёж ниже по-прежнему показывает идентичность в обеих частях — сначала откройте счета (или включите эти открытия в свою основную главную книгу). Необязательные метаданные document: здесь опущены, чтобы ничего, кроме главной книги, не требовалось.
option "operating_currency" "USD"
2025-01-01 open Assets:Bank:Checking USD
2025-01-01 open Liabilities:AccountsPayable USD
2025-01-01 open Expenses:Supplies:Paint USD
; ---- Bill ----
2025-08-05 * "Forest Paint Supply" "Paint order INV-10455" ^INV-10455 #ap
invoice: "INV-10455"
due: "2025-09-04"
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
invoice: "INV-10455"
due: "2025-09-04"
Liabilities:AccountsPayable 500.00 USD
Assets:Bank:Checking -500.00 USDС Beancount 3.2.3 и beanquery 0.2.0 загрузка этого стартового набора не вызывает ошибок, счёт AP сводится к нулю, а запрос invoice+due возвращает одну группу (Forest Paint Supply, INV-10455, 2025-09-04), сумма которой пуста (оплачено) — а не строку счёта плюс отдельную строку платежа (…, null, null).
Это руководство предназначено для образовательных целей и не является налоговой, юридической или финансовой консультацией.
Ссылки и дополнительная информация:
- Синтаксис языка Beancount — счета, метаданные, теги, ссылки и документы (проверено 2026-09-11)
- Справочник по языку запросов Beancount (BQL) (проверено 2026-09-11)
- Возможности Fava — загрузка документов и
link_documents(проверено 2026-09-11) any_meta()для запроса метаданных транзакций/проводок (Мартин Бле, список рассылки Beancount; проверено 2026-09-11)





