При работе с Системой компоновки данных (СКД) разработчики часто сталкиваются со стандартным поведением системы: иерархическим представлением данных. По умолчанию, если мы задаем группировку по полю Здание, а внутри нее — список полей Услуга, СКД выведет заголовок здания один раз, а под ним — список всех относящихся к нему услуг. Однако в ряде задач, например, для формирования специфических реестров или актов, требуется иной формат: Здание - Услуга 1, Здание - Услуга 2 и так далее. В этой статье мы разберем, как «разгруппировать» данные и добиться повторения родительских полей для каждой дочерней записи.
Часто программисты пытаются решить задачу на уровне запроса, убирая секцию СГРУППИРОВАТЬ ПО или пытаясь изменить структуру выборки. Рассмотрим типичную ситуацию: в наборе данных запрос возвращает плоскую таблицу, где в каждой строке есть и здание, и услуга. Однако, как только этот набор данных попадает в настройки СКД на вкладку «Настройки», компоновщик по умолчанию пытается визуально объединить дублирующиеся значения в иерархию, если заданы соответствующие группировки.
Важно понимать, что настройки визуализации в СКД имеют приоритет над структурой выборки в запросе. Даже если запрос возвращает «развернутые» данные, настройки компоновщика (группировки в структуре отчета) заново их «схлопывают» для удобства чтения. Чтобы изменить это поведение, необходимо работать именно с настройками компоновки, а не с текстом запроса.
Это наиболее гибкий и рекомендуемый метод, который упоминался в обсуждении. Мы проанализируем, как настроить состав полей так, чтобы они выводились друг под другом в рамках одной логической итерации. Разберем по шагам:
Детальные записи).Здание и Услуга.В результате такого подхода система для каждой строки данных будет отрисовывать сначала ячейку (или строку) со зданием, а сразу под ней — ячейку с услугой. Это создаст визуальный эффект «разгруппировки», при котором информация о здании будет дублироваться для каждой услуги, но выводиться они будут последовательно по вертикали.
Если нам нужно сохранить классическую структуру группировок (когда Здание является родителем для Услуги), но при этом заставить систему выводить здание перед каждой услугой, мы можем воспользоваться системными параметрами вывода.
Проанализируем работу параметра «Расположение группировок»:
Расположение группировок.При такой настройке СКД перестанет выводить общую «шапку» для всей группы и начнет повторять заголовок группировки для каждого элемента. Это особенно полезно, когда здание содержит много вложенных данных, и нам нужно четко разделять их визуально, повторяя контекст.
Рассмотрим ситуацию, когда нам вообще не нужны иерархические уровни в структуре отчета. Мы хотим получить просто список строк. Для этого выполним следующие действия:
Здание).Здание, и Услуга.Теперь система выведет все данные в одну таблицу. Чтобы данные не превратились в «кашу», можно настроить Условное оформление. Например, можно задать выделение цветом или шрифтом для поля Здание, чтобы оно визуально отделяло одну услугу от другой. Для этого используем системное поле Уровень или просто проверку на заполненность.
Если стандартные настройки не позволяют добиться нужного визуального идеала, мы можем создать собственный макет оформления. Как выяснилось в ходе обсуждения, попытки создать макет часто заканчиваются «пустым отчетом», если не соблюдены технические нюансы.
Разберем, как правильно создать макет для разгруппированных данных:
[Здание]), СКД не поймет, куда подставлять данные.Использование макетов — это трудоемкий процесс, но он дает 100% контроль над тем, как будет выглядеть каждая строка отчета. Однако в большинстве случаев достаточно Способа №1 с вертикальной группой полей.
При разгруппировке данных важно следить за тем, как рассчитываются итоги. Если мы выводим здание для каждой услуги, то простые ресурсы (например, Сумма) могут задваиваться, если они привязаны к зданию, а не к услуге. Выясним, как этого избежать:
На вкладке «Роли» в наборе данных для поля Здание можно указать, что оно является обязательным, а для числовых показателей правильно настроить выражения ресурсов. Например, использовать Максимум() или Среднее(), если сумма должна относиться к зданию в целом, а не суммироваться по каждой строке услуги при выводе в итогах.
Также полезно использовать функцию СоединитьСтроки() на вкладке ресурсов, если ваша задача стоит в обратном: не разгруппировать, а наоборот, собрать все услуги в одну ячейку через запятую. Пример выражения:
СоединитьСтроки(Услуга, ", ")
Это альтернативный взгляд на проблему, когда «разгруппировка» заменяется компактным перечислением внутри одной строки родителя.
Подводя итог, можно сказать, что наиболее эффективным решением для автора темы стала настройка вертикального расположения группы выбранных полей. Это позволяет сохранить логическую связь данных и при этом получить желаемый печатный формат «Дом - Услуга» в каждой итерации вывода.