Повний посібник з керування рахунками в 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"
Керування документами
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 не перевіряє залишок. Ви можете закрити рахунок, на якому ще є кошти.
Рішення: Завжди поєднуйте 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