Перейти к контенту

Полное руководство по управлению счетами в Beancount и Fava

· 12 мин чтения
Mike Thrift
Mike Thrift
Marketing Manager

План счетов -- это основа вашей книги учёта в Beancount. Хорошо продуманная иерархия счетов делает каждый отчёт понятнее, каждый запрос быстрее, а каждый налоговый сезон менее болезненным. В этом руководстве мы разберём всё, что нужно знать о создании, просмотре, обновлении и закрытии счетов в Beancount и Fava -- от основ для начинающих до продвинутых паттернов.

Пять типов счетов

Beancount использует стандартную модель двойной записи с ровно пятью корневыми типами счетов:

ТипНазначениеОбычный знакОтчёт
AssetsРесурсы, которыми вы владеете (наличные, инвестиции, имущество)Положительный (дебет)Баланс
LiabilitiesДолги, которые вы должны (кредитные карты, займы, ипотека)Отрицательный (кредит)Баланс
EquityСобственный капитал, нераспределённая прибыль, начальные остаткиОтрицательный (кредит)Баланс
IncomeИсточники дохода (зарплата, проценты, дивиденды)Отрицательный (кредит)Отчёт о прибылях и убытках
ExpensesКатегории расходов (еда, аренда, коммунальные услуги)Положительный (дебет)Отчёт о прибылях и убытках

Фундаментальное бухгалтерское уравнение всегда выполняется:

Assets + Expenses + Equity + Income + Liabilities = 0

Полезная эвристика: если суммы имеют значение только за определённый период времени (например, «Сколько я потратил на еду в этом месяце?»), используйте Income или Expenses. Если они представляют текущий остаток (например, «Сколько денег на моём расчётном счёте?»), используйте Assets или Liabilities.

Соглашения об именовании счетов

Имена счетов в Beancount -- это иерархические идентификаторы, разделённые двоеточиями. Правила следующие:

  • Должны начинаться с одного из пяти корневых типов: Assets, Liabilities, Equity, Income, Expenses
  • Каждый компонент начинается с заглавной буквы или цифры
  • Компоненты могут содержать буквы, цифры и дефисы (без пробелов и подчёркиваний)
  • Требуется не менее двух компонентов (например, Expenses:Food, а не просто Expenses)
  • Двоеточия (:) разделяют уровни иерархии
; Допустимые имена счетов
Assets:US:BofA:Checking
Liabilities:CA:RBC:CreditCard
Equity:Retained-Earnings
Income:US:Acme:Salary
Expenses:Food:Groceries
Assets:Crypto:BTC-Holdings

; Недопустимые имена счетов
assets:checking ; корневой тип в нижнем регистре
Assets:my checking ; пробелы не допускаются
Expenses ; только один компонент

Рекомендуемый паттерн именования для балансовых счетов:

Тип : Страна : Учреждение : Счёт : Подсчёт

Например: Assets:US:Vanguard:401k:VTSAX или Liabilities:US:Chase:Sapphire.

Для счетов расходов и доходов используйте именование на основе категорий:

Expenses:Food:Groceries
Expenses:Housing:Utilities:Electric
Income:US:Employer:Salary

Настройка корневых имён

Вы можете переименовать пять корневых типов для локализации или по личным предпочтениям:

option "name_assets"       "Actifs"
option "name_liabilities" "Passifs"
option "name_equity" "Capital"
option "name_income" "Revenus"
option "name_expenses" "Depenses"

Создание счетов (директива Open)

Каждый счёт должен быть объявлен с помощью директивы open до того, как вы сможете проводить по нему транзакции. Полный синтаксис:

YYYY-MM-DD open Account [ConstraintCurrency,...] ["BookingMethod"]

Базовое открытие

2014-05-01 open Assets:US:BofA:Checking

С ограничениями по валюте

Ограничение валют предотвращает случайные проводки в неправильной валюте:

2014-05-01 open Assets:US:BofA:Checking       USD
2014-05-01 open Assets:Cash USD,CAD,EUR
2012-03-01 open Assets:US:ETrade:Main:ITOT ITOT

С методами учёта лотов

Для инвестиционных счетов укажите, как лоты сопоставляются при продаже:

2014-02-11 open Assets:US:ETrade:IVV   IVV   "FIFO"
2014-02-11 open Assets:US:Schwab:AAPL AAPL "LIFO"
2014-02-11 open Assets:US:Fidelity GOOG "STRICT"

Доступные методы учёта лотов:

МетодПоведение
"STRICT"По умолчанию. Требует точного указания лота; выдаёт ошибку при неоднозначности
"FIFO"Первым пришёл -- первым ушёл: уменьшает самые старые лоты первыми
"LIFO"Последним пришёл -- первым ушёл: уменьшает самые новые лоты первыми
"AVERAGE"Объединяет все лоты и пересчитывает среднюю стоимость
"NONE"Без сопоставления лотов; принимается любая цена

С метаданными

2013-03-14 open Assets:US:BTrade:HOOLI
category: "taxable"
institution: "BTrade Corp"
account-number: "XX-1234-5678"

Стратегический выбор даты открытия

  • Используйте дату рождения для универсальных счетов вроде Expenses:Groceries (это даёт пожизненные итоги)
  • Используйте дату начала работы для счетов дохода, связанных с работодателем
  • Используйте фактическую дату создания счёта для счетов, привязанных к учреждениям (банковские счета, кредитные карты)

Автоматическое открытие с помощью плагина

Если вы хотите пропустить ручные директивы open во время прототипирования:

plugin "beancount.plugins.auto_accounts"

Этот плагин автоматически генерирует директивы open для любого счёта, упомянутого в транзакциях. Однако это снижает обнаружение опечаток, поэтому не рекомендуется для продуктивного использования.

Просмотр и запросы по счетам

Использование bean-query (BQL)

# Список всех счетов с остатками
bean-query ledger.beancount "SELECT account, units(sum(position)) GROUP BY 1"

# Список только счетов расходов
bean-query ledger.beancount "SELECT account WHERE account ~ 'Expenses'"

# Выписка по счёту с текущим остатком
bean-query ledger.beancount \
"SELECT date, account, position, balance WHERE account ~ 'BofA:Checking'"

# Журнал для конкретного счёта
bean-query ledger.beancount "JOURNAL 'Assets:US:BofA:Checking'"

Использование bean-report

# Пробный баланс (все счета с итоговыми остатками)
bean-report ledger.beancount balances

# Балансовый отчёт
bean-report ledger.beancount balsheet

# Отчёт о прибылях и убытках
bean-report ledger.beancount income

# Журнал для конкретного счёта
bean-report ledger.beancount journal -a Assets:US:BofA:Checking

Использование Fava

Fava предоставляет богатый визуальный интерфейс для исследования счетов:

  • Страница баланса: интерактивное дерево всех Assets, Liabilities и Equity
  • Страница отчёта о прибылях и убытках: интерактивное дерево всех Income и Expenses
  • Страница счёта: нажмите на любое имя счёта, чтобы увидеть вкладки «Журнал», «Изменения» и «Остатки»
  • Строка фильтра: используйте регулярные выражения для отображения только совпадающих счетов (например, Assets:US)

Обновление счетов (переименование и реорганизация)

В Beancount нет встроенной директивы переименования, но существует несколько подходов.

1. Поиск и замена

Простой поиск и замена работает, но будьте осторожны -- Assets:Bank также совпадёт с Assets:Bank:Cash. Используйте паттерны с учётом границ слов:

sed -i 's/Assets:US:OldBank:Checking/Assets:US:NewBank:Checking/g' *.beancount

2. Плагин rename_accounts

Пакет beancount_reds_plugins предоставляет мощный плагин переименования:

plugin "beancount_reds_plugins.rename_accounts.rename_accounts" "{
'Expenses:Taxes' : 'Income:Taxes',
'Assets:House:Capital-Improvements' : 'Expenses:House:Appliances',
}"

Этот плагин:

  • Использует поиск по подстроке (Expenses:Taxes:Federal автоматически становится Income:Taxes:Federal)
  • Поддерживает регулярные выражения с обратными ссылками
  • Автоматически генерирует директивы Open для переименованных счетов
  • Не модифицирует исходные файлы -- изменяет только представление в памяти
  • Можно включать и выключать, комментируя строку плагина

3. Паттерн «Закрыть и открыть заново»

Для реальной миграции счетов (например, при смене банка):

; Старый счёт
2010-01-01 open Assets:US:OldBank:Checking USD

; Закрытие старого, открытие нового
2024-06-15 close Assets:US:OldBank:Checking
2024-06-15 open Assets:US:NewBank:Checking USD

; Перевод оставшегося остатка
2024-06-15 * "Перевод в новый банк"
Assets:US:OldBank:Checking -5000.00 USD
Assets:US:NewBank:Checking 5000.00 USD

Закрытие счетов

Директива close отмечает счёт как более не активный:

2016-11-28 close Liabilities:CreditCard:CapitalOne

Что делает закрытие

  • Выдаёт ошибку, если проводки происходят после даты закрытия
  • Исключает счёт из отчётов за пределами его активного периода
  • Сообщает Fava скрыть счёт из древовидных представлений (настраивается)

Когда закрывать счета

  • Когда вы закрываете реальный банковский счёт или кредитную карту
  • Когда вы меняете работодателя
  • Когда вы консолидируете или реорганизуете план счетов
  • Когда вы продаёте недвижимость или закрываете инвестиционную позицию

Всегда проверяйте нулевой остаток перед закрытием

Beancount не проверяет нулевой остаток автоматически при закрытии. Добавьте ручную проверку:

2023-12-31 balance Assets:US:OldBank:Savings  0.00 USD
2023-12-31 close Assets:US:OldBank:Savings

Организация плана счетов

Начните просто, совершенствуйте со временем

Вам не нужен идеальный план счетов с первого дня. Начните с широких категорий и детализируйте их по мере роста потребностей в отчётности. Автор Beancount сообщает, что у него более 250 счетов расходов, все они появились органически с течением времени.

Распространённые паттерны организации

Паттерн 1: По учреждению (для балансовых счетов)

Assets:US:BofA:Checking
Assets:US:BofA:Savings
Assets:US:Vanguard:401k:VTSAX
Assets:US:Vanguard:401k:VBTLX
Liabilities:US:Amex:Platinum
Liabilities:US:Chase:Sapphire

Паттерн 2: По категории (для счетов доходов и расходов)

Expenses:Food:Groceries
Expenses:Food:Restaurant
Expenses:Food:Coffee
Expenses:Housing:Rent
Expenses:Housing:Insurance
Expenses:Housing:Utilities:Electric
Expenses:Housing:Utilities:Water
Expenses:Transport:Subway
Expenses:Transport:Gas
Expenses:Health:Medical
Expenses:Health:Dental

Паттерн 3: По географии (для финансов в нескольких странах)

Assets:US:BofA:Checking
Assets:CA:RBC:Checking
Assets:UK:HSBC:Current
Income:US:Acme:Salary
Income:CA:Freelance:Consulting

Паттерн 4: По объекту или проекту (для недвижимости или бизнеса)

Assets:US:Loft4530:Property
Income:US:Loft4530:Rental
Expenses:Loft4530:Electricity
Expenses:Loft4530:Insurance
Expenses:Loft4530:Maintenance

Паттерн 5: Зеркальное отражение связанных счетов (одинаковый компонент учреждения)

Assets:US:ETrade:Cash
Assets:US:ETrade:AAPL
Income:US:ETrade:Dividends
Income:US:ETrade:PnL
Expenses:US:ETrade:Commissions

Насколько глубокой должна быть иерархия?

  • 2-3 уровня -- типично для категорий расходов (Expenses:Food:Restaurant)
  • 3-4 уровня -- для структурированных балансовых статей (Assets:US:Vanguard:401k:VTSAX)
  • Избегайте глубины более 5 уровней, если для этого нет веской причины в отчётности
  • Глубокие иерархии хорошо работают, когда Fava сворачивает их в древовидных представлениях

Пример из реальной жизни

Вот практический план счетов для личных финансов:

; ── Активы ──
Assets:US:BofA:Checking USD
Assets:US:BofA:Savings USD
Assets:US:Vanguard:401k:VTSAX VTSAX
Assets:US:Vanguard:Roth:VTSAX VTSAX
Assets:US:ETrade:Cash USD
Assets:US:ETrade:AAPL AAPL
Assets:Cash:Wallet USD

; ── Обязательства ──
Liabilities:US:Amex:Platinum USD
Liabilities:US:Chase:Freedom USD
Liabilities:US:BofA:Mortgage USD

; ── Доходы ──
Income:US:Employer:Salary
Income:US:Employer:Bonus
Income:US:Employer:Match401k
Income:US:ETrade:Dividends
Income:US:BofA:Interest

; ── Расходы ──
Expenses:Food:Groceries
Expenses:Food:Restaurant
Expenses:Food:Coffee
Expenses:Housing:Rent
Expenses:Housing:Insurance
Expenses:Housing:Utilities:Electric
Expenses:Housing:Utilities:Water
Expenses:Transport:Subway
Expenses:Transport:Taxi
Expenses:Transport:Gas
Expenses:Health:Medical
Expenses:Health:Dental
Expenses:Health:Pharmacy
Expenses:Shopping:Clothing
Expenses:Shopping:Electronics
Expenses:Entertainment:Streaming
Expenses:Entertainment:Books
Expenses:Travel:Flights
Expenses:Travel:Hotels
Expenses:Taxes:Federal
Expenses:Taxes:State
Expenses:Taxes:SocialSecurity
Expenses:Taxes:Medicare

; ── Собственный капитал ──
Equity:Opening-Balances
Equity:Retained-Earnings

Возможности, специфичные для Fava

Индикаторы актуальности

Одна из лучших функций Fava для управления счетами. Добавьте эти метаданные к любому счёту:

2014-05-01 open Assets:US:BofA:Checking  USD
fava-uptodate-indication: TRUE

Fava отображает цветные точки рядом со счётом:

  • Зелёная точка: последняя запись -- пройденная проверка остатка (счёт сверен)
  • Красная точка: последняя запись -- непройденная проверка остатка (требует внимания)
  • Жёлтая точка: последняя запись существует, но не является проверкой остатка (ещё не сверен)
  • Серая точка: нет активности в течение периода просмотра

Настройка порога для серого индикатора:

2016-06-14 custom "fava-option" "uptodate-indicator-grey-lookback-days" "60"

Управление древовидным представлением

Управление отображением счетов в Fava:

; Показывать закрытые счета в дереве
2016-06-14 custom "fava-option" "show-closed-accounts" "true"

; Показывать счета без транзакций
2016-06-14 custom "fava-option" "show-accounts-with-zero-transactions" "true"

; Показывать счета с нулевым остатком
2016-06-14 custom "fava-option" "show-accounts-with-zero-balance" "true"

Паттерны сворачивания

Сворачивание глубоко вложенных счетов по умолчанию:

; Сворачивать все счета с глубиной 3+ уровня
2016-06-14 custom "fava-option" "collapse-pattern" ".*:.*:.*"

; Сворачивать конкретные поддеревья
2016-06-14 custom "fava-option" "collapse-pattern" "Assets:US:Vanguard:.*"

Включение дочерних счетов в журнал

При просмотре журнала счёта в Fava включить проводки из дочерних счетов:

2016-06-14 custom "fava-option" "account-journal-include-children" "true"

Инверсия знаков для удобства чтения

По умолчанию доходы и обязательства отображаются как отрицательные числа (их естественный знак). Чтобы показывать их как положительные:

2016-06-14 custom "fava-option" "invert-income-liabilities-equity" "true"

Управление документами

Fava интегрирует работу с документами в вашу иерархию счетов. Укажите корневую папку документов:

option "documents" "/path/to/documents"

Затем организуйте файлы по пути счёта:

/path/to/documents/
Assets/
US/
BofA/
Checking/
2024-01-15.january-statement.pdf
2024-02-15.february-statement.pdf
Liabilities/
US/
Amex/
Platinum/
2024-03-15.march-bill.pdf

Файлы, начинающиеся с YYYY-MM-DD, автоматически обнаруживаются Fava и отображаются в журнале счёта.

Частые ошибки и как их избежать

1. Опечатки в именах счетов

Одна опечатка, например Expenses:Grocries, создаёт совершенно новый, непреднамеренный счёт.

Решение: Не используйте плагин auto_accounts в продуктивной среде. Требуйте явные директивы open. Beancount немедленно выдаст ошибку при любом необъявленном счёте:

ERROR: Invalid reference to unknown account 'Expenses:Grocries'

2. Забытые ограничения по валюте

Без ограничений по валюте вы можете случайно провести EUR на счёт, предназначенный только для USD.

Решение: Всегда указывайте валюты в директивах open:

2014-01-01 open Assets:US:BofA:Checking  USD

3. Нерегулярная проверка остатков

Без регулярных проверок остатков ошибки могут оставаться незамеченными месяцами.

Решение: Добавляйте ежемесячные проверки остатков для каждого активного счёта:

2024-01-01 balance Assets:US:BofA:Checking   5,432.10 USD
2024-02-01 balance Assets:US:BofA:Checking 4,890.55 USD
2024-03-01 balance Assets:US:BofA:Checking 6,123.00 USD

4. Непоследовательные соглашения об именовании

Смешивание паттернов (например, Expenses:Food и Expenses:US:Food) делает запросы и отчёты запутанными.

Решение: Выберите соглашение и придерживайтесь его. Используйте префиксы стран для балансовых счетов и именование по категориям для доходов и расходов.

5. Закрытие без проверки нулевого остатка

Директива close не проверяет остаток. Вы можете закрыть счёт, на котором ещё есть деньги.

Решение: Всегда сочетайте закрытие с проверкой остатка:

2023-12-31 balance Assets:US:OldBank:Savings  0.00 USD
2023-12-31 close Assets:US:OldBank:Savings

Продвинутые паттерны

Советы по мультивалютности

Объявите ваши операционные валюты для выделенных столбцов в отчётах:

option "operating_currency" "USD"
option "operating_currency" "EUR"

Для мультивалютных счетов перечислите все допустимые валюты:

2014-01-01 open Assets:Cash  USD,CAD,EUR

Проверки остатков с несколькими валютами должны выполняться по одной валюте за раз:

2024-01-01 balance Assets:Cash     562.00 USD
2024-01-01 balance Assets:Cash 210.00 CAD
2024-01-01 balance Assets:Cash 60.00 EUR

Pad и Balance для начальной настройки

Используйте директиву pad для установки начальных остатков без ручного расчёта сумм:

2000-05-28 open Assets:US:BofA:Checking  USD
2000-05-28 pad Assets:US:BofA:Checking Equity:Opening-Balances
2024-07-01 balance Assets:US:BofA:Checking 12,345.67 USD

Beancount автоматически синтезирует корректирующую транзакцию. Важный нюанс: проверки остатков проверяют остаток на начало указанной даты. Поэтому pad от 2 января требует проверки остатка от 3 января или позже.

Метаданные счетов для категоризации

Используйте метаданные в директивах open для пользовательской отчётности:

2014-01-01 open Assets:US:BofA:Checking  USD
category: "liquid"
tax-status: "taxable"

2014-01-01 open Assets:US:Vanguard:401k USD
category: "retirement"
tax-status: "tax-deferred"

Запрос метаданных через BQL:

SELECT account, META("category") WHERE META("tax-status") = "taxable"

Заметки для истории счёта

Прикрепляйте датированные заметки к журналу любого счёта:

2024-03-20 note Assets:US:BofA:Checking "Звонил по поводу оспариваемого списания, реф. #12345"
2024-06-01 note Liabilities:US:Chase:Sapphire "Годовая комиссия отменена после звонка в отдел удержания"

Эти заметки отображаются в журнале счёта в Fava, обеспечивая аудиторский след.

Отслеживание счетов и целевое резервирование

В Beancount нет виртуальных проводок, как в Ledger, но вы можете использовать подсчета для целевого резервирования:

; Отслеживание резервного фонда внутри расчётного счёта
Assets:US:BofA:Checking:EmergencyFund USD
Assets:US:BofA:Checking:Operating USD

; Отслеживание возмещений
Assets:Receivables:Employer:Travel USD
Assets:Receivables:Friend:SharedDinner USD

Налогово-ориентированные категории расходов

Структурируйте счета расходов так, чтобы упростить подготовку налоговой отчётности:

Expenses:Health:Medical:Deductible
Expenses:Charity:Deductible
Expenses:Business:Office
Expenses:Business:Equipment
Expenses:Education:Professional

Краткая справочная шпаргалка

ЗадачаСинтаксис
Открыть счёт2024-01-01 open Assets:US:BofA:Checking USD
Закрыть счёт2024-12-31 close Assets:US:OldBank:Savings
Проверить остаток2024-01-01 balance Assets:US:BofA:Checking 5,432.10 USD
Выровнять до остатка2024-01-01 pad Assets:Cash Equity:Opening-Balances
Добавить заметку2024-01-15 note Assets:US:BofA:Checking "Ежемесячная сверка выполнена"
Прикрепить документ2024-01-15 document Assets:US:BofA:Checking "/path/to/statement.pdf"
Добавить метаданныеПара «ключ-значение» с отступом на строке после open
Автооткрытие (разработка)plugin "beancount.plugins.auto_accounts"
Ограничить валюту2024-01-01 open Assets:Cash USD,EUR
Задать метод учёта лотов2024-01-01 open Assets:US:ETrade:AAPL AAPL "FIFO"

Итоги

Грамотное управление счетами -- это основа эффективного бухгалтерского учёта в Beancount. Вот ключевые выводы:

  1. Всегда используйте явные директивы open -- они отлавливают опечатки и обеспечивают дисциплину
  2. Добавляйте ограничения по валюте, чтобы предотвратить ошибки с кросс-валютными проводками
  3. Используйте единое соглашение об именовании -- по учреждению для балансовых счетов, по категории для доходов и расходов
  4. Начните просто и совершенствуйте -- детализируйте счета по мере роста потребностей в отчётности
  5. Регулярно проверяйте остатки -- ежемесячная сверка выявляет ошибки на ранней стадии
  6. Закрывайте счета правильно -- с проверкой нулевого остатка
  7. Используйте возможности Fava -- индикаторы актуальности, паттерны сворачивания и интеграцию с документами
  8. Используйте метаданные для пользовательской категоризации и отчётности

Удачного учёта!

References: