Как вывести список всех документов-регистраторов в одной ячейке отчета СКД?

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

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

Использование агрегатной функции СоединитьСтроки

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

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

СоединитьСтроки(Регистратор, ", ")

Проанализируем параметры этой функции:

  1. Поле — это выражение, значения которого мы хотим объединить (в нашем случае Регистратор).
  2. Разделитель — строка, которая будет вставлена между элементами. Обычно используют запятую с пробелом или точку с запятой.

Вывод каждого документа с новой строки

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

В выражении ресурса укажем следующее:

СоединитьСтроки(Регистратор, Символы.ПС)

Важный момент: Чтобы перенос строки отобразился корректно, необходимо настроить оформление поля. Перейдем на вкладку Настройки, выберем наше поле и в разделе «Условное оформление» (или в свойствах выбранного поля) установим параметр Размещение в значение Переносить. Без этой настройки 1С может проигнорировать символы переноса и вывести всё в одну длинную «слепую» строку.

Устранение дублей (уникальный список документов)

Иногда в результате выполнения запроса один и тот же регистратор может дублироваться (например, если в документе несколько строк с одной и той же номенклатурой, а запрос не свернут). В этом случае функция СоединитьСтроки выведет один и тот же документ несколько раз. Чтобы получить только уникальные значения, воспользуемся более сложной конструкцией с функцией ВычислитьВыражениеСГруппировкойМассивом.

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


СоединитьСтроки(ВычислитьВыражениеСГруппировкойМассивом("Представление(Регистратор)", "Регистратор"), ", ")

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

Сортировка документов внутри ячейки

По умолчанию порядок документов в строке может быть произвольным. Часто требуется, чтобы документы шли строго по дате. Для реализации такой логики также потребуется функция ВычислитьВыражениеСГруппировкойМассивом, так как она поддерживает параметры сортировки.

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


СоединитьСтроки(ВычислитьВыражениеСГруппировкойМассивом("Регистратор", "Регистратор", , "Регистратор.Дата Возр"), ", ")

В данном случае мы указываем системе, что перед объединением в строку массив документов должен быть отсортирован по возрастанию даты (Возр).

Нюансы расшифровки (интерактивности)

При использовании СоединитьСтроки важно понимать: результат функции — это строка (текст), а не коллекция ссылок. Это означает, что если пользователь нажмет на ячейку со списком документов, он не сможет «провалиться» в конкретный документ из списка, так как система воспринимает всё содержимое ячейки как единый текстовый блок.

Если для бизнес-процесса критически важна возможность открывать документы кликом, рекомендуется использовать один из следующих подходов:

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

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

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

Проанализируем ситуацию: если вы знаете, что документов может быть очень много, лучше ограничить их количество. Например, выводить только последние 10 регистраторов или использовать функцию Массив() (доступна в последних версиях платформы 8.3) для более оптимизированной обработки данных на стороне сервера.

Для программной постобработки в новых версиях платформы (8.3.15+) в ресурсах можно использовать:

Массив(Регистратор)

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

← На главную