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

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

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

Разбор проблемы дублирования данных

Основная сложность при решении такой задачи заключается в структуре данных. Когда мы соединяем в одном запросе клиента с товарами и контактной информацией, 1С создает декартово произведение. В результате, если у клиента 2 товара и 2 вида контактной информации, система формирует 4 строки для одного клиента. При попытке простого вывода или даже агрегации без подготовки, мы получаем повторяющиеся значения, например: «Ручка, Ручка, Бумага, Бумага».

Решение с использованием ресурсов и агрегатных функций

Чтобы избежать дублей и получить аккуратную строку, воспользуемся возможностями языка выражений СКД. Нам не потребуется менять структуру запроса или писать внешние функции — все решается через настройку вкладки Ресурсы.

Рассмотрим пошагово, как настроить расчет ресурсов:

  1. Перейдите в конструктор настроек СКД на вкладку Ресурсы.
  2. Для полей, которые вы хотите вывести строкой, укажите выражение агрегации.
  3. Используйте конструкцию, объединяющую функции Массив, Различные и СоединитьСтроки.

Выражение должно выглядеть следующим образом:

СоединитьСтроки(Массив(Различные НазваниеПоля), ", ")

Как работает это выражение

Давайте проанализируем, почему этот метод позволяет получить корректный результат:

Альтернативный подход: разделение наборов данных

Если вы чувствуете, что «плоский» запрос сильно перегружает систему или данные слишком сильно дублируются, рассмотрите вариант разделения наборов данных в схеме компоновки:

  1. Создайте Набор данных - запрос для основных данных (Клиенты).
  2. Создайте отдельные Наборы данных для товаров и контактной информации.
  3. Настройте связи наборов данных на вкладке Связи наборов данных, указав путь связи по полю Клиент.

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

Важные замечания и ограничения

Работая с конкатенацией, помните о следующих технических нюансах:

Применяя данные методы, вы сможете реализовывать гибкие и наглядные отчеты, сохраняя при этом чистоту кода и следуя принципам декларативного программирования в 1С.

← На главную