При работе в 1С часто возникает задача, которую стандартный метод ТаблицаЗначений.Свернуть() решить не может. Этот метод отлично справляется с суммированием числовых показателей, но при попытке свернуть строковые поля (например, номера документов), платформа либо выдает ошибку, либо не выполняет объединение данных. Рассмотрим подробнее, как эффективно решить эту задачу, комбинируя стандартные методы платформы и приемы обработки коллекций.
Одним из самых мощных и производительных способов обработки ТаблицаЗначений является использование объекта Запрос. Начиная с версии 8.2, мы можем передавать таблицу как параметр, что позволяет использовать весь функционал SQL-подобных группировок.
Рассмотрим, как это реализовать на практике:
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Таблица", ИсходнаяТаблица);
Запрос.Текст = "
|ВЫБРАТЬ
| Т.Дата,
| Т.Склад,
| Т.НомерДокумента,
| Т.Количество,
| Т.Сумма
|ПОМЕСТИТЬ ВТДанные
|ИЗ &Таблица КАК Т
|;
|ВЫБРАТЬ
| ВТДанные.Дата,
| ВТДанные.Склад
|ИЗ ВТДанные КАК ВТДанные
|СГРУППИРОВАТЬ ПО
| ВТДанные.Дата,
| ВТДанные.Склад";
После получения такой группировки, мы можем пройтись по выборке и собрать строки вручную, используя Выборка.СледующийПоЗначениюПоля(). Этот метод особенно хорош тем, что он перекладывает тяжелую работу по сортировке и группировке на движок базы данных 1С.
Если вы хотите избежать сложных запросов, можно использовать логику копирования колонок и последующего поиска строк. Суть метода заключается в создании новой таблицы с нужной структурой и наполнении её данными из исходной.
Разберем алгоритм по шагам:
Свернуть() для числовых показателей.НайтиСтроки().СтрСоединить().Вот пример кода, реализующего этот подход:
Результат = ИсходнаяТаблица.Скопировать();
Результат.Свернуть("Дата, Склад", "Количество, Сумма");
Результат.Колонки.Добавить("СписокНомеров", Новый ОписаниеТипов("Строка"));
СтруктураПоиска = Новый Структура("Дата, Склад");
Для Каждого СтрокаРезультата Из Результат Цикл
ЗаполнитьЗначенияСвойств(СтруктураПоиска, СтрокаРезультата);
НайденныеСтроки = ИсходнаяТаблица.НайтиСтроки(СтруктураПоиска);
МассивНомеров = Новый Массив;
Для Каждого Стр Из НайденныеСтроки Цикл
МассивНомеров.Добавить(Стр.НомерДокумента);
КонецЦикла;
СтрокаРезультата.СписокНомеров = СтрСоединить(МассивНомеров, ", ");
КонецЦикла;
Чтобы код работал максимально быстро, обратите внимание на следующие рекомендации:
СтрокаТЗ["ИмяКолонки"]. Это стандартный способ обращения к элементам ТаблицаЗначений.ИсходнаяТаблица.Индексы.Добавить("Дата, Склад"). Это значительно ускорит работу метода НайтиСтроки.Строка(). Для обратного получения ссылки из строки (если это уникальный идентификатор) используйте конструктор Новый УникальныйИдентификатор(СтрокаGUID).Используя эти методы, вы сможете гибко управлять структурой данных и получать свернутые отчеты любой сложности внутри вашей обработки или отчета в 1С.