План счетов -- это основа вашей книги учёта в 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' *.beancount2. Плагин 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: TRUEFava отображает цветные точки рядом со счётом:
- Зелёная точка: последняя запись -- пройденная проверка остатка (счёт сверен)
- Красная точка: последняя запись -- непройденная проверка остатка (требует внимания)
- Жёлтая точка: последняя запись существует, но не является проверкой остатка (ещё не сверен)
- Серая точка: нет активности в течение периода просмотра
Настройка порога для серого индикатора:
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 USD3. Нерегулярная проверка остатков
Без регулярных проверок остатков ошибки могут оставаться незамеченными месяцами.
Решение: Добавляйте ежемесячные проверки остатков для каждого активного счёта:
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 USD4. Непоследовательные соглашения об именовании
Смешивание паттернов (например, 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 EURPad и 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 USDBeancount автоматически синтезирует корректирующую транзакцию. Важный нюанс: проверки остатков проверяют остаток на начало указанной даты. Поэтому 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. Вот ключевые выводы:
- Всегда используйте явные директивы
open-- они отлавливают опечатки и обеспечивают дисциплину - Добавляйте ограничения по валюте, чтобы предотвратить ошибки с кросс-валютными проводками
- Используйте единое соглашение об именовании -- по учреждению для балансовых счетов, по категории для доходов и расходов
- Начните просто и совершенствуйте -- детализируйте счета по мере роста потребностей в отчётности
- Регулярно проверяйте остатки -- ежемесячная сверка выявляет ошибки на ранней стадии
- Закрывайте счета правильно -- с проверкой нулевого остатка
- Используйте возможности Fava -- индикаторы актуальности, паттерны сворачивания и интеграцию с документами
- Используйте метаданные для пользовательской категоризации и отчётности
Удачного учёта!