Полное руководство по управлению счетами в Beancount и Fava
План счетов -- это основа вашей книги учёта в 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"