v8: Ускорение типовой свертки таблиц значений в 1С80 Ключевые слова: производительность,таблица значений,свертка
Основываясь на коде Волочаева Дмитрия, я написал замену типовой функции по свертке таблицы значений ее сверткой через построитель запроса.
Дело в том что таблица значений - неиндексированная коллекция и типовая свертка по ней работает медленно.
Рекомендуется для ускорения все вызовы ТЗ.Свернуть(А,Б) на ТурбоСвернуть(ТЗ,А,Б) и удивитесь приросту скорости.
Функция ТурбоСвернуть(ТЗ, _СтрокаСвертки, _СтрокаИтогов)
СтрокаСвертки=СтрЗаменить(_СтрокаСвертки," ","")+",";
СтрокаИтогов=СтрЗаменить(_СтрокаИтогов," ","")+",";
ПоляИтогов=Новый Массив;
ПоляСвертки=Новый Массив;
//(C) Основано на коде Волочаева Дмитрия, переработано Гением 1С
ПЗ = Новый ПостроительЗапроса();
ПЗ.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТЗ);
Для каждого Колонка Из ПЗ.ИсточникДанных.Колонки Цикл
//Колонка.Измерение = Истина;
Если Найти(СтрокаИтогов, Колонка.Имя +",")<>0 Тогда
ПоляИтогов.Добавить(Колонка.Имя);
Колонка.Итог = "Сумма("+Колонка.Имя+")";
ИначеЕсли Найти(СтрокаСвертки, Колонка.Имя +",")<>0 Тогда
ПоляСвертки.Добавить(Колонка.Имя);
КонецЕсли;
КонецЦикла;
ПЗ.ЗаполнитьНастройки();
ПЗ.Выполнить();
Выборка = ПЗ.Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
ТЗ1 = Новый ТаблицаЗначений;
Для Каждого ПолеСвертки ИЗ ПоляСвертки Цикл
ТЗ1.Колонки.Добавить(ПолеСвертки, ТЗ.Колонки[ПолеСвертки].ТипЗначения);
КонецЦикла;
Для Каждого ПолеИтогов ИЗ ПоляИтогов Цикл
ТЗ1.Колонки.Добавить(ПолеИтогов, Новый ОписаниеТипов("Число"));
КонецЦикла;
Пока Выборка.Следующий() Цикл
Стр= ТЗ1.Добавить();
ЗаполнитьЗначенияСвойств(Стр, Выборка);
КонецЦикла;
Возврат ТЗ1;
КонецФункции
|