Как красиво объединить строки признаков для одного товара в 1С?

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

Часто в процессе разработки возникает задача, когда данные представлены в виде таблицы, где для одного объекта (например, Товар) существует несколько записей с признаками. Нам нужно получить компактный вид, где все признаки для каждого товара выведены в одну строку через определенный разделитель, например, через слэш. Давайте разберем, как реализовать это наиболее изящно и эффективно.

Метод 1: Программная обработка коллекции

Если данные приходят в виде ТаблицаЗначений, самый гибкий и контролируемый способ — это обработка коллекции через встроенные методы работы со строками. Этот метод отлично подходит для тех случаев, когда нужно подготовить данные перед передачей по API или выводом в форму.

Рассмотрим алгоритм действий по шагам:

  1. Создаем копию исходной таблицы или используем выборку уникальных товаров.
  2. В цикле по товарам отбираем все соответствующие строки признаков.
  3. Используем метод ВыгрузитьКолонку для получения массива значений.
  4. Применяем функцию СтрСоединить для формирования итоговой строки.

Посмотрим на пример реализации такого подхода:


Для Каждого ТоварИзСписка Из УникальныеТовары Цикл
    Отбор = Новый Структура(\"Товар\", ТоварИзСписка.Товар);
    МассивСтрок = ИсходнаяТаблица.НайтиСтроки(Отбор);
    
    МассивПризнаков = Новый Массив;
    Для Каждого Стр Из МассивСтрок Цикл
        МассивПризнаков.Добавить(Стр.Признак);
    КонецЦикла;
    
    СтрокаПризнаков = СтрСоединить(МассивПризнаков, \"/\");
    // Далее записываем результат в новую таблицу или структуру
КонецЦикла;

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

Метод 2: Использование возможностей СКД

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

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

Для реализации этого метода:

  1. Добавьте в набор данных запрос, который выбирает поля Товар и Признак.
  2. В настройках отчета установите группировку по полю Товар.
  3. Создайте вычисляемое поле, где в выражении укажите СоединитьСтроки(Массив(Признак), \"/\").
  4. При выводе данных СКД автоматически соберет все признаки, относящиеся к одной группировке, в одну ячейку.

Такой метод предпочтителен, так как он декларативен: вы описываете «что» хотите получить, а платформа 1С сама решает, «как» это сделать наиболее оптимальным способом.

Почему не стоит использовать сложные соединения в запросах?

Важно понимать, что язык запросов 1С ориентирован на получение выборки данных из БД. В нем нет встроенной функции типа GROUP_CONCAT, которая существует в классических SQL-базах. Попытки «склеить» строки через цепочку ЛЕВОЕ СОЕДИНЕНИЕ одной таблицы с самой собой приводят к:

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

← На главную