При разработке отчетов на Системе компоновки данных (СКД) часто возникает задача: сгруппировать данные по определенному полю (например, по Номенклатуре), просуммировать количественные показатели, а в отдельной колонке перечислить все документы, которые сформировали эти движения. Стандартная группировка выводит регистраторы в разные строки, что не всегда удобно для анализа. Рассмотрим, как собрать все ссылки на документы в одну «кучу» внутри одной ячейки.
Основным инструментом для решения этой задачи в 1С является встроенная функция СКД СоединитьСтроки(). Она предназначена для объединения значений из нескольких строк в одну текстовую строку с использованием заданного разделителя. Разберем по шагам, как настроить этот функционал в схеме компоновки данных.
Войдем в конструктор схемы компоновки данных и перейдем на вкладку Ресурсы. Именно здесь настраиваются правила агрегации данных при группировке. Для поля Регистратор (или любого другого поля, которое вы хотите перечислить) в колонке «Выражение» пропишем функцию:
СоединитьСтроки(Регистратор, ", ")
Проанализируем параметры этой функции:
Регистратор).Если документов много, список через запятую становится трудночитаемым. Гораздо нагляднее вывести каждый регистратор в той же ячейке, но с новой строки. Для этого в качестве разделителя используем специальный символ переноса строки.
В выражении ресурса укажем следующее:
СоединитьСтроки(Регистратор, Символы.ПС)
Важный момент: Чтобы перенос строки отобразился корректно, необходимо настроить оформление поля. Перейдем на вкладку Настройки, выберем наше поле и в разделе «Условное оформление» (или в свойствах выбранного поля) установим параметр Размещение в значение Переносить. Без этой настройки 1С может проигнорировать символы переноса и вывести всё в одну длинную «слепую» строку.
Иногда в результате выполнения запроса один и тот же регистратор может дублироваться (например, если в документе несколько строк с одной и той же номенклатурой, а запрос не свернут). В этом случае функция СоединитьСтроки выведет один и тот же документ несколько раз. Чтобы получить только уникальные значения, воспользуемся более сложной конструкцией с функцией ВычислитьВыражениеСГруппировкойМассивом.
Рассмотрим пример выражения:
СоединитьСтроки(ВычислитьВыражениеСГруппировкойМассивом("Представление(Регистратор)", "Регистратор"), ", ")
Здесь мы сначала группируем регистраторы, создавая массив уникальных значений, а затем объединяем этот массив в итоговую строку. Это позволяет избежать «мусора» в отчете.
По умолчанию порядок документов в строке может быть произвольным. Часто требуется, чтобы документы шли строго по дате. Для реализации такой логики также потребуется функция ВычислитьВыражениеСГруппировкойМассивом, так как она поддерживает параметры сортировки.
Разберем пример выражения с сортировкой:
СоединитьСтроки(ВычислитьВыражениеСГруппировкойМассивом("Регистратор", "Регистратор", , "Регистратор.Дата Возр"), ", ")
В данном случае мы указываем системе, что перед объединением в строку массив документов должен быть отсортирован по возрастанию даты (Возр).
При использовании СоединитьСтроки важно понимать: результат функции — это строка (текст), а не коллекция ссылок. Это означает, что если пользователь нажмет на ячейку со списком документов, он не сможет «провалиться» в конкретный документ из списка, так как система воспринимает всё содержимое ячейки как единый текстовый блок.
Если для бизнес-процесса критически важна возможность открывать документы кликом, рекомендуется использовать один из следующих подходов:
Выясним причину возможного замедления отчета. При обработке огромных массивов данных (например, тысячи регистраторов на одну позицию номенклатуры) функции объединения строк могут потреблять значительный объем оперативной памяти и замедлять формирование отчета.
Проанализируем ситуацию: если вы знаете, что документов может быть очень много, лучше ограничить их количество. Например, выводить только последние 10 регистраторов или использовать функцию Массив() (доступна в последних версиях платформы 8.3) для более оптимизированной обработки данных на стороне сервера.
Для программной постобработки в новых версиях платформы (8.3.15+) в ресурсах можно использовать:
Массив(Регистратор)
Это вернет коллекцию, которую можно обработать в коде при выводе результата, что дает больше гибкости, чем простое строковое представление.