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