Как свернуть таблицу значений с объединением строковых данных через разделитель?

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

При работе в 1С часто возникает задача, которую стандартный метод ТаблицаЗначений.Свернуть() решить не может. Этот метод отлично справляется с суммированием числовых показателей, но при попытке свернуть строковые поля (например, номера документов), платформа либо выдает ошибку, либо не выполняет объединение данных. Рассмотрим подробнее, как эффективно решить эту задачу, комбинируя стандартные методы платформы и приемы обработки коллекций.

Метод 1: Использование запросов к Таблице Значений

Одним из самых мощных и производительных способов обработки ТаблицаЗначений является использование объекта Запрос. Начиная с версии 8.2, мы можем передавать таблицу как параметр, что позволяет использовать весь функционал SQL-подобных группировок.

Рассмотрим, как это реализовать на практике:


Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Таблица", ИсходнаяТаблица);
Запрос.Текст = "
|ВЫБРАТЬ
|    Т.Дата,
|    Т.Склад,
|    Т.НомерДокумента,
|    Т.Количество,
|    Т.Сумма
|ПОМЕСТИТЬ ВТДанные
|ИЗ &Таблица КАК Т
|;
|ВЫБРАТЬ
|    ВТДанные.Дата,
|    ВТДанные.Склад
|ИЗ ВТДанные КАК ВТДанные
|СГРУППИРОВАТЬ ПО
|    ВТДанные.Дата,
|    ВТДанные.Склад";

После получения такой группировки, мы можем пройтись по выборке и собрать строки вручную, используя Выборка.СледующийПоЗначениюПоля(). Этот метод особенно хорош тем, что он перекладывает тяжелую работу по сортировке и группировке на движок базы данных 1С.

Метод 2: Универсальный подход через цикл и НайтиСтроки

Если вы хотите избежать сложных запросов, можно использовать логику копирования колонок и последующего поиска строк. Суть метода заключается в создании новой таблицы с нужной структурой и наполнении её данными из исходной.

Разберем алгоритм по шагам:

  1. Копируем исходную таблицу в архивную для работы с данными.
  2. Выполняем стандартный метод Свернуть() для числовых показателей.
  3. Добавляем в свернутую таблицу пустую строковую колонку для конкатенации.
  4. Для каждой строки свернутой таблицы находим соответствующие исходные записи методом НайтиСтроки().
  5. Объединяем найденные значения через СтрСоединить().

Вот пример кода, реализующего этот подход:


Результат = ИсходнаяТаблица.Скопировать();
Результат.Свернуть("Дата, Склад", "Количество, Сумма");
Результат.Колонки.Добавить("СписокНомеров", Новый ОписаниеТипов("Строка"));

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

Важные советы по оптимизации

Чтобы код работал максимально быстро, обратите внимание на следующие рекомендации:

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

← На главную