Часто в процессе разработки возникает задача, когда данные представлены в виде таблицы, где для одного объекта (например, Товар) существует несколько записей с признаками. Нам нужно получить компактный вид, где все признаки для каждого товара выведены в одну строку через определенный разделитель, например, через слэш. Давайте разберем, как реализовать это наиболее изящно и эффективно.
Если данные приходят в виде ТаблицаЗначений, самый гибкий и контролируемый способ — это обработка коллекции через встроенные методы работы со строками. Этот метод отлично подходит для тех случаев, когда нужно подготовить данные перед передачей по API или выводом в форму.
Рассмотрим алгоритм действий по шагам:
ВыгрузитьКолонку для получения массива значений.СтрСоединить для формирования итоговой строки.Посмотрим на пример реализации такого подхода:
Для Каждого ТоварИзСписка Из УникальныеТовары Цикл
Отбор = Новый Структура(\"Товар\", ТоварИзСписка.Товар);
МассивСтрок = ИсходнаяТаблица.НайтиСтроки(Отбор);
МассивПризнаков = Новый Массив;
Для Каждого Стр Из МассивСтрок Цикл
МассивПризнаков.Добавить(Стр.Признак);
КонецЦикла;
СтрокаПризнаков = СтрСоединить(МассивПризнаков, \"/\");
// Далее записываем результат в новую таблицу или структуру
КонецЦикла;
Этот подход хорош тем, что он понятен, легко отлаживается и не требует сложных манипуляций с запросами к базе данных.
Если ваша задача состоит в выводе данных в отчет, то использование Система Компоновки Данных (СКД) является профессиональным стандартом. СКД позволяет выполнять агрегацию данных на уровне настроек без написания объемного кода.
В СКД предусмотрена специальная функция СоединитьСтроки, которая работает внутри вычисляемых полей или выражений ресурсов. Это позволяет динамически объединять строки при формировании отчета.
Для реализации этого метода:
Товар и Признак.Товар.СоединитьСтроки(Массив(Признак), \"/\").Такой метод предпочтителен, так как он декларативен: вы описываете «что» хотите получить, а платформа 1С сама решает, «как» это сделать наиболее оптимальным способом.
Важно понимать, что язык запросов 1С ориентирован на получение выборки данных из БД. В нем нет встроенной функции типа GROUP_CONCAT, которая существует в классических SQL-базах. Попытки «склеить» строки через цепочку ЛЕВОЕ СОЕДИНЕНИЕ одной таблицы с самой собой приводят к:
Выбирая между предложенными методами, ориентируйтесь на текущую задачу: для API-интерфейсов лучше подходит программная обработка, а для аналитических отчетов — функционал СКД.