Към основното съдържание

Какво е 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. Запишете покупката: Да кажем, че купувате къща за $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: Проследяване на ограничени акции (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/bg/docs/introduction-to-beancount