При разработке интерфейсов на управляемых формах часто возникает задача отобразить данные регистра или таблицы в виде иерархического списка (дерева) с группировкой по измерению и выводом суммовых итогов в заголовках этих групп. Однако при использовании стандартного динамического списка разработчики сталкиваются с тем, что строки группировок остаются без числовых показателей.
Проанализируем причины такого поведения платформы 1С:Предприятие и рассмотрим практические способы решения этой задачи.
Для понимания проблемы разберем механизм работы объекта ДинамическийСписок:
ИТОГИ ... ПО .... Запрос списка всегда должен возвращать плоскую выборку строк.Если необходимо остаться в рамках динамического списка, мы можем рассчитать сумму по каждому значению группировочного измерения заранее с помощью вложенного запроса и левого соединения.
Рассмотрим пример произвольного запроса для динамического списка:
ВЫБРАТЬ
Т.Измерение1 КАК Измерение1,
Т.Измерение2 КАК Измерение2,
Т.Ресурс КАК Ресурс,
Итоги.СуммаРесурса КАК СуммаПоГруппе
ИЗ
РегистрСведений.ТестовыйРегистр КАК Т
ЛЕВОЕ СОЕДИНЕНИЕ (
ВЫБРАТЬ
Измерение1 КАК Измерение1,
СУММА(Ресурс) КАК СуммаРесурса
ИЗ
РегистрСведений.ТестовыйРегистр
СГРУППИРОВАТЬ ПО
Измерение1
) КАК Итоги
ПО Т.Измерение1 = Итоги.Измерение1
Разберем особенности данного подхода:
СуммаПоГруппе будет содержать итоговую сумму группы в каждой детальной строке. При настройке группировки по Измерение1 значение также отобразится в соответствующей колонке строки-группировки.Если объем выводимых данных ограничен (до нескольких тысяч записей) и требуется полноценная работа с итогами в узлах дерева, наиболее правильным решением является использование реквизита формы с типом ДеревоЗначений.
Разберем реализацию по шагам:
ДеревоЗначений и выведем его в элементы формы как таблицу.ИТОГИ:
&НаСервере
Процедура ЗаполнитьДеревоНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТестовыйРегистр.Измерение1 КАК Измерение1,
| ТестовыйРегистр.Измерение2 КАК Измерение2,
| ТестовыйРегистр.Ресурс КАК Ресурс
|ИЗ
| РегистрСведений.ТестовыйРегистр КАК ТестовыйРегистр
|ИТОГИ
| СУММА(Ресурс)
|ПО
| Измерение1";
РезультатЗапроса = Запрос.Выполнить();
// Выгружаем результат запроса в дерево с сохранением иерархии и итогов
Дерево = РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
ЗначениеВРеквизитФормы(Дерево, "ДеревоДанных");
КонецПроцедуры
При таком подходе итоговые суммы будут автоматически и корректно рассчитаны на всех уровнях группировки без дублирования значений в детальных записях.
Когда основная цель вывода данных — аналитический просмотр, подведение промежуточных и общих итогов, расшифровка и гибкая фильтрация, целесообразно использовать механизм отчетов на базе Системы компоновки данных (СКД).
СКД изначально спроектирована для построения многоуровневых иерархических структур с автоматическим расчетом агрегатов (сумм, средних, минимальных и максимальных значений) на каждом уровне группировки.
В случаях, когда требуется динамический список без тяжелых соединений в запросе, можно задействовать обработчик события ПриПолученииДанныхНаСервере у динамического списка.
В этом событии для порции строк, переданных клиенту, формируется пакетный запрос по ключам группировок видимых записей, после чего рассчитанные значения подставляются в оформление или отображаемый текст соответствующих строк.