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

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

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

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

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

Перед тим, как зануритись в «как», важно поняти «чому». Якісна бухгалтерія — це основа особистого финансового управленія і необхідний крок до финансовой ясности и свободы.

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

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

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

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

Активи=Зобов’язання+Власний капітал (Чиста вартість)\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 використовує п'ять основних типів рахунків, которие формирують структуру вашого реестра:

Тип рахункаОписаніеЗвичайний баланс
АктивиЧто ви маєте (гроші, банковскіе рахунки, інвестиції, власність).Позитивний
Зобов'язанняЧто ви винні (кредитні карты, кредити, ипотеки).Негативний
ДоходиОткуда приходят гроші (зарплата, бонуси, проценти).Негативний
ВитратиКуда идут гроші (їда, аренда, подорожі, податки).Позитивний
Власний капіталВаша чиста вартисть; используется для начальных балансов.Негативний

Рівняння Beancount

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

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

Именно потому, по звичаю, рахунки Доходи, Зобов'язання и Власний капітал мають негативні значения — они є джерелами грошей, которие збільшають ваші Активи и Витрати.

Часть 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

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

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: Забезпеченіе точності — Искусство звірки

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

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

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

Примічанiе: Балансова ствердженіе перевіряє состоянiе рахунка на начало вказанного дня (перед всеми транзакціями этого дня).

; 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"

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

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

; 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

Рахунок Власний капітал:Открывающие балансы утримує суммы, которие попадають в ваш реестр из невідомих или внешних источников.

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

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

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

Двуїна бухгалтерия ідеально подходит для відслеживанiя грошей, которие вам винні (Активи:Дебиторская задолженность) или которие ви винні (Зобов'язаннi:Кредиторская задолженность).

Примір: Ви платите за группову ужину $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

Рахунок Активи:Дебиторская задолженность:Боб теперь нулевой, и ваші книги идеально збалансированы.

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

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

  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: Бухгалтерия для нерухомості

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

  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. Відслеживанiе подорожанiя (нереализованні прибули): Рыночна вартисть дома меняется. Чтобы відслежувати это без впливу на вашу официальну чисту вартисть (так как прибыль не реализована, пока ви не продадите), ви можете использовать директиву price с «віртуальной» валютой.

    ; 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 без невиправданого збільшення вашого балансового звіта.

Познакомьтесь с живым примером реестра нерухомості с іпотечним відслеживанiем, амортизациею и продажею власності:

Відкрити Примір реестра нерухомості у новій вкладці

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

RSU — это общая форма компенсації акціями. Бухгалтерия для них включає відслеживанiе первоначального гранта, событий вестинга и вирахов податков.

  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 чистих вестнутых акцій появляються на вашому брокерському рахунку с правильной вартистю основи для майбущных розрахунков капітального приросту.

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

Если ваш роботодатель продає утриманні акції на відкритому рынку, а не забирає их по цене вестинга, эта продажа — окрема транзакція — зменшеніе Активи:Брокерський рахунок:Etrade:HOOL против грошей — и люба разница меж ценою продажи и основою $150.00 — это невеликий капітальний прибуток або збиток. Тримуйте его окремо від записи вестинга.

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

Коли ваш реестр росте, организация становіться важной.

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

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

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

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

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

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

Один великий файл складній для управленій. Используйте директиву include для разбитiя вашого реестра на кілька файлов. 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. По даті: Для всех інших загальних транзакцій просте розбитiе по рокам (2024.bean) або місяцам (2024/07.bean) ефективно.

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

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

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

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

Почніте ваш фінансовий шлях с Beancount.io — перегляньте актуальні планы и ціни для того, що входить в кажди рівень.

Панель прикладів beancount.io, що показує графік тренду чистої вартості, баланси рахунків і панель AI-помічника

Переглянути живий реестр →

Звіт про доходи публичного реестра Beancount компанії Apple на beancount.io з графіком чистого прибутку і розбивками доходів і витрат

Переглянути живий реестр →

Балансовий звіт публичного реестра Beancount компанії Apple на beancount.io з графіком чистої вартості і деталями активів і зобов'язань

Переглянути живий реестр →

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