При разработке отчетов на Системе компоновки данных (СКД) часто возникает задача собрать данные из нескольких связанных строк в одну ячейку. Типичный пример: вывод списка документов, где в одной колонке должны быть перечислены все прикрепленные к ним файлы или спецификации. В этой статье мы подробно разберем, как использовать функцию СоединитьСтроки, почему стандартные настройки группировок могут мешать результату и как добиться красивого вывода данных.
Проанализируем ситуацию, с которой сталкивается большинство разработчиков. Когда мы пишем запрос, в котором основная таблица (например, Документы.РеализацияТоваровУслуг) соединяется с подчиненной таблицей (например, Справочник.Файлы), СУБД возвращает столько строк для каждого документа, сколько файлов к нему привязано. Это нормальное поведение реляционных баз данных.
Если просто вывести такие данные в отчет, мы увидим дублирование основной информации документа в каждой строке. Наша задача — заставить СКД "схлопнуть" эти строки, оставив одну строку на документ, а имена файлов собрать в цепочку.
Первым делом нам необходимо указать системе, что поле с наименованием файла не является просто детальной записью, а должно обрабатываться как агрегатное значение. Для этого выполним следующие действия:
ИмяФайла) в список ресурсов.Рассмотрим простейший вариант выражения:
СоединитьСтроки(ИмяФайла)
Однако стандартная функция имеет более богатый синтаксис, который позволяет сделать отчет удобнее. Разберем расширенный формат: СоединитьСтроки(Выражение, Разделитель, ВыражениеУпорядочивания).
Символы.ПС.Пример продвинутого выражения:
СоединитьСтроки(ИмяФайла, ", ", "ИмяФайла Возр")
Иногда из-за особенностей запроса или случайных дублей в данных одно и то же имя файла может попасть в выборку дважды. Чтобы в итоговой ячейке не было повторов, внутри функции можно использовать конструкцию Различные. Посмотрим на пример:
СоединитьСтроки(Различные ИмяФайла, "; ")
Это гарантирует, что в результирующей строке каждое значение встретится только один раз, что значительно повышает чистоту отчета.
Это самый важный этап, на котором многие совершают ошибку. Если в настройках отчета (закладка Настройки) оставить ветку Детальные записи, то СКД все равно будет выводить каждую строку из результата запроса по отдельности. В этом случае ресурс СоединитьСтроки будет работать только для каждой конкретной строки, выдавая в ячейку ровно одно имя файла.
Выясним, как заставить систему группировать данные:
Ссылка, Дата, Номер, Контрагент).ИмяФайла (наш ресурс) в саму группировку добавлять не нужно — оно должно быть выбрано в Выбранных полях этой группировки.Проанализируем ситуацию: когда СКД видит группировку, она собирает все детальные записи, относящиеся к этой группе, и применяет к ним функции из ресурсов. Именно в этот момент срабатывает СоединитьСтроки, собирая данные из всех "схлопнутых" строк в одну.
Начиная с версии платформы 8.3.15, разработчикам стал доступен еще более мощный инструмент — функция Массив(). Мы можем скомбинировать её с объединением строк. Рассмотрим этот пример:
СоединитьСтроки(Массив(ИмяФайла))
Этот способ часто работает стабильнее, если требуется предварительная сложная обработка данных. Также это позволяет использовать конструкцию ВычислитьВыражениеСГруппировкойМассив, если логика объединения зависит от иерархии группировок в отчете.
Важно помнить, что функция СоединитьСтроки автоматически игнорирует значения NULL и пустые строки. Если у документа нет прикрепленных файлов, ячейка просто останется пустой, что избавляет нас от необходимости писать дополнительные проверки ЕСТЬNULL или условия ВЫБОР.
Также стоит уделить внимание визуальному представлению. Если имен файлов много, ячейка может стать слишком длинной. Рассмотрим рекомендации по оформлению:
Посмотрим на ситуацию со стороны производительности. Нужно понимать, что СоединитьСтроки выполняется на уровне процессора компоновки данных, а не на стороне SQL-сервера. Если ваш отчет выводит десятки тысяч строк, в каждой из которых нужно объединить сотни элементов, это может привести к замедлению формирования.
В критических случаях, когда скорость формирования отчета имеет решающее значение, можно рассмотреть вариант предварительного сбора строк в самом тексте запроса (через временные таблицы и программную обработку в ПриКомпоновкеРезультата), но для 99% повседневных задач стандартной функции СКД более чем достаточно.
Подведем итог: для успешного объединения строк нам нужно перенести поле в ресурсы, правильно выбрать разделитель и — самое главное — заменить Детальные записи на Группировку по основным полям документа. Такой подход делает отчеты компактными, профессиональными и удобными для конечного пользователя.