Как разгруппировать выводимые данные в СКД и выводить родителя для каждой строки

Программист 1С v8.3 (Управляемые формы)
← На главную

При работе с Системой компоновки данных (СКД) разработчики часто сталкиваются со стандартным поведением системы: иерархическим представлением данных. По умолчанию, если мы задаем группировку по полю Здание, а внутри нее — список полей Услуга, СКД выведет заголовок здания один раз, а под ним — список всех относящихся к нему услуг. Однако в ряде задач, например, для формирования специфических реестров или актов, требуется иной формат: Здание - Услуга 1, Здание - Услуга 2 и так далее. В этой статье мы разберем, как «разгруппировать» данные и добиться повторения родительских полей для каждой дочерней записи.

Проблема стандартной группировки и почему правка запроса не помогает

Часто программисты пытаются решить задачу на уровне запроса, убирая секцию СГРУППИРОВАТЬ ПО или пытаясь изменить структуру выборки. Рассмотрим типичную ситуацию: в наборе данных запрос возвращает плоскую таблицу, где в каждой строке есть и здание, и услуга. Однако, как только этот набор данных попадает в настройки СКД на вкладку «Настройки», компоновщик по умолчанию пытается визуально объединить дублирующиеся значения в иерархию, если заданы соответствующие группировки.

Важно понимать, что настройки визуализации в СКД имеют приоритет над структурой выборки в запросе. Даже если запрос возвращает «развернутые» данные, настройки компоновщика (группировки в структуре отчета) заново их «схлопывают» для удобства чтения. Чтобы изменить это поведение, необходимо работать именно с настройками компоновки, а не с текстом запроса.

Способ 1. Создание вертикальной группы выбранных полей

Это наиболее гибкий и рекомендуемый метод, который упоминался в обсуждении. Мы проанализируем, как настроить состав полей так, чтобы они выводились друг под другом в рамках одной логической итерации. Разберем по шагам:

  1. Перейдем на вкладку «Настройки» в схеме компоновки данных.
  2. В структуре отчета выберем нужную группировку (или Детальные записи).
  3. Перейдем в правую часть окна на закладку «Выбранные поля».
  4. Нажмем правую кнопку мыши и выберем пункт «Новая группа выбранных полей».
  5. В появившемся окне установим свойство «Расположение» в значение «Вертикально».
  6. Перетащим в эту новую группу поля Здание и Услуга.

В результате такого подхода система для каждой строки данных будет отрисовывать сначала ячейку (или строку) со зданием, а сразу под ней — ячейку с услугой. Это создаст визуальный эффект «разгруппировки», при котором информация о здании будет дублироваться для каждой услуги, но выводиться они будут последовательно по вертикали.

Способ 2. Настройка параметра «Расположение группировок»

Если нам нужно сохранить классическую структуру группировок (когда Здание является родителем для Услуги), но при этом заставить систему выводить здание перед каждой услугой, мы можем воспользоваться системными параметрами вывода.

Проанализируем работу параметра «Расположение группировок»:

При такой настройке СКД перестанет выводить общую «шапку» для всей группы и начнет повторять заголовок группировки для каждого элемента. Это особенно полезно, когда здание содержит много вложенных данных, и нам нужно четко разделять их визуально, повторяя контекст.

Способ 3. Использование детальных записей с дополнительными полями

Рассмотрим ситуацию, когда нам вообще не нужны иерархические уровни в структуре отчета. Мы хотим получить просто список строк. Для этого выполним следующие действия:

  1. В структуре отчета на вкладке «Настройки» удалим все группировки (такие как группировка по полю Здание).
  2. Добавим одну группировку типа «Детальные записи».
  3. На вкладке «Выбранные поля» для этой группировки добавим и Здание, и Услуга.

Теперь система выведет все данные в одну таблицу. Чтобы данные не превратились в «кашу», можно настроить Условное оформление. Например, можно задать выделение цветом или шрифтом для поля Здание, чтобы оно визуально отделяло одну услугу от другой. Для этого используем системное поле Уровень или просто проверку на заполненность.

Способ 4. Работа с собственными макетами (Layouts)

Если стандартные настройки не позволяют добиться нужного визуального идеала, мы можем создать собственный макет оформления. Как выяснилось в ходе обсуждения, попытки создать макет часто заканчиваются «пустым отчетом», если не соблюдены технические нюансы.

Разберем, как правильно создать макет для разгруппированных данных:

Использование макетов — это трудоемкий процесс, но он дает 100% контроль над тем, как будет выглядеть каждая строка отчета. Однако в большинстве случаев достаточно Способа №1 с вертикальной группой полей.

Нюансы использования ресурсов

При разгруппировке данных важно следить за тем, как рассчитываются итоги. Если мы выводим здание для каждой услуги, то простые ресурсы (например, Сумма) могут задваиваться, если они привязаны к зданию, а не к услуге. Выясним, как этого избежать:

На вкладке «Роли» в наборе данных для поля Здание можно указать, что оно является обязательным, а для числовых показателей правильно настроить выражения ресурсов. Например, использовать Максимум() или Среднее(), если сумма должна относиться к зданию в целом, а не суммироваться по каждой строке услуги при выводе в итогах.

Также полезно использовать функцию СоединитьСтроки() на вкладке ресурсов, если ваша задача стоит в обратном: не разгруппировать, а наоборот, собрать все услуги в одну ячейку через запятую. Пример выражения:

СоединитьСтроки(Услуга, ", ")

Это альтернативный взгляд на проблему, когда «разгруппировка» заменяется компактным перечислением внутри одной строки родителя.

Подводя итог, можно сказать, что наиболее эффективным решением для автора темы стала настройка вертикального расположения группы выбранных полей. Это позволяет сохранить логическую связь данных и при этом получить желаемый печатный формат «Дом - Услуга» в каждой итерации вывода.

← На главную