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