Добавьте датированные директивы ссылок на боковую панель в стандартный Fava, затем сохраните запрос, который находит отрицательные конечные остатки после суммирования всех проводок. Примеры были выполнены с Beancount 3.2.3, beanquery 0.2.0 и Fava 1.30.16. Используйте локальную настройку.
Эти URL-адреса предназначены для локального сервера стандартного Fava. Панель управления Beancount.io имеет другие пути к отчетам и описана отдельно ниже.
Зачем настраивать Fava?
Ярлыки на боковой панели сохраняют полезное отфильтрованное представление. Сохраненный запрос затем может ответить на конкретный бухгалтерский вопрос без повторного ввода BQL.
Проблемы, которые это решает:
- Повторный выбор текущего или предыдущего месяца.
- Повторное открытие сохраненного отчета.
- Различие между оттоком и счетом, который фактически заканчивается ниже нуля.
✨ Пользовательские ссылки на боковой панели
Добавьте эти директивы в полную книгу sidebar-demo.beancount из следующего раздела. Запустите ее с помощью fava sidebar-demo.beancount и откройте отчет Journal, прежде чем нажимать на ярлык.
2021-01-01 custom "fava-sidebar-link" "Current Month" "/jump?time=month"
2021-01-01 custom "fava-sidebar-link" "Last Month" "/jump?time=month-1"
2021-01-01 custom "fava-sidebar-link" "Clear All" "/jump?account=&time=&filter="Что они делают:
/jump возвращает на страницу, указанную в заголовке Referer браузера, и заменяет предоставленные параметры запроса. Он не всегда открывает отчет Journal. На балансовом отчете он остается на балансовом отчете. Это поведение реализовано обработчиком перенаправления стандартного Fava.
- Текущий месяц: Устанавливает
time=monthна текущем отчете. - Прошлый месяц: Устанавливает
time=month-1на текущем отчете. - Очистить все: Удаляет
account,timeиfilter. Другие параметры, такие как конвертация и интервал, остаются.
В тестовом наборе 2021 года не будет транзакций в текущем месяце; используйте Очистить все перед воспроизведением результатов запроса. URL-адрес /jump требует реферера. Для закладки, открытой напрямую, скопируйте полный рабочий URL-адрес отчета.
В корне хоста /jump?time=month был протестирован с /sidebar-demo/journal/?time=2021&account=Assets: он вернул HTTP 302 на тот же журнал с account=Assets&time=month. Целевой отчет вернул 200.
Если администратор монтирует все приложение Fava по адресу /books, каждый ярлык, относящийся к корню, должен включать этот префикс. Это альтернативная конфигурация, а не другая директива, которую нужно добавить вместе с «Текущим месяцем» выше:
2021-01-01 custom "fava-sidebar-link" "Current Month" "/books/jump?time=month"Локальный тест WSGI-монтирования подтвердил, что /books/jump перенаправляет обратно на /books/sidebar-demo/journal/ с новым фильтром. Обычный /jump находится вне этого монтирования и вернул 404. Пользовательские ссылки Fava сохраняют предоставленный URL; ведущий / означает корень хоста, а не корень книги.
Область хостинга, проверено 2026-09-07: исходный код панели управления Beancount.io использует такие пути, как /ledger/OWNER/LEDGER/income-statement и /ledger/OWNER/LEDGER/query. Его боковая панель создает собственное меню отчетов. В просмотренном исходном коде нет маршрута /jump или потребителя fava-sidebar-link. Поэтому этот стандартный рецепт не установлен для этой панели управления. На хостинговом продукте откройте нужный отчет и добавьте в закладки его рабочий адрес. Снимок исходного кода не доказывает, какую редакцию запускает живое развертывание.
🔍 Пользовательские SQL-запросы
Сохраните этот полный тестовый набор как sidebar-demo.beancount. Он намеренно включает как положительные, так и отрицательные проводки в каждом счете активов:
option "title" "Sidebar Demo"
option "operating_currency" "USD"
2021-01-01 open Assets:BCM:Positive USD
2021-01-01 open Assets:BCM:Negative USD
2021-01-01 open Equity:Opening-Balances USD
2021-12-01 * "Opening balances"
Assets:BCM:Positive 100.00 USD
Assets:BCM:Negative 20.00 USD
Equity:Opening-Balances -120.00 USD
2021-12-10 * "Outflows"
Assets:BCM:Positive -30.00 USD
Assets:BCM:Negative -50.00 USD
Equity:Opening-Balances 80.00 USD
2022-01-05 * "Refund"
Assets:BCM:Negative 10.00 USD
Equity:Opening-Balances -10.00 USD
2022-01-09 balance Assets:BCM:Positive 70.00 USD
2022-01-09 balance Assets:BCM:Negative -20.00 USDbea --file sidebar-demo.beancount check проходит. На начало 9 января Positive содержит 100 - 30 = 70 USD; Negative содержит 20 - 50 + 10 = -20 USD.
Выполните этот запрос на странице Query в стандартном Fava с очищенными глобальными фильтрами:
SELECT account, currency, SUM(number) AS ending_balance
FROM postings
WHERE account ~ ':BCM:'
AND date < 2022-01-09
GROUP BY account, currency
HAVING SUM(number) < 0
ORDER BY account, currency;| Счет | Валюта | Конечный остаток |
|---|---|---|
| Assets:BCM:Negative | USD | -20.00 |
Разбор:
WHERE выбирает проводки для агрегации. Нижней границы даты нет: для конечного остатка нужна вся предыдущая история, включая начальные остатки на 1 декабря. Верхняя граница с исключением включает 8 января и исключает транзакции 9 января.
GROUP BY account, currency разделяет разные валюты. HAVING SUM(number) < 0 фильтрует после суммирования положительных и отрицательных количеств каждой группы. Это конечный остаток в единицах по каждой валюте, а не рыночная стоимость, конвертированная в одну валюту. Он показывает каждый точный счет, а не сводные родительские счета.
Для сравнения, этот исполняемый запрос отвечает на другой вопрос: сколько было списано отрицательно в течение рассматриваемого периода?
SELECT account, currency, SUM(number) AS negative_postings
FROM postings
WHERE account ~ ':BCM:'
AND number < 0
AND date >= 2021-12-09 AND date < 2022-01-09
GROUP BY account, currency
ORDER BY account, currency;| Счет | Валюта | Отрицательные проводки |
|---|---|---|
| Assets:BCM:Negative | USD | -50.00 |
| Assets:BCM:Positive | USD | -30.00 |
Второй запрос опускает возвраты и начальные остатки. Строка -30.00 USD не означает, что Positive перерасходован. Добавление нижней границы даты к первому запросу вместо этого дало бы чистый поток за период, а не конечный остаток. См. справочник по BQL для получения дополнительной информации о синтаксисе запросов.
Варианты использования:
- Проверка счетов активов на неожиданные отрицательные количества.
- Отдельный просмотр отрицательных проводок при исследовании оттоков или возвратов.
- Сверка отображаемого остатка с начальной историей и последующей активностью, прежде чем считать его аномалией. Отрицательный остаток по обязательствам или доходам может быть нормой.
🛠 Профессиональный совет: Комбинируйте ссылки и запросы
Fava поддерживает ссылки на запросы. Добавьте этот сохраненный запрос и ярлык в sidebar-demo.beancount:
2021-01-01 query "negative-balances" "SELECT account, currency, SUM(number) AS ending_balance FROM postings WHERE account ~ ':BCM:' AND date < 2022-01-09 GROUP BY account, currency HAVING SUM(number) < 0 ORDER BY account, currency"
2021-01-01 custom "fava-sidebar-link" "Negative Balances" "/sidebar-demo/query/?query_string=.run+%22negative-balances%22"Директива запроса также появляется на боковой панели сохраненных запросов Fava, с учетом sidebar-show-queries (по умолчанию 5). Явный ярлык ссылается на слаг sidebar-demo тестового набора и выполняет именованный запрос. Стандартная страница запросов читает query_string из URL; ее API запросов вернул ту же единственную строку -20.00 USD в локальном тесте. См. версионированный компонент Query.
Используйте фактический слаг вашей книги в другой книге. При монтировании /books ярлык становится /books/sidebar-demo/query/?query_string=.run+%22negative-balances%22. Держите глобальные фильтры очищенными для конечного остатка за полную историю; фильтр по дате может удалить начальную историю до выполнения сохраненного запроса.
Заключительные мысли
Используйте ярлыки месяцев для навигации по отчетам и сохраненный запрос для проверки воспроизводимого конечного остатка. При просмотре вашего бюджета различайте оттоки, движение за период и закрывающие остатки перед интерпретацией отрицательного числа. Для дополнительных отчетов см. документацию расширений Fava и руководство по интерфейсу.