Поместите транзакции с будущими датами в отдельный сценарный реестр, чтобы прогнозировать денежные средства, расходы и задолженность в ваших финансовых отчетах. В этом руководстве используются обычные записи Beancount и фиксированный плановый период. Ваши фактические книги остаются отдельными от ваших допущений.
Совместимость, проверено 7 сентября 2026 г.: примеры были протестированы со стандартным Beancount 3.2.3, beanquery 0.2.0 и Fava 1.30.16. Этот выпуск Fava не включает плагин прогнозирования. Пользовательский исходный код Beancount.io содержит реализацию fava.plugins.forecast; это другая среда выполнения, и доступность исходного кода не подтверждает версию, развернутую в вашей учетной записи. Нижеописанный переносимый рабочий процесс не требует расширений.
Шаг 1: Включение плагина прогнозирования
Пропустите активацию плагина для этого рабочего процесса. Добавление plugin "fava.plugins.forecast" в тестируемую стандартную установку приводит к ошибке импорта. Общие инструкции по настройке плагинов см. в руководстве по плагинам; модуль должен быть фактически установлен, прежде чем реестр сможет его загрузить.
Предварительные требования: локальное окружение Python с установленными beancount==3.2.3, beanquery==0.2.0 и fava==1.30.16. Следуйте зафиксированной настройке Fava, чтобы создать это окружение. Сохраните все три файла ниже в одной директории и выполняйте команды там.
Создайте books.beancount с этим полным примером-снимком. Его дата на момент — 31 декабря 2023 г., после вступительной транзакции. На чековом счете 10 000,00 USD, а непогашенная основная сумма автокредита составляет 14 400,00 USD. Капитал уравновешивает этот упрощенный вступительный снимок.
; books.beancount — realized balances as of 2023-12-31
option "operating_currency" "USD"
2023-12-31 open Assets:Checking USD
2023-12-31 open Liabilities:Auto-Loan USD
2023-12-31 open Equity:Opening-Balances USD
2023-12-31 open Income:Salary USD
2023-12-31 open Expenses:Housing:Rent USD
2023-12-31 open Expenses:Food:Groceries USD
2023-12-31 open Expenses:Health:Gym USD
2023-12-31 open Expenses:Insurance:Auto USD
2023-12-31 open Expenses:Transportation:Interest USD
2023-12-31 * "Opening snapshot"
Assets:Checking 10000.00 USD
Liabilities:Auto-Loan -14400.00 USD
Equity:Opening-Balances 4400.00 USDСоздайте scenario.beancount как точку входа для планирования. Его два include загружают фактический снимок и допущения, которые вы напишете далее. Beancount читает пути include относительно этого файла.
; scenario.beancount — planning entry point
option "title" "January 2024 planning scenario"
option "operating_currency" "USD"
include "books.beancount"
include "scenario-2024-01.beancount"Никогда не включайте scenario.beancount или scenario-2024-01.beancount из books.beancount. Фактическая точка входа не должна загружать запланированные транзакции, даже после наступления их дат.
Шаг 2: Создание прогнозной транзакции
Создайте scenario-2024-01.beancount с этой первой записью. Добавьте четыре последующих сценарных блока в тот же файл по одному разу каждый. Это контекстные блоки транзакций: их объявления счетов берутся из books.beancount, и вы проверяете их через scenario.beancount.
2024-01-01 ! "Scenario: January rent" #forecast
Expenses:Housing:Rent 2500.00 USD
Assets:Checking -2500.00 USDФлаг ! помечает транзакцию для проверки; #forecast — обычный тег транзакции. Ни то, ни другое не создает повторений и не исключает транзакцию из отчетов. Отдельная точка входа контролирует включение. Используйте этот тег только для запланированных записей, чтобы вы могли идентифицировать их при проверке.
Понимание синтаксиса прогнозирования
Каждая запись с датой представляет одно вхождение. Текст описания, такой как [MONTHLY], не имеет эффекта повторения в стандартном Beancount. Более старые инструкции UNTIL, REPEAT и SKIP относятся к пользовательскому соглашению плагина, а не к основному языку. Этот рабочий процесс явно указывает их предполагаемые даты.
Сценарий охватывает период с 1 по 31 января 2024 г. включительно. Все запланированные даты находятся после фиксированной даты на момент и до 1 февраля. Эти исторические даты делают пример воспроизводимым; ничего не зависит от сегодняшней даты. При адаптации выберите новую дату на момент и конечный горизонт перед добавлением записей.
Частота
Записывайте одну транзакцию для каждой даты платежа внутри планового периода. Полный январский пример использует следующие правила:
| Позиция | График | Даты, включенные в январь 2024 г. |
|---|---|---|
| Аренда | Ежемесячно, 1-го числа | 1 января |
| Продукты | Каждые 7 дней, начиная с 1 января | 1, 8, 15, 22, 29 января |
| Зарплата | Каждые 14 дней, начиная с 5 января | 5, 19 января |
| Спортзал | Ежемесячно, 15-го числа | 15 января |
| Платеж по кредиту | Ежемесячно, 25-го числа | 25 января |
| Автостраховка | Каждые 3 календарных месяца, начиная с 15 января | 15 января; следующий платеж 15 апреля выходит за пределы этого горизонта |
Для других ежедневных или ежегодных планов перечислите фактические даты платежей аналогичным образом. Установите политику для таких дат, как 31-е число или 29 февраля, перед расширением графика. Не переносите их молча и не предполагайте, что в каждом месяце одинаковое количество дней.
Условия (необязательно)
1. Установите конечную дату явно
Предположим, членство в спортзале заканчивается 31 декабря 2024 г. Его январское вхождение показано ниже. Январский сценарий заканчивается 31 января, поэтому он не содержит записей за февраль–декабрь. Если вы расширите горизонт, запишите каждый последующий платеж до 15 декабря и остановитесь там.
2024-01-15 ! "Scenario: gym membership" #forecast
Expenses:Health:Gym 80.00 USD
Assets:Checking -80.00 USD2. Ограничьте количество вхождений и разделите основную сумму кредита и проценты
Предположим, по автокредиту осталось 36 платежей. Включите только первый платеж в этот январский горизонт. Для этого гипотетического взноса предположим, что его денежный платеж 450,00 USD состоит из 400,00 USD основной суммы и 50,00 USD процентов. Это допущения сценария; последующие взносы не генерируются.
2024-01-25 ! "Scenario: car loan payment 1 of 36" #forecast
Liabilities:Auto-Loan 400.00 USD
Expenses:Transportation:Interest 50.00 USD
Assets:Checking -450.00 USDПоложительная проводка по обязательству уменьшает сумму долга с −14 400,00 USD до −14 000,00 USD. Денежные средства уменьшаются на 450,00 USD, и только 50,00 USD являются расходом. Проводки сбалансированы, поскольку 400.00 + 50.00 - 450.00 = 0. Отрицательная проводка по обязательству увеличила бы долг.
Не повторяйте одно и то же разделение основной суммы и процентов для всех 36 платежей без подтверждающего графика. Будущие проценты и окончательный платеж могут отличаться. Используйте график платежей кредитора при расширении этого примера; см. амортизацию для различения признания расходов и погашения долга.
3. Записывайте нерегулярные интервалы как фактические даты
Для зарплаты раз в две недели, начинающейся 5 января, январские даты — 5 января и 19 января. Следующее вхождение — 2 февраля, вне этого сценария. Раз в две недели означает каждые 14 дней, а не дважды за календарный месяц.
2024-01-05 ! "Scenario: salary" #forecast
Assets:Checking 3000.00 USD
Income:Salary -3000.00 USD
2024-01-19 ! "Scenario: salary" #forecast
Assets:Checking 3000.00 USD
Income:Salary -3000.00 USDПрактический пример: ежемесячный бюджет
Дополните ваш ежемесячный бюджет, добавив записи о продуктах и автостраховке ниже в scenario-2024-01.beancount. Вместе с арендой, спортзалом, платежом по кредиту и обеими зарплатными записями выше это дает 11 запланированных транзакций.
2024-01-01 ! "Scenario: groceries" #forecast
Expenses:Food:Groceries 150.00 USD
Assets:Checking -150.00 USD
2024-01-08 ! "Scenario: groceries" #forecast
Expenses:Food:Groceries 150.00 USD
Assets:Checking -150.00 USD
2024-01-15 ! "Scenario: groceries" #forecast
Expenses:Food:Groceries 150.00 USD
Assets:Checking -150.00 USD
2024-01-22 ! "Scenario: groceries" #forecast
Expenses:Food:Groceries 150.00 USD
Assets:Checking -150.00 USD
2024-01-29 ! "Scenario: groceries" #forecast
Expenses:Food:Groceries 150.00 USD
Assets:Checking -150.00 USD
2024-01-15 ! "Scenario: quarterly car insurance" #forecast
Expenses:Insurance:Auto 450.00 USD
Assets:Checking -450.00 USDПроверьте обе точки входа, затем запросите их итоговые остатки. date < 2024-02-01 включает все январские проводки. Запрос по книгам использует фиксированную границу на момент date < 2024-01-01.
bea --file books.beancount check
bea --file scenario.beancount check
bea --file books.beancount query "SELECT account, sum(position) WHERE date < 2024-01-01 GROUP BY account ORDER BY account"
bea --file scenario.beancount query "SELECT account, sum(position) WHERE date < 2024-02-01 GROUP BY account ORDER BY account"Обе команды bea check должны завершиться успешно. Сверьте результаты запросов с этими независимыми расчетами:
| Результат | Фактические книги, 31 декабря | Январский сценарий, 31 января |
|---|---|---|
| Чековый счет | 10 000,00 USD | 10 000 + 6 000 − 2 500 − 750 − 80 − 450 − 450 = 11 770,00 USD |
| Остаток по кредиту | −14 400,00 USD | −14 400 + 400 = −14 000,00 USD |
| Проводка дохода от зарплаты | 0,00 USD | −6 000,00 USD |
| Проводки общих расходов | 0,00 USD | 2 500 + 750 + 80 + 450 + 50 = 3 830,00 USD |
Прогнозируемая прибыль за январь составляет 2 170,00 USD: 6 000 дохода минус 3 830 расходов. Чековый счет увеличивается на 1 770,00 USD, потому что дополнительные 400 основной суммы уменьшают долг, а не прибыль.
Откройте сценарий в стандартной Fava:
fava scenario.beancountУстановите фильтр времени Fava на 2024-01. Его фильтрация по времени переносит предыдущие остатки активов и обязательств в период и удаляет более поздние записи. Проверьте балансовый отчет на 11 770,00 USD денежных средств и 14 000,00 USD непогашенного долга. Отчет о прибылях и убытках должен показывать 2 170,00 USD прогнозируемой прибыли. Открытие books.beancount вместо этого дает фактический снимок.
Устранение неполадок и лучшие практики
- Ошибка импорта для старого плагина: удалите строку активации при использовании этого переносимого рабочего процесса. Стандартная установка Fava не предоставляет пользовательские модули Beancount.io.
- Неизвестный счет или отсутствующий файл include: сохраните все три файла в одной директории, скопируйте объявления счетов и проверяйте
scenario.beancount, а не только фрагмент сценария. - Прогнозы отсутствуют в Fava: загрузите
scenario.beancountи установите фильтр времени на2024-01. Тег или описание не создают записи. - Неожиданные остатки: сравните 11 запланированных дат и сумм с таблицей. Загрузка вхождения дважды удваивает его финансовый эффект, даже если каждая транзакция сбалансирована.
- Держите прогнозы отдельно: обычные флаги, теги и будущие даты не предотвращают влияние записей на нефильтрованный отчет. Используйте
books.beancountдля фактических результатов. Когда платеж происходит, записывайте его фактическую сумму там и удаляйте соответствующее допущение из вашего следующего сценария, чтобы не учитывать его дважды. - Пересматривайте горизонт: сохраняйте датированный снимок при сохранении сценария. Расширение его конечной даты означает добавление конкретных вхождений и повторную проверку разделения кредита, дат отмены и округления.