текстова бухгалтерія за допомогою ledger

| ledger, гроші, підказка

років п’ять тому, приїхавши до канади з невеликою кількістю грошей, я спробував вести «домашню бухгалтерію». до того, ще в україні, я вже пробував різні додатки для windows mobile на кпк, потім щось для android на мудрофоні, навіть gnucash на ноутбуці… ніщо не прижилося. тож я шукав щось простіше, і перечепився через ledger. мінімаліст у мені закохався з першого погляду! тож цього разу я протримався… чотири роки, занотовуючи витрати з більшою чи меншою деталізацією, — але в підсумку втратив інтерес та припинив. тепер прийшов час пригадати, — а заразом розкажу, як воно робиться.

зміст

чому звичайний текст?

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

  • цей щоденник (у форматі kramdown, який автомагічно конвертується в статичний сайт за допомогою jekyll)
  • нотатки: власні й робочі, конспекти під час навчання тощо (asciidoc)
  • скрипти й програми (переважно bash та python)
  • задачі (у форматі todo.txt)

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

«текстова» бухгалтерія — це як?

щодо особистих видатків, — зрозуміло, що можна було би просто занотовувати все до текстового файлу, періодично підсумовувати на калькуляторі й робити якісь висновки… але це надто примітивно: навіть середньовічні торговці в європі вже використовували складніші підходи, як от подвійний запис, тож у еру комп’ютерів то був би сором. отож 20 років тому такий собі джон віґлі запропонував простий формат для ведення бухгалтерських записів і написав програму ledger для автоматизованих підрахунків та аналізу даних з файлів у цьому форматі. ось як виглядатиме типовий запис про сплату, скажімо, за електроенергію в форматі ledger:

2022-11-17 Київенерго
  ; Оплата комунальних послуг (готівкою в касі)
  Готівка
  Електрика             256,37 грн

отже, формат найпростішого запису ledger містить:

  • перший рядок: дата, назва контрагента;
  • кожен наступний рядок з відступом: рахунок, сума списання/зарахування, валюта;
  • (опційно) рахунок без суми (для списання/зарахування різниці по транзакції).

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

2022-11-18 Сільпо
  ; Закупи в супермаркеті
  Кредитка
  Продукти              123,45 грн
  Інше                  234,56 грн

стривайте, де ж тут сума, що її списують з рахунку Кредитка? а це діє «автомагія» ledger: нема потреби вказувати, яку суму списано: програма сама її полічить, достатньо вказати рахунок, на який відносяться витрати. це не єдина зручність ledger; ось так можна занотувати обмін валют:

2022-11-19 Приватбак
  ; Купівля валюти
  Готівка               100 USD @ 40,25 грн
  Готівка       

тут на готівковий рахунок внесено 100 доларів сша за курсом 40,25 грн/долар, — ledger сам порахує, скільки витрачено гривень на цю операцію, і віднесе відповідне списання на той самий рахунок Готівка. стоп, як? тобто на одному рахунку можуть бути «одночасно» гривні й долари? — так, легко! а чому ні? але якщо хочеться мати окремий рахунок на кожну валюту, ніхто не обмежує.

а де програма зберігає стан рахунків, і де зберігається довідник рахунків?

ніде! в цім краса ledger: він нічого ніде не зберігає; за назви рахунків правлять довільні текстові мітки, з яких починаються відбитті (ті, що з відступом) рядки; кількість та назви валют довільні: можна грн та долари, можна UAH та USD, а можна вести облік у кришечках.

але яка тоді роль ledger? це програма для аналізу записів у текстовому файлі, і обчислення звітів «на льоту»! наприклад, якщо треба порахувати поточний баланс по всіх згаданих у файлі рахунках:

> ledger --file ledger_test.txt balance 
          234,56 грн  Інше
             100 USD
        -4281,37 грн  Готівка
          256,37 грн  Електрика
         -358,01 грн  Кредитка
          123,45 грн  Продукти
--------------------
             100 USD
        -4025,00 грн

або якщо треба переглянути журнал всіх операцій:

> ledger --file ledger_test.txt register
22-Nov-17 Київенерго    Готівка       -256,37 грн    -256,37 грн
                        Електрика      256,37 грн              0
22-Nov-18 Сільпо        Кредитка      -358,01 грн    -358,01 грн
                        Продукти       123,45 грн    -234,56 грн
                        Інше           234,56 грн              0
22-Nov-19 Приватбак     Готівка           100 USD        100 USD
                        Готівка      -4025,00 грн        100 USD

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

ledger: найпростіші звіти

встановлення й налаштування

отже, для експериментів знадобиться сам ledger — консольний додаток для linux. можна завантажити, але правильніше встановити з репозиторіїв, — для прикладу, в arch-базованих дистрибутивах якось так:

[sudo] pacman -S ledger
ledger --version

для debian так само все просто, ledger є в репозиторії:

[sudo] apt-get update
[sudo] apt-get install ledger
ledger --version

є версії для windows, macos, *bsd, але розбирайтеся з ними самі, якщо вони вам треба.

ledger не потребує налаштувань; єдине, що я зазвичай роблю — зберігаю розташування файлу до змінної для знучности (приміром, до ~/.bashrc):

LEDGER=~/ledger_test.txt

тепер можна братися до експериментів (сподіваюся, редактор за замовчуванням налаштовано?):

$EDITOR $LEDGER

планування облікової книги

(далі буде)

нотація транзакцій

(далі буде)

основні звіти

(далі буде)

графіки!

(далі буде)

документація

детальніше про leger-cli можна почитати: