Каждый отчет о движении денежных средств опирается на тихое решение, принимаемое один раз для каждого счета: является ли этот счет частью денежных средств, которые вы объясняете, или это операционная, инвестиционная или финансовая деятельность? Примите это решение правильно — и отчет покажет, куда на самом деле ушли ваши деньги. Ошибетесь — и отчет будет уверенно вводить в заблуждение.
До сих пор отчет о движении денежных средств на Beancount.io принимал это решение за вас с помощью эвристик — корневого типа счета, а также предположения на основе имени о том, какие активы считаются денежными средствами. Для большинства книг предположение было верным большую часть времени, а в остальное время — молча ошибочным. Брокерский счет, названный неправильно, попадал в неправильный раздел. Денежный рыночный фонд, который является денежными средствами в любом практическом смысле, оказывался в разделе Инвестиционной деятельности, потому что его имя об этом не говорило.
Начиная с сегодняшнего дня, вы можете сделать классификацию явной. Одна строка стандартных метаданных beancount в директиве open счета:
2000-01-01 open Assets:US:Brokerage
cash-flow-role: "investing"
2000-01-01 open Assets:US:Marcus:Savings
cash-flow-role: "cash"Один ключ, четыре значения — cash, operating, investing, financing — и это вся конфигурация. Нет страницы настроек, нет JSON-файла, нет диалога параметров для каждого отчета. При следующей загрузке отчета о движении денежных средств потоки брокерского счета появятся в разделе Инвестиционной деятельности, сберегательный счет присоединится к денежной массе, изменение которой объясняет отчет, а все остальные счета продолжат работать ровно как раньше.

Что означает каждая роль
Отчет о движении денежных средств распределяет каждый счет по одной из двух задач, и cash-flow-role отвечает на обе одним словом:
"cash"— счет принадлежит к денежной массе и эквивалентам. Денежные счета никогда не появляются как отдельные статьи; отчет объясняет изменение их совокупного остатка, а переводы между двумя денежными счетами взаимно компенсируются, как и должно быть при перемещении денег с расчетного на сберегательный счет."operating"/"investing"/"financing"— счет не является денежными средствами, и его изменение за период появляется как статья в соответствующем разделе деятельности.
По умолчанию отчет считает денежными эквивалентами счета активов, в названиях которых есть Cash, Checking, Savings или Bank. Объявление роли переопределяет это в обоих направлениях. cash-flow-role: "cash" включает счет, который правило по имени пропускает — денежный рыночный фонд, кошелек со стейблкоинами. А cash-flow-role: "investing" на Assets:US:Bank:CD делает две вещи одной строкой: исключает депозитный сертификат из денежных средств и относит его к инвестициям, даже несмотря на то, что его имя соответствовало бы правилу для денежных средств.
Мы намеренно использовали один ключ вместо двух. «Является ли этот счет денежными средствами?» и «К какому разделу деятельности он относится?» никогда не были независимыми вопросами — счет либо является частью денежной массы, либо относится ровно к одному разделу деятельности. Два ключа допускали бы бессмысленные состояния, например денежный счет с ролью деятельности. Один ключ делает невозможные состояния непредставимыми, а вся спецификация умещается в твит.

Объявленная вами классификация — это классификация, которую использует каждое представление. Диаграмма By Activity складывает операционные, инвестиционные и финансовые потоки каждого месяца; измените роль счета — и его потоки переместятся на нужный слой диаграммы, в нужный раздел отчета и в нужную строку экспорта — все сразу.
Объявленное побеждает выведенное — и отчет показывает свою работу
Классификация теперь разрешается в строгом порядке: сначала ваши метаданные, затем встроенная эвристика. И отчет честно рассказывает о том, что он сделал. Отчет завершается панелью «Денежные средства и их эквиваленты в этом отчете», перечисляющей ровно те счета, которые были обработаны как денежные средства при построении чисел, а затем выполняет сверку: денежные средства на начало периода, денежные средства на конец периода и чистое изменение, которое объясняют разделы деятельности.

Отчет также различает классификации, которые вы объявили, и классификации, которые он вывел, и это различие переносится в экспорт CSV и Markdown: отчет, полностью построенный из объявленных ролей, больше не содержит строки раскрытия «классификация является выведенной», потому что в этом случае классификация — не вывод, а часть ваших книг.
Опечатки обрабатываются так, как и должен обрабатывать их инструмент для работы с обычным текстом. cash-flow-role: "invsting" не принимается молча и не игнорируется молча: счет возвращается к эвристике по умолчанию, а панель статуса помечает это — «неизвестное значение cash-flow-role, используется значение по умолчанию» — так что ошибка видна там, где вы смотрите, а не погребена в журнале.
Если вы ничего не меняете, ничего не меняется
Счета без аннотаций используют те же опубликованные значения по умолчанию, что и раньше: Income и Expenses сопоставляются с операционной деятельностью, неденежные Assets — с инвестиционной, Liabilities и Equity — с финансовой, а денежные эквиваленты, подобранные по имени, образуют денежную массу. Существующая книга отображается идентично до и после этого релиза. Большинству пользователей достаточно аннотировать несколько счетов — те, где значение по умолчанию неверно, — и не думать об остальных.
Переносимость тоже не пострадала. Метаданные в директивах open — это базовый синтаксис beancount, который разбирают все инструменты v2/v3 и игнорируют те, кто не ищет этот конкретный ключ. bean-check проходит, Fava пожимает плечами, а ваша книга остается полностью пригодной для использования вне Beancount.io.
Все представления ваших денежных средств согласованы между собой
Один общий резолвер определяет итоговую роль для каждого счета, и все потребители читают из него:
- Отчет о движении денежных средств строит свои разделы деятельности и итоговую строку — чистое изменение денежных средств и эквивалентов — на основе разрешенных ролей.
- Экспорт в CSV, Markdown и печать содержит те же числа, с раскрытием выведенной классификации только там, где действительно использовалась эвристика.
- Санкей-диаграмма обзора читает те же объявления, поэтому счет, помеченный вами как денежный, перестает появляться как узел потока, а объявленные роли деятельности учитываются для счетов, не относящихся к Income.
- Панель статуса счета перестает указывать объявленный счет как «неклассифицированный актив».

Отчет и диаграмма не могут разойтись во мнениях о том, что является вашими денежными средствами, потому что существует только один ответ, о котором можно спорить.
Почему книга, а не страница настроек
Это та часть релиза, которой мы гордимся больше всего. Мы рассматривали UI настроек и отвергли его по трем причинам:
- Книга — это источник истины. Классификация, живущая где-либо еще, может разойтись с книгами, которые она описывает. Классификация, живущая в директиве
open, путешествует вместе со счетом — через переименования, через переносы репозитория, через каждого клиента, читающего файл. - Обычный текст можно сравнивать, искать и рецензировать. Если вы храните книгу в git — а если вы используете Beancount.io, вы так и делаете — правило классификации теперь можно
grep,diffиblame, и рецензент может увидеть его в pull request. Страница настроек не дает ничего из этого. - Это работает офлайн и везде. Любой редактор может объявить роль. Любой будущий клиент, читающий книгу, получает классификацию бесплатно, без необходимости синхронизировать настройки для каждого клиента.
По той же причине классификации намеренно не являются датированными. Метаданные описывают природу счета, которая редко меняется; когда она меняется, вы редактируете директиву open, и ваша история git фиксирует, что изменилось и когда. Эта история и есть аудиторский след.
Попробуйте на своей книге
Функция разворачивается на всех книгах прямо сейчас. Для объявления роли нужен только текстовый редактор:
- Откройте файл, где находится директива
openсчета. - Добавьте
cash-flow-role: "cash"(или"operating","investing","financing") как строку метаданных с отступом под ней. - Перезагрузите отчет о движении денежных средств. Ваше объявление немедленно побеждает эвристику.
Начните со счетов, где предположение по умолчанию неверно — депозитный сертификат, который на самом деле не денежные средства, денежный рыночный фонд, который действительно является денежными средствами, брокерский счет, который вы хотите аккуратно отнести к Инвестиционной деятельности. Остальное не трогайте. Полная спецификация — допустимые значения, приоритет, классификации по умолчанию и обработка недопустимых значений — находится в справочнике по ролям денежных потоков.
Отчет о движении денежных средств является частью каждой книги Beancount.io, наряду с отчетом о прибылях и убытках и балансовым отчетом. Если вы догоняете остальные новости этого лета — более умные импорты, AI-ассистент с возможностями действий и перестроенное мобильное приложение — заметки о выпуске 3.6 охватывают остальное.
Ваши книги уже знали, какие счета являются инвестициями, а какие — повседневными расходами. Теперь это знает и отчет о движении денежных средств.
