Перейти к основному содержимому

Что такое 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

Привязка подтверждающих документов (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: Глубокое погружение — моделирование сложных реальных активов​

Пример 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. Запишите покупку: Допустим, вы покупаете дом за $500 тыс. с первоначальным взносом $100 тыс. и кредитом $400 тыс.

    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: Отслеживание ограниченных акций (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: Управление проектом для вашей главной книги​

По мере роста журнала организация становится ключевой.

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

Начните свой финансовый путь с 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/ru/docs/introduction-to-beancount