Финансовый учёт с ledger


Несколько лет назад передо мной встала задача вести учёт денежных расходов, чтобы в конце месяца понимать сколько и куда денег тратится. Перебрав самые известные приложения (GnuCash, kmymoney, aqbanking, grisbi, cbb, ledger) мне по тем или иным причинами ни одно не понравилось. Кроме последнего - ledger.

Ledger - это консольная утилита, которая поможет контролировать ваши личные финансы. Моё знакомство с ней началось со статьи в блоге «Ledger — бухучёт в командной строке». И, на сколько я знаю, больше статей на русском о ней нет. Попробуем исправить это недоразумение.

Перед тем как начать читать об использовании программ для персональных финансов я бы посоветовал получить первоначальные знания о бухучете (в том минимуме, в котором они нужны для домашней бухгалтерии), которые можно почерпнуть в блоге city-rat.livejournal.com, а расширить знания о личных финансах, кредитах и кредитных картах например в статьях Макса Крайнова.

Если коротко описать возможности этой утилиты, то я бы выделил среди них такие:

  • поддержка двойной записи. Это позволяет одновременно отследить источники получения и направления расходования средств.
  • открытый формат хранения данных: проводки хранятся в обычных текстовых файлах (как я люблю).
  • гибкое создание отчётов: по счетам, проводкам и т.д.
  • поддержки нескольких счетов: банковские, долговые, инвестиционные, кредитные, наличные
  • поддержки нескольких валют (да, даже Bitcoin)
  • простой и достаточно удобный консольный интерфейс
  • импорт из формата CSV, экспорт в формат OFX
  • нет никакой автоматики: ledger никак не меняет ваши данные. И это на мой взгляд правильно. Там где начинаются автоматические операции с финансами, заканчивается контроль над этими финансами.
  • открытый исходный код (распространяется под BSD лицензией).

Принцип работы такой: вы вносите проводки в файл, потом на основе собранных данных делаете отчёты о потраченных средствах и т.д.

Организация файлов

Можно вносить все проводки в единственный текстовый файл, но для меня это было неудобно и я сделал так: сделал общий файл и включил в него файлы с проводками за каждый год. Выглядит это так:

~$ cat .ledger/sergeyb-finance.dat
;; N RUR
N ⃋

!account sergeyb
!include sergeyb-finance-2012.dat
!include sergeyb-finance-2013.dat
!include sergeyb-finance-2014.dat
!apply end
~$

В начале файла указана валюта, которую ledger будет использовать по умолчанию для всех проводок, где она не указана. Файл sergeyb-finance.dat экспортируется в переменной окружения LEDGER_FILE, чтобы не приходилось его каждый раз указывать в опциях утилиты.

Каждый файл начинается с указания года:

~$ head -1 .ledger/sergeyb-finance-2014.dat
Y2007

Если вы будете использовать несколько валют в проводках, то имеет смысл поддерживать файл с курсами валют. Его можно задать в переменной окружения LEDGER_PRICE_DB или конфигурационном файле:

~$ cat .ledgerrc
--wide
--pager /usr/bin/less
--file /Users/sergeyb/.ledger/sergeyb-finance.dat
--price-db /Users/sergeyb/.ledger/sergeyb-finance-currency.dat
--sort date
~$

Файл с курсами валют у меня заполняется автоматически с помощью скрипта загружая данные с сайта Центрального банка Российской Федерации. Он запускается один раз в день по расписанию в crontab(5) и добавляет курсы нужных мне валют в этот файл.

~$ ccc 10 USD RUR
370.86609471
~$

Для цифровых валют (Bitcoin, Litecoin) есть такие скрипты.

В итоге получается такой файл:

~$ head -10 .ledger/sergeyb-finance-currency.dat
; -*- ledger -*-

N $
N USD
N EUR
P 2011/05/29 EUR 40.08020851 RUR
P 2011/06/10 $ 27.79070045 RUR
P 2011/07/13 $ 28.25570737 RUR
~$

Внесение проводок

Принцип двойной записи можно кратко cформулировать так: когда в одном месте средства убывают, в другом они прибывают. Например, если после посещения магазина в кошельке убавились деньги, значит сумма в одном из активов уменьшилась, а сумма на счете «расходы» увеличилась. Принцип двойной записи - это основополагающий принцип в бухгалтерии.

Согласно этому принципу в каждой записи обычно не менее двух счетов, но указывать сумму для одного из них необязательно, понятно, что изменение будет равно сумме всех других, но с противоположенным знаком:

2014-09-21 Проезд на метро во время Московского марафона
    актив:наличные	; понятно, что здесь должно быть -35
    расходы:проезд		35
  • активы (assets) - это то, чем вы реально располагаете. Точнее ваша собственность. Это могут ваши деньги на карманные расходы, депозит в банке, счёт в Яндекс.Деньги и т.д.;
  • пассивы (liabilities) - это то, что вы кому-то должны. То есть, например, у вас может быть квартира, но вы за не должны банку;
  • капитал (equity) - ваши чистые деньги. Другими словами это то, что останется, если из ваших активов вычесть ваши долги;
  • прибыль (income) - вы же как-то зарабатываете? Например ваша зарплата или благодарность соседа за ремонт компьютера являются хорошим примером прибыли;
  • расходы (expenses) - сходили с подругой в кино? Вот вам и расходы;

Если вы пользуетесь Vim или Sublime Text, то для внесения записей удобно использовать плагины для подсветки синтаксиса для формата ledger. Для Vim плагин есть в репозитории ledger, для Sublime Text на вики.

Как я уже писал, ledger никак не модифицирует ваши данные и исходит только из того, что в внесли вручную в файл. Но если всё-таки хочется вносить одни и те же проводки регулярно (например ежемесячные платежи за телефон), то можно использовать скрипт и запускать его с помощью cron(8).

Счета можно называть как угодно и на любом языке (ledger отлично поддерживает UTF-8). Можно делать подсчета, используя двоеточие в названии счёта, например, «расходы:связь:интернет». Главное не запутаться потом в них :) Советую сделать базовые счета и потом их расширять по мере необходимости. Всё зависит от того, насколько детальный отчет вы хотите потом видеть. Для начала можно завести счета для, как минимум, пяти категорий: актив, долги, доходы, расходы и какой-нибудь счёт для уравнивания балансов. Я назвал его «собственные», в англоязычных примерах его обычно называют «equity».

Сумму в проводке можно писать так, как удобно: «$ 15», «28 EUR», «21 €», «66 ⃋». Ledger понимает, что разные единицы измерения нужно считать отдельно. Единицы измерения можно указывать любые, те, которые нужно учитывать. В том числе и неденежные (и программа умеет их правильно пересчитывать, если ей дать файл с историей цен).

Интеграция с банковскими счетами

Благодаря импорту и экспорту данных в форматах CSV и OFX есть возможность интеграции с отчётами из банков. Это вас освободит от рутинного внесения каждой операции по банковским картам в файл данных ledger.

Из популярных в России банков:

  • Raiffeisen CONNECT поддерживает экспорт выписок в форматах QIF, OFX, CSV
  • АльфаКлик (АльфаБанк) поддерживает экспорт только в CSV
  • Для СберБанка есть скрипт для конвертации CSV в OFX.

Для конвертации CSV в нужный формат есть утилита csv2ledger. На вики Ledger упоминаются другие и утилиты для конвертации из CSV и OFX.

Лирическое отступление: несмотря на то, что в некоторых интернет-банках есть возможность экспорта в разные форматы, выписки нужно выгружать регулярно и вручную, что не добавляет удобства в использование средств учёта финансов. В 2006 рабочая группа OFX (Open Financial Exchange) под руководством компании Intuit выпустила версию 2.1 протокола для обмена данными о банковских транзакциях. Потенциально это позволяет подключаться к интернет-банку и получать все данные о своих транзакциях, но, к сожалению, банки, представленные в России, не поддерживают такой возможности. В отличие от США, где эта возможность есть у около 6 000 (!) банков, включая самых крупных игроков. Вот некоторые их них.

В следующий раз я расскажу как пользоваться отчётами и планировать расходы.

Дополнительные источники

Метки: opensource openbsd productivity