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

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

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

Постановка задачи и базовый механизм решения

Предположим, у нас есть данные следующего вида:

  1. Документ №1 — Свойство №1 — Примечание 1
  2. Документ №1 — Свойство №1 — Примечание 2

Наша цель — получить одну строку:

Документ №1 — Свойство №1 — Примечание 1, Примечание 2

Для реализации этого в СКД предусмотрен механизм ресурсов. Основная идея заключается в том, чтобы перенести поле, которое мы хотим «склеить», в список ресурсов и применить к нему агрегатную функцию СОЕДИНИТЬСТРОКИ.

Шаг 1. Настройка поля в качестве ресурса

Разберем по шагам действия на вкладке «Ресурсы» в конструкторе схемы компоновки данных:

  1. Найдем в списке доступных полей то поле, которое нужно объединить (в нашем примере это Примечание).
  2. Перенесем его в правую часть — в список ресурсов.
  3. В колонке «Выражение» напишем функцию СОЕДИНИТЬСТРОКИ.

Базовый синтаксис функции выглядит следующим образом:

СОЕДИНИТЬСТРОКИ(Примечание, ", ")

Здесь первым параметром выступает имя поля, которое мы объединяем, а вторым — строка-разделитель (запятая и пробел). Если второй параметр не указан, СКД будет использовать точку с запятой по умолчанию.

Шаг 2. Расширенные возможности СОЕДИНИТЬСТРОКИ

Проанализируем дополнительные параметры этой функции, которые сделают отчет более профессиональным. У функции СОЕДИНИТЬСТРОКИ есть три параметра:

  1. Выражение: Само поле или выражение.
  2. Разделитель: Символ или текст между значениями.
  3. Выражение упорядочивания: Позволяет задать порядок, в котором строки будут склеиваться.

Посмотрим на пример использования сортировки внутри ячейки:

СОЕДИНИТЬСТРОКИ(Примечание, ", ", "Примечание Возр")

Это гарантирует, что примечания всегда будут выстроены по алфавиту, независимо от того, в каком порядке они пришли из базы данных.

Если в исходных данных могут быть дубли (например, дважды встречается «Важно»), то и в итоговой строке мы увидим «Важно, Важно». Чтобы избежать этого, используем ключевое слово РАЗЛИЧНЫЕ:

СОЕДИНИТЬСТРОКИ(РАЗЛИЧНЫЕ Примечание, ", ")

Шаг 3. Настройка группировок в настройках отчета

После настройки ресурса важно правильно сконфигурировать вкладку «Настройки». Выясним причину, по которой объединение может не сработать. Если мы просто выведем детальные записи, СКД по-прежнему будет выводить каждую строку отдельно, так как детальные записи игнорируют агрегатные функции ресурсов для отдельных строк.

Правильный алгоритм настройки:

  1. Вместо «Детальных записей» создадим группировку.
  2. В поле группировки добавим все поля, которые должны остаться уникальными (например, Документ и Свойство).
  3. В «Выбранных полях» этой группировки укажем наши поля группировки и поле-ресурс Примечание.

В этом случае СКД схлопнет все строки с одинаковыми документами и свойствами, а для поля Примечание вычислит значение ресурса, объединив строки.

Шаг 4. Решение проблемы с системными полями (№ п/п)

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

Для корректного вычисления номера строки в группировке следует создать пользовательское поле или добавить выражение в ресурсы для искусственного поля «Номер»:

ВычислитьВыражение("Количество()", , "ОбщийИтог")

Эта функция заставит СКД считать количество уже сгруппированных строк в контексте всего отчета, обеспечивая сквозную нумерацию.

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

Проанализируем ситуацию, когда некоторые примечания могут быть пустыми строками. Если просто использовать СОЕДИНИТЬСТРОКИ, в результате можно получить лишние запятые (например: «Пункт 1, , Пункт 3»). Выясним, как этого избежать.

Используем конструкцию ВЫБОР прямо внутри функции ресурса:


СОЕДИНИТЬСТРОКИ(ВЫБОР КОГДА Примечание <> "" ТОГДА Примечание ИНАЧЕ NULL КОНЕЦ, ", ")

Поскольку СКД автоматически игнорирует значения NULL при агрегации, пустые строки не будут добавлять лишних разделителей.

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

СОЕДИНИТЬСТРОКИ(Примечание, Символы.ПС)

При такой настройке в ячейке сформируется многострочный текст, что часто выглядит более читаемо в сложных отчетах.

Шаг 6. Использование Массива (альтернативный метод)

Рассмотрим кратко упоминавшийся на форумах метод через МАССИВ(). Если в поле выражения ресурса написать МАССИВ(Примечание), СКД соберет значения в коллекцию. Однако для визуального отображения в стандартном отчете этот метод менее удобен, так как он предназначен скорее для программной обработки результата компоновки. Для визуального отображения «через запятую» функция СОЕДИНИТЬСТРОКИ является «золотым стандартом» и наиболее эффективным инструментом.

Важный совет: Если после настройки ресурсов вы видите внизу отчета дублирующуюся строку с общим итогом, где также перечислены все примечания через запятую, просто отключите вывод общих итогов в настройках отчета (вкладка «Другие настройки» — «Расположение общих итогов по вертикали = Нет»).

← На главную