Перейти до основного вмісту

Що таке Beancount: прості текстові книги подвійного запису

Beancount — це простий текстовий облік подвійного запису для акцій, криптовалют і повсякденних книг — що це таке і чому інженери його використовують.

Цей посібник узагальнює найкращі практики ведення бухгалтерії у звичайному тексті за допомогою потужного відкритого інструменту обліку у звичайному тексті Beancount. Він охоплює основоположну філософію, синтаксис від базового до просунутого, практичні приклади для складних активів і стратегії довгострокового управління журналом.

Часть 1: «Чому» — основи розумної бухгалтерії​

Перш ніж заглиблюватися в "як", важливо зрозуміти "чому". Ефективне ведення книг — це фундамент особистого управління фінансами та необхідний крок до фінансової ясності й свободи.

За межами відстеженія витрат: шлях до финансовой ясности​

Прості застосунки для відстеження витрат кажуть вам, куди пішли ваші гроші. Надійна система обліку каже вам це й набагато більше: вона дає повну картину вашого фінансового здоров'я, включно з вашим чистим капіталом, грошовим потоком і результативністю ваших інвестицій. Головна мета — спостережуваність: отримати чітке, засноване на даних розуміння вашого фінансового життя, яке дає змогу ухвалювати обґрунтовані рішення, оцінювати ризик і працювати над довгостроковими цілями, як-от вихід на пенсію.

Чому двоїне ведення? Сила збалансированої системи​

На відміну від однократного запису (простий список витрат), метод подвійного запису фіксує кожну транзакцію як потік цінності між щонайменше двома рахунками. Його основний принцип — фундаментальне бухгалтерське рівняння:

Активи=Зобов’язання+Власний капітал (чистий капітал)\text{Активи} = \text{Зобов'язання} + \text{Власний капітал (чистий капітал)}

Ця система гарантує, що ваші книги завжди збалансовані, що різко зменшує кількість помилок. Вона дає повну фінансову картину, генеруючи ключові звіти, як-от баланс (що ви маєте і що винні) та звіт про прибутки і збитки (що ви заробили і витратили).

Часть 2: Початок робот с Beancount​

Beancount — це потужний інструмент на базі Python для ведення бухгалтерії у звичайному тексті.

Ваш перший погляд на Fava в Beancount.io​

Beancount.io надає потужне середовище, яке поєднує рушій Beancount із мобільним застосунком (iOS, Android) і вебзастосунком — Fava, чудовий вебінтерфейс для візуалізації вашого журналу. Встановлення не потрібне. Коли ви користуєтеся платформою, ви безпосередньо взаємодієте з текстовим редактором для вашого файлу журналу (наприклад, main.bean) і бачите, як звіти, згенеровані Fava, оновлюються в реальному часі.

Fava бере звичайний текст, який ви пишете, і перетворює його на інтерактивні діаграми, фінансові звіти та списки транзакцій із фільтрацією, даючи вам чіткий огляд ваших фінансових звітів.

Або почніть у терміналі з bea​

Якщо ви волієте працювати з оболонки, bea — це командний рядок Beancount.io. Обліковий запис не потрібен: встановіть його командою brew install bex-co/tap/bea або uv tool install beancount-io, і він створює, перевіряє, виконує запити та формує звіти на тому самому файлі у звичайному тексті. Швидкий старт CLI дає вам перший журнал за кілька хвилин, а Ваш перший місяць із bea закриває повний місяць від початку до кінця.

П'ять основних типів рахунків​

Beancount використовує п'ять типів рахунків верхнього рівня, які формують структуру вашого журналу:

Тип рахункуОписТиповий баланс
AssetsТе, що ви маєте (готівка, банківські рахунки, інвестиції, нерухомість).Додатний
LiabilitiesТе, що ви винні (борг за кредитною карткою, позики, іпотеки).Від'ємний
IncomeЗвідки надходять гроші (зарплата, бонуси, відсотки).Від'ємний
ExpensesКуди йдуть гроші (їжа, оренда, подорожі, податки).Додатний
EquityВаш чистий капітал; використовується для початкових балансів.Від'ємний

Рівняння Beancount​

Beancount застосовує власну версію бухгалтерського рівняння, де сума всіх проводок у всьому вашому журналі дорівнює нулю:

Активи+Витрати+Зобов’язання+Доходи+Власний капітал=0\text{Активи} + \text{Витрати} + \text{Зобов'язання} + \text{Доходи} + \text{Власний капітал} = 0

Ось чому, за домовленістю, рахунки Income, Liabilities і Equity мають від'ємні значення — вони є джерелами коштів, які збільшують ваші Assets і Expenses.

Часть 3: Язик Beancount — Основний синтаксис​

Усі записи в Beancount — це директиви, які починаються з дати.

Визначення рахунків (open) и Товарів​

Перш ніж використовувати рахунок, ви маєте оголосити його директивою open. Ви також можете за бажанням вказати валюти або "товари", які він міститиме.

; YYYY-MM-DD open Account:Name [Commodity1, Commodity2, ...]
2020-01-01 open Assets:Bank:US:Chase:Checking      USD
2020-01-01 open Liabilities:CreditCard:US:Discover USD
2020-01-01 open Expenses:Food:Groceries
2020-01-01 open Income:Salary:Google

Товарами можуть бути реальні валюти (наприклад, USD, JPY) або будь-яка визначена вами одиниця, як-от милі авіакомпанії (MILES_UA) чи біржові тікери (HOOL).

Запись вашей первой транзакції (*)​

Транзакції — найпоширеніший тип запису. Вони починаються з дати, прапорця (* для завершеної транзакції або ! для незавершеної), необов'язкового отримувача платежу та опису. Кожен наступний рядок (з відступом у два пробіли) — це "проводка" на рахунок.

; YYYY-MM-DD * "Payee" "Description"
;   Account1      Amount Commodity
;   Account2     -Amount Commodity
 
2024-07-28 * "Trader Joe's" "Weekly groceries"
  Expenses:Food:Groceries     125.50 USD
  Liabilities:CreditCard:US:Discover  -125.50 USD

Для зручності, якщо транзакція має лише дві проводки, ви можете опустити суму в другому рядку, і Beancount обчислить її автоматично.

2024-07-28 * "Trader Joe's" "Weekly groceries"
  Expenses:Food:Groceries     125.50 USD
  Liabilities:CreditCard:US:Discover

Балансування на рівні транзакції: Що важливіше для щоденного використання, кожна окрема транзакція також має балансуватися — сума всіх проводок у межах однієї транзакції має дорівнювати нулю. Якщо транзакція не балансується, Beancount покаже помилку, як ця:

Beancount Error Alert

Обробка мультивалютных транзакцій (@ и @@)​

Beancount чудово справляється з багатовалютним обліком.

  • Використовуйте @, щоб указати ціну конвертації за одиницю.
  • Використовуйте @@, щоб указати загальну вартість конвертації.
; Buying a flight in EUR with a USD card
2024-08-01 * "Lufthansa" "Flight to Berlin"
  Expenses:Travel:Flights      500.00 EUR @@ 545.00 USD  ; 500 EUR cost me 545 USD in total
  Liabilities:CreditCard:US:Discover  -545.00 USD

Часть 4: Забезпеченіе точності — Искусство звірки​

Ключова практика для підтримання точного журналу — регулярне звіряння. Воно полягає в порівнянні балансів у вашому журналі Beancount з офіційними виписками від ваших фінансових установ.

Автоматизация перевірок с балансовыми ствердженіями (balance)​

Директива balance — ваш основний інструмент для автоматичних перевірок. Ви стверджуєте, що на певну дату рахунок мав конкретний баланс. Beancount видасть помилку, якщо обчислений ним баланс не збігається з вашим твердженням. Це безцінно для швидкого знаходження помилок.

Примітка: Перевірка балансу перевіряє стан рахунку на початку вказаного дня (до будь-яких транзакцій цього дня).

; From your monthly credit card statement
2024-08-01 balance Liabilities:CreditCard:US:Discover  -1432.78 USD

Связыванiе поддерживающих документов (document)​

Ви можете посилатися на зовнішні файли, як-от банківські виписки чи квитанції, створюючи слід, що піддається аудиту. Fava робить ці посилання клікабельними.

2024-08-01 document Liabilities:CreditCard:US:Discover "statements/discover-2024-07.pdf"

Виправленіе ошибок и ініціализация балансов​

Коли ви починаєте свій журнал або виявляєте розбіжність, яку не можете відстежити, вам потрібно зробити коригування. Стандартна практика — використовувати спеціальний рахунок Equity.

; Initializing a cash account when starting your ledger
2020-01-01 * "Initial Balance" "Setting up cash account"
  Assets:Cash:Wallet           200.00 USD
  Equity:Opening-Balances     -200.00 USD

Рахунок Equity:Opening-Balances містить суми, які надходять до вашого журналу з невідомих або зовнішніх джерел.

Для швидких виправлень, де точна розбіжність неважлива, директива pad може автоматично скоригувати баланс рахунку, щоб задовольнити наступне твердження balance, відносячи різницю на рахунок власного капіталу. Використовуйте це з обережністю, оскільки це може приховати більші проблеми. Явні коригування зазвичай безпечніші.

Часть 5: Просунуті и реалистичні шаблони транзакцій​

Відслеживаніе долгов: управленіе дебиторской и кредиторской задолженностью​

Бухгалтерія подвійного запису ідеально підходить для відстеження грошей, які винні вам (Assets:Receivables) або які винні ви (Liabilities:Payable).

Приклад: Ви платите за групову вечерю $90, і ваш друг Боб винен вам свою частку в $45.

  1. Запишіть початкову витрату та дебіторську заборгованість:

    2024-08-05 * "Dinner Place" "Dinner with Bob"
      Expenses:Food:Restaurant          45.00 USD  ; Your share
      Assets:Receivables:Bob            45.00 USD  ; Bob owes you
      Assets:Bank:US:Chase:Checking    -90.00 USD
  2. Коли Боб повертає вам гроші:

    2024-08-06 * "Bob" "Paid me back for dinner"
      Assets:Bank:US:Chase:Checking     45.00 USD
      Assets:Receivables:Bob           -45.00 USD

Рахунок Assets:Receivables:Bob тепер нульовий, і ваші книги ідеально збалансовані.

Активи проти витрат: покупка автомобіля и амортизация​

Велика покупка, як-от автомобіль, — це не проста витрата; це придбання активу, який з часом втрачає вартість (амортизація).

  1. Запишіть покупку як актив:

    2023-01-15 * "Toyota Dealer" "Purchase of a new car"
      Assets:Car:ToyotaCamry         30000.00 USD
      Assets:Bank:US:Chase:Checking -30000.00 USD
  2. Запишіть річну амортизацію: Припустімо, ви оцінюєте, що авто втрачає $3,000 вартості щороку. Наприкінці року ви записуєте це як витрату.

    2023-12-31 * "Depreciation" "Annual car value depreciation"
      Expenses:Depreciation:Car      3000.00 USD
      Assets:Car:ToyotaCamry        -3000.00 USD

Після цього запису ваш рахунок Assets:Car:ToyotaCamry правильно відображає нову вартість авто ($27,000), і ви належно врахували витрати на використання як витрату за цей рік.

Часть 6: Погруженіе в детали — Моделированиe складних реальных активів​

Кейс 1: Бухгалтерия для нерухомості​

Дім часто є вашим найбільшим активом і зобов'язанням. Ось як його змоделювати.

  1. Створіть рахунки та власний товар:

    2022-01-01 commodity HOUSE_123MAIN
      name: "Property at 123 Main St"
    2022-01-01 open Assets:Property:Home:123Main        HOUSE_123MAIN
    2022-01-01 open Liabilities:Mortgage:HomeLoan       USD
    2022-01-01 open Expenses:Home:Interest
    2022-01-01 open Expenses:Home:PropertyTax
  2. Запишіть покупку: Скажімо, ви купуєте дім за $500k з початковим внеском $100k і позикою $400k.

    2022-03-15 * "Settlement Company" "Purchase of 123 Main St"
      Assets:Property:Home:123Main          1 HOUSE_123MAIN {500000.00 USD}
      Assets:Bank:DownPayment          -100000.00 USD
      Liabilities:Mortgage:HomeLoan    -400000.00 USD
  3. Запишіть щомісячні платежі за іпотекою: Ваш щомісячний платіж складається з основної суми (зменшує зобов'язання) та відсотків (витрата).

    2022-04-01 * "Mortgage Bank" "Monthly Mortgage Payment"
      Liabilities:Mortgage:HomeLoan      800.00 USD   ; Principal
      Expenses:Home:Interest            1200.00 USD   ; Interest
      Assets:Bank:US:Chase:Checking    -2000.00 USD
  4. Відстеження зростання вартості (нереалізовані прибутки): Ринкова вартість дому змінюється. Щоб відстежувати це, не впливаючи на ваш офіційний чистий капітал (оскільки прибуток не реалізується до продажу), ви можете використати директиву ціни з "віртуальною" валютою.

    Для підтримуваних ринкових активів і валютних пар Live Prices можуть підтримувати котирування оцінки в розміщеному журналі. Окремі об'єкти нерухомості все ще потребують ваших власних оцінок і датованих цін, як у прикладі нижче.

    ; The purchase price is the real cost basis
    2022-03-15 price HOUSE_123MAIN   500000.00 USD
     
    ; An updated market estimate is an unrealized gain
    2024-01-01 price HOUSE_123MAIN   550000.00 USD.UNREALIZED

Це дає вам змогу бачити оцінену вартість на діаграмах Fava, не завищуючи неналежним чином ваш баланс.

Ознайомтеся з живим прикладом журналу нерухомості з відстеженням іпотеки, амортизацією та продажем майна:

Відкрити Real Estate Example Ledger у новій вкладці

Кейс 2: Відслеживанiе обмеженних акцій (RSU)​

RSU — поширена форма винагороди у вигляді акцій. Їхній облік передбачає відстеження початкового гранту, подій вестингу та утримання податків.

  1. Початкове налаштування: Створіть товари для вестингових (HOOL) і невестингових (HOOL.UNVEST) акцій, а також для кожного рахунку, якого торкаються подальші записи. Оголошення всіх їх наперед — це те, що дає змогу двом транзакціям нижче завантажуватися окремо.

    2021-01-01 commodity HOOL
    2021-01-01 commodity HOOL.UNVEST
    2021-01-01 open Assets:Brokerage:Etrade:HOOL          HOOL
    2021-01-01 open Assets:Grant:Unvested                 HOOL.UNVEST
    2021-01-01 open Income:Grant:Awards                   HOOL.UNVEST
    2021-01-01 open Expenses:Grant:Vested                 HOOL.UNVEST
    2021-01-01 open Income:Salary:Hooli:RSU               USD
    2021-01-01 open Expenses:Taxes:Federal                USD
    2021-01-01 open Expenses:Taxes:State                  USD
  2. Запишіть початковий грант: Ця транзакція показує, як загальний грант переміщується на рахунок невестингових активів. Поки що нічого не оподатковується, тож весь запис номіновано в товарі відстеження HOOL.UNVEST.

    2021-02-01 * "Hooli" "Initial RSU Grant"
      Assets:Grant:Unvested        1000 HOOL.UNVEST
      Income:Grant:Awards         -1000 HOOL.UNVEST
  3. Запишіть подію вестингу: Це ключова транзакція. Коли акції вестуються, ви визнаєте дохід, роботодавець утримує акції для сплати податку, а решту ви залишаєте собі. Припустімо, 100 акцій вестуються за $150.00, тож:

    • Валовий дохід: 100 × $150.00 = $15,000.00
    • Акції, утримані для податку: 40 × $150.00 = $6,000.00 (федеральний $4,800.00 + штатний $1,200.00)
    • Акції, які ви залишаєте: 60 × $150.00 = $9,000.00 бази витрат
    • Готівка вам: $0.00 — усе утримання сплачено акціями

    Ці суми є записом, і вони звіряються: $6,000.00 податку плюс $9,000.00 утриманих акцій — це саме $15,000.00 доходу.

    2022-02-01 * "Hooli" "RSU Vesting Event"
      ; Ordinary income: 100 shares * $150.00
      Income:Salary:Hooli:RSU                   -15000.00 USD
      ; Tax withheld, funded by 40 of the 100 shares (40 * $150.00 = $6,000.00)
      Expenses:Taxes:Federal                      4800.00 USD
      Expenses:Taxes:State                        1200.00 USD
      ; The 60 shares you keep, at their $150.00 vesting-day basis
      Assets:Brokerage:Etrade:HOOL                  60 HOOL {150.00 USD}
      ; Retire the 100 unvested units the grant was tracking
      Assets:Grant:Unvested                       -100 HOOL.UNVEST
      Expenses:Grant:Vested                        100 HOOL.UNVEST

Ця єдина, збалансована транзакція моделює всю подію: невестинговий грант зменшується, дохід визнається, податок утримується, а 60 чистих вестингових акцій з'являються на вашому брокерському рахунку з правильною базою витрат для майбутніх розрахунків приросту капіталу.

Дві деталі варто скопіювати у ваш власний журнал. По-перше, розпишіть утримання рахунок за рахунком, а не дозволяйте якомусь універсальному балансувальному рахунку поглинути його — якщо федеральна та штатна проводки не сумуються до вартості утриманих акцій, транзакція не збалансується, і Beancount вам про це скаже. По-друге, не залишайте порожнього рядка між проводками: порожній рядок завершує транзакцію, і Beancount повідомляє про синтаксичну помилку в проводках, що йдуть за ним.

Якщо ваш роботодавець продає утримані акції на відкритому ринку, а не забирає їх назад за ціною вестингу, продаж є окремою транзакцією — зменшенням Assets:Brokerage:Etrade:HOOL проти готівки — і будь-яка різниця між ціною продажу та базою $150.00 є невеликим приростом або збитком капіталу. Тримайте це окремо від запису вестингу.

Часть 7: Управленiе проектом для вашого реестра​

У міру зростання вашого журналу організація стає ключовою.

Использованiе системи контролю версій (Git) для захисту ваших данных​

Оскільки ваш журнал — це текстовий файл, він ідеально підходить для контролю версій за допомогою Git. Це дає вам повну історію всіх змін, захищаючи вас від випадкових видалень чи помилок. Попередження: Ваші фінансові дані надзвичайно чутливі. Використовуйте приватний репозиторій на сервісах, як-от GitHub/GitLab, або розмістіть власний.

Организация с помощью тегов (#) і посилань (^)​

Beancount надає два способи групування транзакцій поза рахунками:

  • Теги (#): Використовуйте для подій або проєктів. Ви можете, наприклад, відфільтрувати всі транзакції, пов'язані з конкретною подорожжю. 2024-07-20 * "Hotel" "Vienna" #trip-europe-2024
  • Посилання (^): Використовуйте, щоб пов'язати фінансово споріднені транзакції, які відбуваються в різний час, як-от зняття готівки та пов'язана з ним банківська комісія.

Масштабируема стратегия для структурирования ваших файлов (include)​

Один величезний файл важко обслуговувати. Використовуйте директиву include, щоб розділити ваш журнал на кілька файлів. main.bean:

; Main ledger file
 
; Global options
option "title" "My Personal Ledger"
option "operating_currency" "USD"
 
; Include account declarations and other files
include "accounts.bean"
include "years/2023.bean"
include "years/2024.bean"
include "events/trip-europe-2024.bean"

Надійна стратегія організації, за порядком пріоритету:

  1. За подією: Створіть окремий файл для великої, самодостатньої події (наприклад, trip-europe-2024.bean).
  2. За категорією/отримувачем платежу: Для дуже регулярних, повторюваних транзакцій, як-от комунальні платежі чи зарплата, згрупуйте їх у власному файлі (наприклад, recurring-rent.bean).
  3. За рахунком: Для транзакцій, тісно пов'язаних із конкретним рахунком (відсотки, комісії, платежі за кредитною карткою), розгляньте файл, специфічний для рахунку.
  4. За датою: Для всіх інших загальних транзакцій ефективним є простий поділ за роком (2024.bean) або місяцем (2024/07.bean).

Часть 8: Висновок​

Beancount пропонує круту криву навчання, але винагороджує зусилля неперевершеною потужністю, гнучкістю та контролем над вашими фінансовими даними. Сприймаючи принципи бухгалтерії подвійного запису та практичні інструменти, які надає Beancount, ви можете перейти від простого відстеження витрат до повної, точної та проникливої системи особистого управління фінансами. Ваш журнал стає постійним, приватним і безцінним активом для розуміння вашого минулого та планування вашого майбутнього.

Початок работы с Beancount.io​

Beancount.io — це сучасна хмарна платформа управління фінансами, яка перетворює ваші текстові записи транзакцій на комплексні фінансові звіти, включно зі звітами про прибутки і збитки, балансами та оборотно-сальдовими відомостями. Поєднуючи надійність файлів у звичайному тексті з потужними інструментами візуалізації, Beancount.io допомагає вам підтримувати точний контроль над вашим фінансовим життям, водночас отримуючи цінні insights про результативність ваших інвестицій.

Почніть свою фінансову подорож із Beancount.io — перегляньте поточні плани та ціни, щоб дізнатися, що включає кожен рівень.

beancount.io ledger dashboard showing a net worth trend chart, account balances, and an AI assistant bar

Дослідіть живий журнал →

Income statement of Apple's public Beancount ledger on beancount.io with net profit chart and income and expense breakdowns

Дослідіть живий журнал →

Balance sheet of Apple's public Beancount ledger on beancount.io with net worth chart and assets and liabilities detail

Дослідіть живий журнал →

Джерело: https://beancount.io/uk/docs/introduction-to-beancount