При разработке отчетов в системе компоновки данных (СКД) часто возникает задача вывести движения по регистрам с нарастающим итогом на уровне детальных записей, а в строке вышестоящей группировки (например, Контрагент) отобразить не сумму всех промежуточных итогов, а итоговый остаток на момент последней операции. По умолчанию агрегатные функции СКД суммируют значения подчиненных строк, либо поле группировки остается пустым, если расчет ресурса отключен для верхнего уровня.
Разберем основные практические способы решения этой задачи: настройку встроенных ролей полей СКД, использование функции ВычислитьВыражение и связывание наборов данных.
Проанализируем стандартный и самый надежный механизм платформы 1С. Если данные формируются на основе виртуальной таблицы регистра накопления ОстаткиИОбороты, платформа умеет автоматически рассчитывать остатки на любом уровне группировки без сложных формул.
Для правильной работы механизма выполним следующие шаги:
ПериодСекунда, Регистратор).Для поля начального остатка установим тип роли НачальныйОстаток, для поля конечного остатка — КонечныйОстаток. Обязательно свяжем их одним именем группы остатков.
Для полей периодов укажем роль Период с порядковыми номерами (например, Период — номер 1, Регистратор — номер 2).
Сумма(КонечныйОстаток).При такой настройке СКД не будет складывать остатки разных строк между собой: для детальных записей будет показан остаток после конкретной операции, а в строке группировки Контрагент будет автоматически вычислен срез на конец периода отчета или на дату последней операции.
Рассмотрим ситуацию, когда колонка итога формируется вычисляемым выражением или нарастающим итогом. Чтобы в строке группировки Контрагент получить значение ресурса Итог из последней подчиненной строки, настроим вкладку Ресурсы.
Выясним причину частой ошибки: если вызвать функцию ВычислитьВыражение без явного указания сортировки, СКД может обойти подчиненные записи в произвольном порядке или взять первую попавшуюся запись. Чтобы жестко спозиционироваться на последнем документе, необходимо передать строку сортировки.
Разберем правильный синтаксис формулы ресурса для поля Итог:
ВычислитьВыражение("Сумма(Приход)", , , "Первая", "Текущая")
Итог, в колонке Рассчитывать по выбираем группировку Контрагент и указываем выражение:
ВычислитьВыражение("Итог", "", "", "Последняя", "Последняя", "Период Возр, Регистратор Возр")
Важный нюанс: если в один и тот же момент времени по контрагенту проведено несколько документов, сортировки только по полю Период может быть недостаточно. Рекомендуется включать в сортировку поля ПериодСекунда, МоментВремени или НомерСтроки для однозначного определения финальной записи.
Посмотрим на альтернативный вариант, когда детальные движения и итоговые остатки получаются из разных источников. Этот способ удобен, если детальная таблица содержит сложную логику движений, а в группировке требуется показать актуальный срез на дату отчета.
Разберем по шагам создание схемы с двумя наборами данных:
Ведущий набор — НаборДанных1, ведомый — НаборДанных2.
Поле связи: Контрагент = Контрагент.
В колонке Параметры передаем дату отчета или максимальную дату выборки в параметр виртуальной таблицы второго набора данных.
Сумма(Остаток) и ограничиваем его расчет только группировкой Контрагент.Таким образом, в детальных строках выводятся операции с нарастающим итогом, а на уровне заголовка контрагента выводится точный срез остатка из второго набора данных.