Перейти к основному содержимому

Ссылки боковой панели и сохранённые запросы в Fava

Добавьте ярлыки fava-sidebar-link для фильтров времени в один клик, затем сохраните запрос BQL, который находит отрицательные конечные остатки. Проверено на Fava 1.30.16.

Добавьте датированные директивы ссылок на боковую панель в стандартный 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 USD

bea --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:NegativeUSD-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:NegativeUSD-50.00
Assets:BCM:PositiveUSD-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 и руководство по интерфейсу.

Источник: https://beancount.io/ru/docs/Tips/side-bar-link