Бухгалтерия для гика
Принцип двойной записи можно кратко cформулировать так: когда в одном месте средства убывают, в другом они прибывают. Например, если после посещения магазина в кошельке убавились деньги, значит сумма в одном из активов уменьшилась, а сумма на счете «расходы» увеличилась. Принцип двойной записи — это основополагающий принцип в бухгалтерии.
Согласно этому принципу в каждой записи обычно не менее двух счетов, но указывать сумму для одного из них необязательно, понятно, что изменение будет равно сумме всех других, но с противоположенным знаком:
2014-09-21 Проезд на метро во время Московского марафона
актив:наличные ; понятно, что здесь должно быть -35
расходы:проезд 35
- активы (assets) — это то, чем вы реально располагаете. Точнее ваша собственность. Это могут ваши деньги на карманные расходы, депозит в банке, счёт в Яндекс.Деньги и т.д.;
- пассивы (liabilities) — это то, что вы кому-то должны. То есть, например, у вас может быть квартира, но вы за не должны банку;
- капитал (equity) — ваши чистые деньги. Другими словами это то, что останется, если из ваших активов вычесть ваши долги;
- прибыль (income) — вы же как-то зарабатываете? Например ваша зарплата или благодарность соседа за ремонт компьютера являются хорошим примером прибыли;
- расходы (expenses) — сходили с подругой в кино? Вот вам и расходы; (источник)
…на текстовых файлах
В 2003 году John Wiegley представил Ledger: текстовый формат данных и утилиту командной строки для эффективного бухучета в системе двойной записи. Эта идея прижилась среди разработчиков и технарей, поэтому сейчас существует более 5 активных проектов, таких как hledger и Beancount, с более чем 40 расширений и утилит и активное сообщество. На этом сайте вы найдете описание утилит, документацию и лучшие практики этой системы учета.
основные принципы
Финансовые данные очень важны для нас и мы хотим всегда иметь полный доступ к ним — даже без программного обеспечения. Мы хотим отслеживать все изменения и хранить их в системе контроля версий. Мы хотим искать в них, манипулировать ими эффективно. Поэтому мы храним их в человеко-читаемом виде в простом тексте.
Вместо дебета-кредита мы используем знак числа — "плюс" для поступлений на счет, "минус" для списаний со счета.
Мы задаем произвольную иерархию счетов, которая полностью отвечает нашим потребностям и с легкостью работает как в простых, так и в сложных вариантах учета.
частые вопросы
Кто этим пользуется ?
Пока, в основном, технари и опытные пользователи, хотя авторы и делают всё возможное для снижения порога вхождения.
Почитайте Кто использует Ledger (на англ.), там много интересных историй пользователей системы.
Мне придется писать всякие непонятные команды ?
Нет, конечно!
"Бухучет на текстовых файлах" это просто название, относящееся, в основном, к формату хранения данных.
Мы не имеем ничего против дополнительных средств с GUI, и их немало.
Какие еще есть программы для учета ?
Свободные утилиты типа GNUCash, Grisbi, KMyMoney.
Проприетарные типа Quicken/Quickbooks, You Need A Budget.
Онлайновые: Xero, FreeAgent.
Вообще есть хорошее сравнение.
Кто-то ведет учет в таблицах.
Также можно вести учет денег на бумаге. Или нанять бухгалтера.
Почему это лучше чем, к примеру, QuickBooks ?
Ваши данные всегда доступны (даже когда нет интернета).
Никаких ежегодных платежей, все абсолютно бесплатно.
Вы можете доработать ПО при желании.
Кроссплатформенно.
Расширяемо.
Эффективно.
А как с бюджетированием ?
Смотрите раздел бюджетирование ниже. Можно эмулировать бюджетирование в стиле YNAB (третья ссылка).
Но учет денег отнимает столько времени…
Прочитайте книгу "Миллионер по соседству", она откроет глаза на важность вопросов финансового контроля и планирования. “Планирование и контроль потребления – ключевые факторы в вопросе накопления богатства… Отсутствие четкого бюджета в вашей семье сравнимо с отсутствием бизнес-плана на предприятии или каких-либо производственных целей”.
Вы правда вводите каждую мельчайшую транзакцию ?
Да! И многие из нас так делают. Кто-то начал детальный учет давно и все еще продолжает, потому что это не напряжно и весело. Но это не обязательно. Вы можете выработать свой подход к внесению транзакций. Но учтите, что этот способ позволяет легко найти ошибки в учете и с легкостью исправить их.
Как это возможно ?
Практика и процесс/инструмент, которые подходят вам. Некоторые просто импортируют большинство данных из банка (в формате CSV), поэтому им требуется лишь небольшая работа руками. Кто-то предпочитает вручную вводить каждую операцию, чтобы не упустить мелочей. "Ручной" ввод данных обычно не нужен благодаря интерактивным консольным утилитам (hledger add и подобные), web-утилитам (hledger-web и подобные), утилитам с GUI (ledgerhelpers), умным редакторам (типа emacs & ledger-mode, vim, sublime-text с плагином), сценариям повторяющихся транзакций. Если использовать импорт банковских CSV и ввод небольшого количества операций в вашем любимом редакторе, это в среднем будет занимать минут 15 в день, и это не плохая инвестиция.
Как я могу использовать данные из моего банка или мобильного приложения ?
Если вы можете выгрузить их в формат CSV, то вы без проблем загрузите их в формат Ledger. Также ниже перечислено несколько утилит для конвертации из форматов OFX, QIF и т.п.
Где можно увидеть сравнение hledger, Ledger, beancount и остальных ?
Здесь в таблице, а также в разделе сравнение. У hledger в разделе частых вопросов также расписаны отличия от других систем.
Как я могу организовать файлы журнала ? Мне нужно их делить на периоды ?
Все в одном файле (или один файл на каждый год), отсортированном по дате — проще всего.
Вот здесь описан один из способов организации:
How do you manage multiple accounts in ledger/hledger?
byu/floriplum inplaintextaccounting
Насколько большой файл журнала у вас ?
Для личной бухгалтерии что-то около 500-1500 транзакций и 100-400 Kb за один год.
How big is your ledger/journal file
byu/threesevenths inplaintextaccounting
Приложения для ведения бухгалтерии на текстовых файлах:
утилиты
- hledger-diff поможет найти разницу в двух разных файлах формата Ledger
- hledger-interest рассчитывает транзакции с учетом сложного процента
- hledger-irr рассчитывает эффективную ставку по журналу Ledger
- ledger-get-prices скачивает цены с рынков ценных бумаг
- ledger-tutorials конвертирует самоучитель от Pete Keen в формат ebook
импорт/конвертация данных
- Ledger и hledger имеют встроенные средства конвертации в CSV. А также:
- banks2ledger — конвертер из CSV в ledger
- bean-identify, bean-extract, bean-file — встроенные в Beancount утилиты
- beancount-import конвертер из CSV в формат beancount (на curses)
- gnucash2ledger.py конвертация из GNUCash в ledger
- icsvledger конвертер из CSV в ledger
- into-ledger CSV to *ledger converter
- ledger-autosync загрузка OFX, конвертер из OFX в ledger, дедупликация
- ledger2beancount.py конвертер из ledger в beancount
- plaid2text Plaid API для конвертации в ledger/beancount
- qb2ledger конвертер из главного журнала QuickBooks в CSV и в ledger
- QIFtoLedger конвертер из QIF (от Bank of America) в ledger
- reckon умный интерактивный конвертер из CSV в ledger
- total_recall конвертер из CSV в ledger
поддержка редакторов
- beancount-mode для Emacs
- hledger-mode для Emacs
- ledger-mode для Emacs (также для hledger, beancount и т.д.)
- vim-beancount для VIM
- vim-ledger для VIM
- language-ledger для Atom
- ledger для Atom
- sublime-ledger-syntax для Sublime Text/TextMate
- Ledger.tmbundle для TextMate
- sublime-beancount подсветка формата Beancount для Sublime Text
учет времени
- org2tc конвертер из org в timeclock
- on-modify.timetrack.py taskwarrior хук для вывода времени
- t ledger timeclock скрипт
- tim учет времени и построение очтетов с помощью hledger
ui, консольные
- bean-add интерактивный ввод транзакций
- hledger add интерактивный ввод транзакций (встроенный)
- ledger-add интерактивный ввод транзакций
- ledger-plot интерактивный помощник для создания диаграмм с GNUplot
- ledger xact встроенный генератор транзакций с учетом истории транзакций
ui, curses
- hledger-iadd интерактивный ввод транзакций в консоли
- hledger-ui консольный просмотр транзакций (демо)
- regdel консольный просмотр транзакций (Ledger)
ui, GUI
- ledgerhelpers утилита на GTK с GUI и библиотека (на Python)
ui, web
- fava web UI для просмотра/поиска транзакций с помощью браузера (на Python, beancount, демо)
- hledger-web web UI для просмотра/поиска транзакций + ввод данных (на Haskell, демо)
- hledger-web on Sandstorm бесплатный финансовый веб-журнал всего за пару кликов
- Ledger Web система отчетов на основе web + postgres
- ledger-dashboard web UI для просмотра/поиска транзакций + ввод данных (на Python)
- ledger-web web UI для просмотра/поиска транзакций (на JavaScript)
- ledgible web UI для просмотра/поиска транзакций + ввод данных (на Python, демо)
- WealthPulse web UI для просмотра/поиска транзакций, поиска цен и т.п. для инвесторов (на F#, Ledger)
api
- hledger-api JSON API + статический файл-сервер (на Haskell)
- ledgerhelpers расширение библиотека Ledger на python
- node-hledger Node.js API (на JavaScript)
- sassetti командная оболочка (на Common Lisp)
editor support
Плагины для популярных редакторов.
Atom language-ledger, ledger
Emacs beancount-mode, hledger-mode, ledger-mode (с поддержкой hledger, beancount и т.д.)
VIM vim-ledger (ledger & hledger), vim-beancount, hledger-vim
Sublime sublime-ledger-syntax
TextMate Ledger.tmbundle
VS Code hledger-vscode, ledger, vscode-beancount
Jetbrains (IntelliJ) Ledger Plugin
stack exchange (англ.)
hacker news (англ.)
2009, 2013, 2014, 2014, 2015, 2016, 2016, 2016
reddit (англ.)
@LedgerTips, #plaintextaccounting, #ledgercli, #hledger, #beancount
документация
на русском:
на англ.:
- документация Ledger
- Ledger вики
- большая шпаргалка для ledger-cli
- документация hledger
- документация Beancount (или версия на sphinx с документацией к API)
- шпаргалка по синтаксису Beancount
сравнения
на англ.:
- Краткий обзор Ledger-подобных утилит
- Matthias Kauer: Command Line Accounting – A look at the various ledger ports 2015
- Another Ledger user’s perspective on Beancount 2015
- Martin Blais: A Comparison of Beancount and Ledger 2014
- ledger vs hledger vs beancount or how to choose the right cli client 2014
- Simon Michael: hledger & Ledger 2014, 2019
- Omari Norman: Why Penny 2013
- Fabrice Niessen: Why Ledger? 2010
книги
на англ.:
презентации
- Бухучет для гиков с Ledger CLI (англ.) 2014
- Hacking Your Finances for Fun and Profit 2013
- Ledger и бухучет на текстовых файлах (англ.) 2009
видео
на англ.:
- Simon Michael: Inside hledger: an architectural tour and how-to 2021
- hledger fan youtube channel (short lessons) 2019
- Quiliro Ordóñez: ledger-mode lightning talk 2019
- Colin Dean: Plaintext Accounting with the ledger ecosystem 2017
- Colin Dean: Plain Text Accounting 2017
- Simon Michael: Hands-on with hledger 2016
- Покорите финансы с Emacs и Ledger 2016
- FLOSS Weekly 375: hledger (youtube, 3m обзор) 2016
- Эволюция ledger 2015
- Эволюция hledger 2015
- FLOSS Weekly 150: Ledger (youtube) 2011
- Курс бухучета от проф. Krug 2011
- Khan Academy: бухучет и основы финансов
статьи и блоги
на русском:
- Планирование финансов через командную стоку в ledger 2015
- Финансовый учёт с ledger 2014
- Финансовый учёт в текстовой консоли 2016
- Ledger — бухучёт в командной строке 2009
- Учёт финансов с Ledger CLI 2013
на англ.:
2021
- Arsen Arsenović: Keeping track of finances from many places
- Zoran Zaric: Budgeting for annual expenses with Hledger
- Samuel Walladge: Tracking capital gains with hledger
- Duarte O.Carmo: Hacking on my finances (Part 2: Beancount on Beanstalk)
2020
- Duarte O.Carmo: Hacking on my finances
- Conversations in Code: Episode 3 / Introduction to Plain Text Accounting [podcast]
- Peter Hogg: Reconciling Ledger
- Peter Hogg: Receipts and Ledger
- Peter Hogg: Tracking Cash with Ledger
- Peter Hogg: Organizing Ledger
- Mari Donkers: KMyMoney to HLedger conversion
- Charles Hoffman: Plain Text Accounting
- Charles Hoffman: Fat Free Accounting: Ledger
- Lee Yingtong Li: Using selenium to scrape/import bank transactions for ledger-cli
- Lee Yingtong Li: ledger-pyreport: Formal accounting reports for ledger-cli
- Lee Yingtong Li: Incorrect accounting of unrealised gains in ledger-cli
- Christian Egli: Quick and dirty PDF reports for Plain Text Accounting
2019
- Lee Yingtong Li: FIFO inventory with ledger-cli
- Justin Kaipada: Managing Ledger for Humans
- Amitai Burstein: Why We Chose Plain Text Accounting with Hledger
- Budgeting with ledger-cli while tracking used points
- Pete Keen: Automatic Insurance
- Pete Keen: Automatic Investing
- Pete Keen: Automatic Cash Management
- Pete Keen: Automatic Finances
- John Sullivan: Answering questions with accounting: Reimbursements
Более старые:
- Управление личными финансами с beancount 2016
- Поиск дублей в журналах Hledger 2015
- Matthew Turland: основы и привычки Ledger 2014
- Simon Michael: Что такое hledger ? 2013
- Simon Michael: Больше про ledger 2013
- Simon Michael: Представляем hledger! 2013
- Joey Hess: hledger 2012
- Sascha Welter: Создаю свой бухучет 2011
- Clint Adams: Бухучет в SFLC 2011
- Christine Spang: [h]ledger завоевал мой мир 2010
- Command Line Accounting With Ledger and Reckon, an Update 2013
общие задачи
выбор счетов
на англ.:
- Дерево счетов для фрилансера (пример)
- Поваренная книга Beancount: Правила именования счетов
- Mint: Категоризация расходов
ввод данных
на англ.:
- hledger шаг за шагом: основы ввода данных
- ledger-mode:
C-c C-a
добавить транзакцию,C-c C-b
калькулятор,C-c C-c
/C-c C-e
toggle cleared - Beancount: поваренная книга консольного бухучета
- hledger: использование других разделителей счетов
- Больше по бухучету
- ledger-envelope-generator.rb
импорт
- Ledger: команда конвертации
- hledger: файлы CSV
- hledger: как читать файлы CSV
- Импорт внешних данных Beancount
- Загрузка цен в Beancount
- Payment matching done right
отчеты
бюджетирование
Отчет с командой ledger —budget:
Автоматические транзакции:
- Pete Keen: Program Your Finances: Envelope Budgeting
- Marcin Borkowski: Ledger – virtual postings aka envelopes
С org-mode:
- Org tutorials: Weaving a budget with Org & ledger
- Alan Schmitt: Using Org for Ledger Reports and Budget
С обычными субсчетами:
прогнозирование
счета
мультивалютный учет
- Peter Selinger: учебник по мультивалютному учету
- учебник ledger-currencies
- обсуждение про значение валюты как товара
общие расходы
- Общие расходы в Beancount
- Keeping (financial) score with Ledger
- Program Your Finances: Automated Transactions для отслеживания возмещаемых расходов
- Как сохранить контроль за общими расходами с супругом?
налоги
- С точки зрения одного пользователя про налоги
- hledger: как использовать псевдонимы для счетов налоговые отчеты
учет времени
- Ledger: Бережем время
- hledger: файлы Timeclock
- hledger: файлы Timedot
- Учет времени и оплат с (h)ledger
учет имущества
некоммерческий бухучет
экспорт
доступ к API
-
Поддержка Python 3 в Ledger Python
-
ledgerhelpers Python
-
hledger-lib, hledger, пример Haskell
-
hledger-api, примеры JSON
-
node-hledger JavaScript
This list powered by: Plain Tex Accounting
Учебник Hledger
Ранее учет с ledger (на русском) был описан в статьях Планирование финансов через командную стоку в ledger, Финансовый учёт с ledger и Ledger — бухучёт в командной строке. Для общего развития рекомендую ознакомиться с ними.
Немного теории
Счетом мы называем любой вид Дохода/Расхода, а также любое “место”, откуда/куда приходят деньги. Кто-то называет их категориями, но суть от этого не меняется.
Обычно заводят такие счета как “Продукты”, “Авто”, “Подарки”, “Зарплата”, “Наличные”, “Ипотека” и т.п.
В системе двойной записи деньги переходят с одного счета на другой. И при этом отображаются в обоих строках транзакции с разными знаками. К примеру, покупка книги за 500 рублей переводит деньги со счета “Наличные” на счет “Книги”. Получение зарплаты отражается как перевод денег со счета “Зарплата” на счет “Наличные” (ну или “Банковская карта”). Главное — помнить, что при перемещении денег в итоге должен быть обязательно ноль, иначе ничего не получится.
Итак, мы выяснили, что счета могут быть самые разные, но многие пользователи добавляют такие счета верхнего уровня:
• Расходы (Expenses)
• Доходы (Income)
• Активы (Assets)
• Обязательства (Liabilities)
для того, чтобы в дальнейшем построить удобную структуру доходов/расходов. Иерархия счета таким образом может выглядеть так: “Расходы” -> “Авто” -> “Бензин”. И записываются такие счета в транзакциях через двоеточие: “Расходы:Авто:Бензин” (хотя вы можете использовать другой разделитель, об этом будет написано ниже).
Предупреждение
Я опишу здесь свой опыт реального использования утилиты hledger. Если у вас появятся вопросы, с радостью отвечу на них в комментариях или чате 🙂
Прежде всего, почему hledger, а не ledger-cli? На самом деле между ними нет большой разницы, используйте любую утилиту, благо формат журнала у них очень похожий. Мне нравятся функциональные языки программирования, а hledger написан на Haskell. При этом я пользуюсь MS Windows, а ledger-cli в этой ОС работает не очень хорошо. У hledger есть hledger-api для написания своих программ поверх hledger и я планирую заняться этим в ближайшее время, но и у ledger есть python api, который тоже очень удобен. В общем, решать вам, что использовать, я для себя пока выбрал hledger и он мне нравится 🙂
В этом учебнике мы создадим удобное дерево счетов, настроим программу на работу с несколькими валютами, покажем типовые сценарии использования различных финансовых инструментов и настроим удобный ввод транзакций.
Также построим надежную и гибкую структуру файлов журнала с выгрузкой изменений в систему хранения версий BitBucket (в приватном бесплатном репозитории).
Создадим файл журнала
Создайте пустой файл в блокноте и сохраните файл под любым именем, например “ledger.txt”.
В дальнейшем нужно будет запускать hledger так:
hledger -f ledger.txt <команда>
Но для hledger можно назвать файл “.hledger.journal” и поместить его в директорию пользователя ( /home для *nix систем или “C:\Users\<Имя пользователя>\” в Windows ) и тогда при вызове hledger вам не нужно будет каждый раз указывать имя файла. Например, так:
hledger <команда>
Предположим, вы так и сделали и у вас теперь есть файл журнала в домашней директории.
Ввод транзакций
У hledger есть удобная команда интерактивного ввода add, здесь вы можете ее увидеть в действии. Вы можете попробовать ввести с ее помощью транзакцию и затем посмотреть что записалось в файл журнала.
Откройте журнал любимым редактором ( я рекомендую SublimeText3 с плагином подсветки/дополнения или Vim/Emacs ) и добавьте следующую операцию (или замените транзакцию, созданную при помощи команды add):
2016/09/01 * Зарплата
Кошелек:Наличные 10000 руб
Доходы:Зарплата
Вкратце поясню что мы написали, но рекомендую все же ознакомиться с форматом записи ledger. У нас описана операция получения зарплаты в размере 10000 руб от 1 сентября 2016 г. В ней мы зачисляем 10000 руб на счет “Кошелек:Наличные” со счета “Доходы:Зарплата”.
Вы можете указать сумму с минусом в строке “Доходы:Зарплата”, но это не обязательно и важно только в транзакциях с тремя и более строками. Hledger автоматически понимает, что с другой стороны проводки нужная нам сумма.
При этом, в нашей транзакции указан флаг *, который говорит нам о том, что транзакция выверенная (флаг может быть ! и *, а можно его вообще не указывать). К примеру, вы вводите транзакции, а в конце недели сверяете с банковской выпиской, отмечая при этом сверенные транзакции флажком *. Знаком ! отмечают незаконченные транзакции (в статусе ожидания), но вам это, возможно, пригодится позже.
Свой разделитель счетов. Если вам не нравится знак двоеточие между счетами, вы можете указать свой разделитель. Для этого в начале журнала добавьте псевдоним для двоеточия и программа его обработает как разделитель, к примеру, укажем точку:
# alias /РЕГУЛЯРНОЕ ВЫРАЖЕНИЕ/=ЗАМЕНА
alias /\./=:
2016/10/01 зарплата
Кошелек.Расчетный счет 1000 руб
Доход.Зарплата
Еще момент — необходимо указать минимум два пробела между счетом и суммой, иначе программа будет считать сумму частью названия счета и выдаст ошибку!
Теперь запустим отчет Баланс (команда balance или bal):
hledger balance
-10000 руб Доходы:Зарплата
10000 руб Кошелек:Наличные
--------------------
0
Ноль под чертой очень важен и показывает, что у нас все транзакции записаны правильно с точки зрения двойной записи. А остаток в кошельке у нас 10 000 руб.
Теперь вы видите насколько просто вести учет денег с ledger?
Вы спросите, почему Доходы показаны с минусом? Если кратко, то в двойной записи деньги (как и любая другая ценность) должны откуда-то переместиться куда-то. В нашем примере они пришли со статьи дохода на статью расхода. Поэтому на счете поступления показан плюсовой остаток, а на другом счете — отрицательный. Иными словами, на счете дохода их стало меньше, чем в нашем кошельке 🙂
Введем еще одну операцию:
2016/09/05 * Бензин
Кошелек:Наличные
Расходы:Авто 1000 руб
Вы можете вводить транзакции с помощью команды add, тогда вам не нужно запоминать форматирование, флаги и т.п. Однако, сам формат журнала ledger очень простой и вводить транзакции руками не сложно. Я чаще всего использую копирование предыдущих записей с правкой даты и суммы — для каждодневных трат это удобно.
Для редких записей несложно либо найти их ранее в журнале, либо ввести “с нуля”, для этого и важно понимать формат.
Отчеты
Чаще всего нужен ответ на вопрос “Сколько я трачу в месяц на …?” Увидеть это можно так:
hledger -M register Расходы:Авто
2016/09 Расходы:Авто 1000 руб 1000 руб
Теперь купим немного продуктов:
2016/09/21 * продукты
Кошелек:Наличные
Расходы:Продукты 700 руб
Запускаем баланс:
hledger balance
-10000 руб Доходы:Зарплата
8300 руб Кошелек:Наличные
1700 руб Расходы
1000 руб Авто
700 руб Продукты
--------------------
0
Выводим список наших транзакций:
hledger reg
2016/09/01 Зарплата Кошелек:Наличные 10000 руб 10000 руб
Доходы:Зарплата -10000 руб 0
2016/09/05 Бензин Кошелек:Наличные -1000 руб -1000 руб
Расходы:Авто 1000 руб 0
2016/09/21 продукты Кошелек:Наличные -700 руб -700 руб
Расходы:Продукты 700 руб 0
Ну и баланс еще раз:
# Сколько потратил на авто:
hledger bal Расходы:Авто
1000 руб Расходы:Авто
--------------------
1000 руб
# Сколько у меня денег:
hledger bal ^Расходы ^Доходы
-10000 руб Доходы:Зарплата
1700 руб Расходы
1000 руб Авто
700 руб Продукты
--------------------
-8300 руб
Дерево статей
Один из самых важных вопросов в ведении личных доходов — удобное дерево статей (счетов).
Кто-то пытается максимально подробно вести учет, вплоть до того, что делают статьи чрезмерно большой вложенности: “Расходы — Продукты — Крупы — Гречка”. Если вы ведете учет финансов больше года, то это может быть оправдано, но если вы только начали, то ведение настолько подробного учета прогонит все желание продолжать.
Я предлагаю начать с малого и увеличивать количество статей в процессе. Итак, мы с вами уже описали счета “Кошелек:Наличные”, “Доходы:Зарплата”, “Расходы:Авто” и “Расходы:Продукты”. Отличное начало.
Теперь представим основные кошельки / доходы / расходы / долги и на основе этого (пока мысленно) составим наше дерево статей. К слову, у меня примерно такое (это не файл примера):
λ hledger accounts --tree
Кошелек
Кредитка
Наличные
Расходы
Авто
Бензин
Налоги
Ремонт
Здоровье
Коммунальные
Налоги
Одежда
Продукты
Прочие
Связь
Кредиты
Банк1
Банк2
Доход
Зарплата
Прочий
Еще момент про дерево статей: когда мне нужно увидеть какой-то расход более подробно, я создаю для него отдельный счет. К примеру, все продукты я учитываю на счете “Расходы:Продукты”, но, к примеру, мне стало интересно, сколько я трачу на кофе ( и это не праздный интерес, кофе действительно стало уменьшаться очень быстро 🙂 ). Для этого я создаю транзакции по покупке кофе так:
2016/10/01 * кофе
Кошелек:Наличные
Расходы:Продукты:Кофе 200 руб
Так в вашем балансе будет видно расходы в целом на продукты, а также отдельной строкой затраты на кофе. Очень удобно!
Вы теперь умеете вводить транзакции (через команду add или вручную в текстовом редакторе) и пользуетесь при этом вашим деревом статей. Замечательно. Теперь давайте сделаем наш журнал более удобным.
Файл журнала
Откроем снова наш файл .hledger.journal:
; Это главный файл журнала hledger.
; Реальные данные содержатся в файлах в папке myledger
; Вложим актуальный журнал
include myledger/main.journal
Таким образом можно разбивать файлы транзакций по валютам, счетам, а также по годам для удобства. Что мы и сделаем:
Создайте папку myledger в домашней директории пользователя. Откройте ее.
Предупреждение: Вы можете пропустить этот абзац, если не планируте хранить ваш журнал в системе версий.
Зарегистрируйтесь на BitBucket и создайте новый приватный репозиторий. Нозовите его, к примеру, “myledger”. Откройте терминал и перейдите в эту папку:
cd myledger
git init
git remote add origin https://fokusov@bitbucket.org/fokusov/myledger.git
примечание: название репозитория и имя пользователя замените на свое.
Создадим файл main.journal в этой папке и откроем его:
alias Кредиты = Liabilities
alias Кошелек = Assets
alias Расходы = Expenses
alias Доходы = Income
D 1000.00 руб
include 2015.journal
include 2016.journal
end aliases
include prices.dat
Итак, в этом файле также нет транзакций, но указана метаинформация, очень важная для hledger.
Первые строки, начинающиеся с alias — это наши псевдонимы для счетов, чтобы программа могла составлять правильно отчетные формы, а мы могли писать название корневых счетов по-русски.
Далее идет строка D 1000.00 руб
, описывающая валюту по-умолчанию и ее формат. Таким образом, не указывая явно валюту в каждой транзакции, мы будем знать, что она рублевая и пересчет между валютами будет корректен.
Далее мы вкладываем журналы транзакций, разбитые по годам. Я веду учет три года и у меня вложены файлы журнала за последние три года.
Сортировать по годам необязательно, но очень удобно, что записи разных лет хранятся в разных файлах, а не в одном большом. Фразой end aliases
мы завершаем применение псевдонимов к нашим файлам и ниже вкладываем файл с ценами prices.dat.
Создайте указанные файлы (2015.journal, 2016.journal, prices.dat) или закомментируйте строку с ненужным файлом. Комментарии начинаются со знака ;
Сохраним наши файлы в репозитории:
git add *
git commit -m "Initial commit"
git push -u origin master
Теперь открываем файл нужного года (к примеру, 2016.journal) и вводим в него транзакции с помощью текстового редактора. Либо с помощью команды add, но с обязательным указание файла журнала, иначе она добавит наши транзакции в главный журнал:
hledger add -f myledger\2016.journal
Сделаем командный файл, который будет выгружать наши изменения в удаленный репозиторий:
myledger\upd.cmd:
git add -A
git commit -m "upd"
git push origin master
Добавим еще один служебный тег в текущий файл журнала (2016.journal):
Добавьте в начало файла указание на год:
Y2016
Теперь мы можем вводить транзакции немного быстрее:
10/01
Кошелек:Наличные
Расходы:Продукты 500
не указывая год и валюту (но если укажете год в транзакции, ничего страшного не произойдет). При этом программа знает, что это рублевая транзакция, совершенная в 2016 году.
Мультивалютность
В ledger очень легко вести учет в разных валютах и пересчитывать их из одной в другую автоматически.
Для этого необходимо вести файл с ценами/курсами (этот файл также нужен для автоматического расчета стоимости ценных бумаг), который можно сделать для автоматической загрузки из сети. У нас он уже есть, это файл prices.dat. Откроем его:
P 2016/10/28 10:00:00 USD 62.96 руб
P 2016/10/28 10:00:00 EUR 68.77 руб
Как мы видим, это официальные курсы валют центробанка на указанную дату, структурированные в формате ledger.
Если вы ведете транзакции в разной валюте, к примеру так:
2016/09/01 Зарплата
Кошелек:Наличные 10000 руб
Доходы:Зарплата
2016/09/05 * Бензин
Кошелек:Наличные
Расходы:Авто 1000 руб
2016/09/21 * продукты
Кошелек:Наличные
Расходы:Продукты 700 руб
2016/09/10 Шабашка
Кошелек:Наличные 500 USD
Доходы:Прочие
то баланс будет не очень красивый:
λ hledger bal
-500 USD
-10000 руб Доходы
-10000 руб Зарплата
-500 USD Прочие
500 USD
8300 руб Кошелек:Наличные
1700 руб Расходы
1000 руб Авто
700 руб Продукты
--------------------
0
# Попросим сконвертировать все данные в базовую валюту:
λ hledger bal -V
-41480.00 руб Доходы
-10000.00 руб Зарплата
-31480.00 руб Прочие
39780.00 руб Кошелек:Наличные
1700.00 руб Расходы
1000.00 руб Авто
700.00 руб Продукты
--------------------
0
Так лучше 🙂
Теперь введем валютную транзакцию, но чтобы она посчиталась корректно. Для этого есть три способа:
; 1. указываем уже рассчитанную стоимость в рублях - к примеру, когда наш банк уже пересчитал ее по своему курсу и снял с карты
2016/10/28 покупка домена
Кошелек:Карта
Расходы:Прочие 8.17 USD @@ 514.38 руб
; 2. указываем курс валюты / цену товара за единицу
2016/10/28 покупка домена
Кошелек:Карта
Расходы:Прочие 8.17 USD @ 62.96 руб
; 3. позволим hledger рассчитать курс / цену
2016/10/28 покупка домена
Кошелек:Карта -514.38 руб
Расходы:Прочие 8.17 USD
Выведите баланс в консоли и потом баланс с ключом -V.
Полезные команды
У hledger есть немало команд, не говоря о плагинах. Но я рассмотрю те, которыми пользуюсь сам.
Команды:
print выводит список транзакций на экран
accounts выводит названия счетов
balance выводит счета и баланс (bal)
register транзакции и сальдо каждой (reg)
incomestatement отчет о доходах и расходах (is)
balancesheet выводит баланс - активы/пассивы (bs)
cashflow выводит денежный поток (cf)
activity выводит диаграмму в ascii о движении денег за период
(по умолчанию: за день)
stats выводит статистику журнала
Выведем статистику моего журнала:
λ hledger stats
Main file : C:\Users\fokusov\.hledger.journal
Included files : C:\Users\fokusov\myledger/main.journal
C:\Users\fokusov\myledger\2014.journal
C:\Users\fokusov\myledger\2015.journal
C:\Users\fokusov\myledger\2016.journal
C:\Users\fokusov\myledger\prices.dat
Transactions span : 2014-04-01 to 2016-11-03 (947 days)
Last transaction : 2016-11-02 (1 days ago)
Transactions : 431 (0.5 per day)
Transactions last 30 days: 76 (2.5 per day)
Transactions last 7 days : 12 (1.7 per day)
Payees/descriptions : 89
Accounts : 39 (depth 3)
Commodities : 3 (EUR, USD, руб)
Интересное применение команды print:
# заархивируем 2015 год в отдельном файле
hledger print -b 2015 -e 2016 > 2015.journal
Команда balancesheet
$ hledger balancesheet
Balance Sheet
Assets:
$-1 assets
$1 Банк:Вклад
$-2 Наличные
--------------------
$-1
Liabilities:
$1 liabilities:Долги
--------------------
$1
Total:
--------------------
0
Команда cashflow
$ hledger cashflow
Cashflow Statement
Cash flows:
$-1 assets
$1 Банк:Вклад
$-2 Наличные
--------------------
$-1
Total:
--------------------
$-1
Команда incomestatement
$ hledger incomestatement
Income Statement
Revenues:
$-2 income
$-1 Подарки
$-1 Зарплата
--------------------
$-2
Expenses:
$2 expenses
$1 Продукты
$1 Прочее
--------------------
$2
Total:
--------------------
0
Еще транзакции
Я опишу для примера несколько видов транзакций, которыми пользуюсь сам — это учет долгов, ввод начальных остатков, ввод большого чека. Это справочная информация, возможно, она вам не пригодится. Однако, для общего развития очень полезна:
- Ввод начального остатка. К примеру, вы начали ведение журнала не с нуля, а имея начальные остатки. Здесь есть немало вариантов как это сделать, я покажу свой:
2016/09/01 начальный остаток
Кошелек:Наличные 10000 руб
Старт
где “Старт” можно заменить на “Капитал:Открытие счета” или что-то подобное. Важно что на нужном счете появится нужная сумма, при этом взятая из другого источника (т.е. нам он не важен).
- Учет долгов. Здесь все просто — долг это такой же счет, но многие поначалу путаются, как правильно внести долги.
2016/09/01 Взял в долг у Ивана
Кошелек:Наличные 10000 руб
Долги:Иван
2016/09/11 Отдал долг Ивану
Кошелек:Наличные
Долги:Иван 10000 руб
- Большой чек. Вы купили много товаров, при этом хотите все внести одной транзакцией:
2016/10/01 * Леруа
Кошелек:Наличные -47850 руб ; цифра введена для контроля, если ее не вводить, то она рассчитается автоматом
Расходы:Ремонт квартиры:Обои 8250 руб
Расходы:Ремонт квартиры:Краска 6300 руб
Расходы:Ремонт квартиры:Ламинат 23000 руб
Расходы:Ремонт квартиры:Светильник 10300 руб
Дальнейшая работа
Я продолжаю изучать возможности ledger и многое еще предстоит открыть.
В ближайших планах:
— настроить синхронизацию с мобильным приложением Monefy (или аналогом);
— найти хороший веб-интерфейс для просмотра отчетов ledger;
— настроить обмен данными с банками (выгрузка в csv);
— настроить автоматический расчет налогов с дохода (6% для фрилансера на УСН) при вводе транзакций.
Возможно, вы тоже нашли интересные штуки при работе с ledger, поделитесь ими в комментариях 🙂