При разработке отчетов на Системе компоновки данных (СКД) программисты часто сталкиваются с ситуацией, когда запрос возвращает несколько строк, которые идентичны во всех полях, кроме одного. Типичный пример: документ и список его характеристик или примечаний. Вместо того чтобы выводить документ трижды с разными примечаниями, логичнее вывести его один раз, а все примечания собрать в одну ячейку через разделитель. Рассмотрим подробно, как реализовать этот функционал штатными средствами СКД без изменения текста запроса.
Предположим, у нас есть данные следующего вида:
Наша цель — получить одну строку:
Документ №1 — Свойство №1 — Примечание 1, Примечание 2
Для реализации этого в СКД предусмотрен механизм ресурсов. Основная идея заключается в том, чтобы перенести поле, которое мы хотим «склеить», в список ресурсов и применить к нему агрегатную функцию СОЕДИНИТЬСТРОКИ.
Разберем по шагам действия на вкладке «Ресурсы» в конструкторе схемы компоновки данных:
Примечание).СОЕДИНИТЬСТРОКИ.Базовый синтаксис функции выглядит следующим образом:
СОЕДИНИТЬСТРОКИ(Примечание, ", ")
Здесь первым параметром выступает имя поля, которое мы объединяем, а вторым — строка-разделитель (запятая и пробел). Если второй параметр не указан, СКД будет использовать точку с запятой по умолчанию.
Проанализируем дополнительные параметры этой функции, которые сделают отчет более профессиональным. У функции СОЕДИНИТЬСТРОКИ есть три параметра:
Посмотрим на пример использования сортировки внутри ячейки:
СОЕДИНИТЬСТРОКИ(Примечание, ", ", "Примечание Возр")
Это гарантирует, что примечания всегда будут выстроены по алфавиту, независимо от того, в каком порядке они пришли из базы данных.
Если в исходных данных могут быть дубли (например, дважды встречается «Важно»), то и в итоговой строке мы увидим «Важно, Важно». Чтобы избежать этого, используем ключевое слово РАЗЛИЧНЫЕ:
СОЕДИНИТЬСТРОКИ(РАЗЛИЧНЫЕ Примечание, ", ")
После настройки ресурса важно правильно сконфигурировать вкладку «Настройки». Выясним причину, по которой объединение может не сработать. Если мы просто выведем детальные записи, СКД по-прежнему будет выводить каждую строку отдельно, так как детальные записи игнорируют агрегатные функции ресурсов для отдельных строк.
Правильный алгоритм настройки:
Документ и Свойство).Примечание.В этом случае СКД схлопнет все строки с одинаковыми документами и свойствами, а для поля Примечание вычислит значение ресурса, объединив строки.
Часто при переходе от детальных записей к группировкам перестает корректно работать системное поле НомерПоПорядку. Оно может начать показывать единицы для каждой строки или вообще исчезнуть. Разберем, как восстановить нумерацию.
Для корректного вычисления номера строки в группировке следует создать пользовательское поле или добавить выражение в ресурсы для искусственного поля «Номер»:
ВычислитьВыражение("Количество()", , "ОбщийИтог")
Эта функция заставит СКД считать количество уже сгруппированных строк в контексте всего отчета, обеспечивая сквозную нумерацию.
Проанализируем ситуацию, когда некоторые примечания могут быть пустыми строками. Если просто использовать СОЕДИНИТЬСТРОКИ, в результате можно получить лишние запятые (например: «Пункт 1, , Пункт 3»). Выясним, как этого избежать.
Используем конструкцию ВЫБОР прямо внутри функции ресурса:
СОЕДИНИТЬСТРОКИ(ВЫБОР КОГДА Примечание <> "" ТОГДА Примечание ИНАЧЕ NULL КОНЕЦ, ", ")
Поскольку СКД автоматически игнорирует значения NULL при агрегации, пустые строки не будут добавлять лишних разделителей.
Также иногда требуется вывести значения не через запятую, а каждое с новой строки внутри одной ячейки. Для этого в качестве разделителя используем системную константу:
СОЕДИНИТЬСТРОКИ(Примечание, Символы.ПС)
При такой настройке в ячейке сформируется многострочный текст, что часто выглядит более читаемо в сложных отчетах.
Рассмотрим кратко упоминавшийся на форумах метод через МАССИВ(). Если в поле выражения ресурса написать МАССИВ(Примечание), СКД соберет значения в коллекцию. Однако для визуального отображения в стандартном отчете этот метод менее удобен, так как он предназначен скорее для программной обработки результата компоновки. Для визуального отображения «через запятую» функция СОЕДИНИТЬСТРОКИ является «золотым стандартом» и наиболее эффективным инструментом.
Важный совет: Если после настройки ресурсов вы видите внизу отчета дублирующуюся строку с общим итогом, где также перечислены все примечания через запятую, просто отключите вывод общих итогов в настройках отчета (вкладка «Другие настройки» — «Расположение общих итогов по вертикали = Нет»).