При разработке отчетов на базе Системы Компоновки Данных (СКД) часто возникает задача вывода динамики остатков. Если вы используете данные виртуальных таблиц регистров накопления, СКД автоматически справляется с расчетом остатков. Однако, когда источником данных являются табличные части документов или произвольные выборки, механизм автоматического расчета перестает работать. Давайте разберем, какими способами можно реализовать вывод начального и конечного сальдо в такой ситуации.
Самым надежным и предсказуемым способом является расчет остатков «на лету» в модуле объекта до момента передачи данных в СКД. Этот метод позволяет полностью контролировать логику перетекания остатков, особенно если данные не упорядочены или требуют сложной предобработки.
НачальныйОстаток + Приход - Расход.СКД как внешний набор данных.Рассмотрим пример логики заполнения данных:
// Предположим, у нас есть ТЗ с колонками Период, Контрагент, Приход, Расход
// Сортируем данные
ТЗ.Сортировать("Контрагент, Период");
ТекущийОстаток = 0;
Для Каждого Строка Из ТЗ Цикл
Строка.НачальныйОстаток = ТекущийОстаток;
ТекущийОстаток = ТекущийОстаток + Строка.Приход - Строка.Расход;
Строка.КонечныйОстаток = ТекущийОстаток;
КонецЦикла;
Такой подход гарантирует 100% точность, так как вы сами управляете алгоритмом накопления и не зависите от ограничений СКД.
Если вы хотите оставить логику расчетов внутри схемы компоновки данных, вы можете добавить в структуру набора данных еще один запрос, который будет отвечать исключительно за получение начальных сальдо.
Разберем процесс по шагам:
СКД новый набор данных — запрос.НачалоПериода отчета).Связи наборов данных), связав основной запрос и запрос с остатками по полю Контрагент.Этот метод предпочтителен, если структура ваших данных позволяет легко выделить остаток одним SQL-запросом.
Если в отчете используется группировка по периодам, можно воспользоваться встроенными функциями языка выражений СКД. Это «декларативный» метод, который не требует изменения структуры наборов данных, но накладывает требования к настройке группировок.
Вы можете добавить Вычисляемое поле с выражением:
Для расчета остатка используйте функцию:
ВычислитьВыражение("Сумма(Приход) - Сумма(Расход)", , "Группировка", "Первая", "Предыдущая")
Важные замечания по этому методу:
СКД приходят в неверном порядке, остатки будут рассчитаны ошибочно.Выбирая метод реализации, ориентируйтесь на объем данных и сложность логики:
СКД — попробуйте Способ 2 (Связь наборов данных).ВычислитьВыражение используйте с осторожностью, только в простых отчетах, где вы полностью уверены в последовательности группировок.Помните, что ключевым моментом в СКД при работе с такими задачами является корректное использование ресурсов и правильная настройка связей, если вы идете по пути многонаборных запросов.