Как в СКД вывести в колонку список значений из табличной части справочника?

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

При разработке отчетов в системе компоновки данных (СКД) часто возникает задача вывести список значений из табличной части объекта (например, перечень складов, товаров или контактных лиц) в одну-единственную ячейку таблицы, а не разворачивать отчет на множество дополнительных строк. Попытка напрямую обратиться к реквизиту табличной части через точку (например, Ссылка.Склады.Склад) или применить функцию Массив() на уровне детальных записей приводит к ошибке или нежелательному разворачиванию строк.

Рассмотрим причину возникновения этой ситуации и разберем по шагам несколько рабочих способов решения данной задачи.

Выясним причину проблемы

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

Способ 1. Использование двух наборов данных и связей наборов (Решение автора)

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

  1. Создание первого (основного) набора данных: Добавим набор данных — запрос, в котором выбираем основные реквизиты объекта (например, поле Ссылка и любые другие необходимые поля шапки).
  2. Создание второго набора данных: Добавим второй набор данных — запрос, который считывает данные из табличной части.
    
    ВЫБРАТЬ
    	Склады.Ссылка КАК Ссылка,
    	Склады.Склад КАК Склад
    ИЗ
    	Справочник.Склады.Склады КАК Склады
    
  3. Настройка связи наборов данных: Перейдем на вкладку Связи наборов данных. Укажем источником связи НаборДанных1, приемником — НаборДанных2. В качестве выражения связи выберем Ссылка, а в поле «Условие связи» укажем Ссылка.
  4. Настройка ресурса: Перейдем на вкладку Ресурсы. Добавим поле Склад и укажем для него выражение агрегации: Массив(Склад) Или, для получения строки с разделителями: СоединитьСтроки(Массив(Различные Склад), ", ")

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

Способ 2. Настройка агрегатного ресурса в одном наборе данных

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

  1. Запрос набора данных: В одном запросе соединяем основной объект и его табличную часть, получая поля Ссылка и Склад.
  2. Настройка ресурсов: На вкладке Ресурсы добавляем поле Склад. В выражении пишем: СоединитьСтроки(Массив(Различные Склад), ", ") В колонке Рассчитывать по... выбираем группировку Ссылка.
  3. Настройка структуры отчета: В настройках отчета создаем группировку по полю Ссылка. Детальные записи выводить не требуется.

Способ 3. Использование вычисляемого поля и функции общего модуля

Если требуется вывести элементы табличной части без изменения структуры группировок СКД, можно воспользоваться вызовом экспортной функции из вычисляемого поля.

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

Ограничения и особенности работы

Разберем важные нюансы, о которых следует помнить при реализации данных решений:

  1. Удаление дублей: При формировании списка из табличной части рекомендуется использовать ключевое слово Различные внутри агрегатных функций (например, Массив(Различные Склад)), чтобы предотвратить дублирование одинаковых значений.
  2. Потеря расшифровки: При объединении значений табличной части в текстовую строку с помощью СоединитьСтроки() стандартная расшифровка 1С будет срабатывать для всей ячейки целиком, а не для каждого отдельного элемента.
  3. Производительность: Способ с вызовом функции общего модуля из вычисляемого поля может снизить скорость формирования отчета при больших объемах данных из-за выполнения отдельного обращения к БД или объекту на каждую строку. Настройка ресурсов через наборы данных СКД является более оптимальной.
← На главную