Как объединить строки в одну ячейку в отчете СКД с помощью функции СоединитьСтроки

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

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

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

Проанализируем ситуацию, с которой сталкивается большинство разработчиков. Когда мы пишем запрос, в котором основная таблица (например, Документы.РеализацияТоваровУслуг) соединяется с подчиненной таблицей (например, Справочник.Файлы), СУБД возвращает столько строк для каждого документа, сколько файлов к нему привязано. Это нормальное поведение реляционных баз данных.

Если просто вывести такие данные в отчет, мы увидим дублирование основной информации документа в каждой строке. Наша задача — заставить СКД "схлопнуть" эти строки, оставив одну строку на документ, а имена файлов собрать в цепочку.

Шаг 1: Настройка ресурсов СКД

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

  1. Перейдем на закладку Ресурсы в схеме компоновки данных.
  2. Перенесем поле (например, ИмяФайла) в список ресурсов.
  3. В колонке Выражение пропишем функцию объединения.

Рассмотрим простейший вариант выражения:

СоединитьСтроки(ИмяФайла)

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

Пример продвинутого выражения:

СоединитьСтроки(ИмяФайла, ", ", "ИмяФайла Возр")

Шаг 2: Использование ключевого слова Различные

Иногда из-за особенностей запроса или случайных дублей в данных одно и то же имя файла может попасть в выборку дважды. Чтобы в итоговой ячейке не было повторов, внутри функции можно использовать конструкцию Различные. Посмотрим на пример:

СоединитьСтроки(Различные ИмяФайла, "; ")

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

Шаг 3: Правильная настройка структуры отчета

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

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

  1. Удалим из структуры отчета элемент Детальные записи.
  2. Вместо него добавим новую Группировку.
  3. В состав полей группировки нужно включить все поля, которые должны быть уникальными (например, Ссылка, Дата, Номер, Контрагент).
  4. Поле ИмяФайла (наш ресурс) в саму группировку добавлять не нужно — оно должно быть выбрано в Выбранных полях этой группировки.

Проанализируем ситуацию: когда СКД видит группировку, она собирает все детальные записи, относящиеся к этой группе, и применяет к ним функции из ресурсов. Именно в этот момент срабатывает СоединитьСтроки, собирая данные из всех "схлопнутых" строк в одну.

Альтернативный метод через Массив (для новых платформ)

Начиная с версии платформы 8.3.15, разработчикам стал доступен еще более мощный инструмент — функция Массив(). Мы можем скомбинировать её с объединением строк. Рассмотрим этот пример:

СоединитьСтроки(Массив(ИмяФайла))

Этот способ часто работает стабильнее, если требуется предварительная сложная обработка данных. Также это позволяет использовать конструкцию ВычислитьВыражениеСГруппировкойМассив, если логика объединения зависит от иерархии группировок в отчете.

Обработка пустых значений и форматирование

Важно помнить, что функция СоединитьСтроки автоматически игнорирует значения NULL и пустые строки. Если у документа нет прикрепленных файлов, ячейка просто останется пустой, что избавляет нас от необходимости писать дополнительные проверки ЕСТЬNULL или условия ВЫБОР.

Также стоит уделить внимание визуальному представлению. Если имен файлов много, ячейка может стать слишком длинной. Рассмотрим рекомендации по оформлению:

Производительность и ограничения

Посмотрим на ситуацию со стороны производительности. Нужно понимать, что СоединитьСтроки выполняется на уровне процессора компоновки данных, а не на стороне SQL-сервера. Если ваш отчет выводит десятки тысяч строк, в каждой из которых нужно объединить сотни элементов, это может привести к замедлению формирования.

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

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

← На главную