Сделал замер производительности на полной выгрузке без картинок в каталог, около 30% времени занимает вот эта замечательная функция в общем модуле Б_ПроцедурыИФункцииВыгрузкиДанныхНаСайт
Здесь для каждой группы вызывается запрос, если групп много - получаем тормоза. Запрос в цикле, Карл!
Эта функция оптимизируется следующим образом, после этого все летает
Код |
---|
Функция ПолучитьНоменклатуруГруппДерева(ДеревоГрупп, лМенеджерВременныхТаблиц) ТаблицаТоваровДереваГрупп = Новый ТаблицаЗначений; ТаблицаТоваровДереваГрупп.Колонки.Добавить("ИдГруппы"); ТаблицаТоваровДереваГрупп.Колонки.Добавить("Номенклатура"); ТаблицаТоваровДереваГрупп.Индексы.Добавить("Номенклатура"); ТаблицаГруппНоменклатурыДереваГрупп = Новый ТаблицаЗначений; ТаблицаГруппНоменклатурыДереваГрупп.Колонки.Добавить("ИдГруппы"); ТаблицаГруппНоменклатурыДереваГрупп.Колонки.Добавить("Номенклатура"); ПодготовитьДанныеДереваГруппРекурсивно(ТаблицаТоваровДереваГрупп, ДеревоГрупп.Строки, ТаблицаГруппНоменклатурыДереваГрупп); ТаблицаГруппНоменклатурыДереваГрупп.Свернуть("ИдГруппы, Номенклатура"); Запрос = Новый Запрос; Запрос.МенеджерВременныхТаблиц = лМенеджерВременныхТаблиц; Запрос.Текст = "ВЫБРАТЬ | ВремНоменклатура.Номенклатура |ИЗ | ВремНоменклатура КАК ВремНоменклатура |ГДЕ | ВремНоменклатура.Номенклатура В ИЕРАРХИИ(&Группа)"; Для Каждого ГруппаНоменклатуры Из ТаблицаГруппНоменклатурыДереваГрупп Цикл Запрос.УстановитьПараметр("Группа", ГруппаНоменклатуры.Номенклатура); Результат = Запрос.Выполнить(); Если Результат.Пустой() Тогда Продолжить; КонецЕсли; Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл НовСтрока = ТаблицаТоваровДереваГрупп.Добавить(); НовСтрока.ИдГруппы = ГруппаНоменклатуры.ИдГруппы; НовСтрока.Номенклатура = Выборка.Номенклатура; КонецЦикла; КонецЦикла; Возврат ТаблицаТоваровДереваГрупп; КонецФункции |
Эта функция оптимизируется следующим образом, после этого все летает
Код |
---|
Функция ПолучитьНоменклатуруГруппДерева(ДеревоГрупп, лМенеджерВременныхТаблиц) ТаблицаТоваровДереваГрупп = Новый ТаблицаЗначений; ТаблицаТоваровДереваГрупп.Колонки.Добавить("ИдГруппы", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(36, ДопустимаяДлина.Фиксированная))); ТаблицаТоваровДереваГрупп.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура")); ТаблицаГруппНоменклатурыДереваГрупп = Новый ТаблицаЗначений; ТаблицаГруппНоменклатурыДереваГрупп.Колонки.Добавить("ИдГруппы", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(36, ДопустимаяДлина.Фиксированная))); ТаблицаГруппНоменклатурыДереваГрупп.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура")); ПодготовитьДанныеДереваГруппРекурсивно(ТаблицаТоваровДереваГрупп, ДеревоГрупп.Строки, ТаблицаГруппНоменклатурыДереваГрупп); ТаблицаГруппНоменклатурыДереваГрупп.Свернуть("ИдГруппы, Номенклатура"); ЗапросГрупп = Новый Запрос; ЗапросГрупп.МенеджерВременныхТаблиц = лМенеджерВременныхТаблиц; ЗапросГрупп.УстановитьПараметр("ТаблицаГруппНоменклатурыДереваГрупп", ТаблицаГруппНоменклатурыДереваГрупп); ЗапросГрупп.Текст = "ВЫБРАТЬ | ТаблицаГруппНоменклатурыДереваГрупп.ИдГруппы, | ТаблицаГруппНоменклатурыДереваГрупп.Номенклатура КАК Номенклатура |ПОМЕСТИТЬ ТаблицаГруппНоменклатурыДереваГрупп |ИЗ | &ТаблицаГруппНоменклатурыДереваГрупп КАК ТаблицаГруппНоменклатурыДереваГрупп | |ИНДЕКСИРОВАТЬ ПО | Номенклатура"; ЗапросГрупп.Выполнить(); ЗапросГрупп.Текст = " |ВЫБРАТЬ | СпрНоменклатура.Номенклатура КАК Номенклатура, | СпрНоменклатура.Номенклатура.Родитель КАК Родитель |ПОМЕСТИТЬ ВТ_Родители_1 |ИЗ | ВремНоменклатура КАК СпрНоменклатура |ГДЕ | СпрНоменклатура.Номенклатура В ИЕРАРХИИ | (ВЫБРАТЬ | ТаблицаГруппНоменклатурыДереваГрупп.Номенклатура | ИЗ | ТаблицаГруппНоменклатурыДереваГрупп)"; НПП = 1; Пока Истина Цикл ЗапросГрупп.Выполнить(); ЗапросВТ = Новый Запрос; ЗапросВТ.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 Номенклатура ИЗ ВТ_Родители_" + Формат(НПП, "ЧГ="); ЗапросВТ.МенеджерВременныхТаблиц = лМенеджерВременныхТаблиц; Рез = ЗапросВТ.Выполнить(); Если Рез.Пустой() Тогда Прервать; КонецЕсли; НПП = НПП + 1; ЗапросГрупп.Текст = "ВЫБРАТЬ | ВТ_Родители.Номенклатура, | ВТ_Родители.Родитель.Родитель КАК Родитель |ПОМЕСТИТЬ ВТ_Родители_" + Формат(НПП, "ЧГ=") + " |ИЗ | ВТ_Родители_" + Формат(НПП - 1, "ЧГ=") + " КАК ВТ_Родители |ГДЕ | ВТ_Родители.Родитель <> ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)"; КонецЦикла; ЗапросГрупп.Текст = ""; Для й = 1 По НПП Цикл ЗапросГрупп.Текст = ЗапросГрупп.Текст + Символы.ПС + "ВЫБРАТЬ Номенклатура, Родитель " + ?(й = 1, Символы.ПС + "ПОМЕСТИТЬ ВТ_Ном", "") + Символы.ПС + "ИЗ ВТ_Родители_" + Формат(й, "ЧГ=") + " КАК ВТ_Родители "; Если й < НПП Тогда ЗапросГрупп.Текст = ЗапросГрупп.Текст + Символы.ПС + "UNION ALL" + Символы.ПС; КонецЕсли КонецЦикла; ЗапросГрупп.Текст = ЗапросГрупп.Текст + Символы.ПС + ";" + Символы.ПС + "ВЫБРАТЬ РАЗЛИЧНЫЕ | Таб1.Номенклатура КАК Номенклатура, | Таб1.ИдГруппы |ИЗ | (ВЫБРАТЬ | ВТ_ном.Номенклатура КАК Номенклатура, | ТаблицаГруппНоменклатурыДереваГрупп.ИдГруппы КАК ИдГруппы | ИЗ | ВТ_Ном КАК ВТ_ном | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаГруппНоменклатурыДереваГрупп КАК ТаблицаГруппНоменклатурыДереваГрупп | ПО ВТ_ном.Номенклатура = ТаблицаГруппНоменклатурыДереваГрупп.Номенклатура | | ОБЪЕДИНИТЬ ВСЕ | | ВЫБРАТЬ | ВТ_ном.Номенклатура, | ТаблицаГруппНоменклатурыДереваГрупп.ИдГруппы | ИЗ | ВТ_Ном КАК ВТ_ном | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаГруппНоменклатурыДереваГрупп КАК ТаблицаГруппНоменклатурыДереваГрупп | ПО ВТ_ном.Родитель = ТаблицаГруппНоменклатурыДереваГрупп.Номенклатура) КАК Таб1 | |УПОРЯДОЧИТЬ ПО | Таб1.Номенклатура |ИТОГИ ПО | Номенклатура"; РезультатГрупп = ЗапросГрупп.Выполнить(); ВыборкаГруппНоменклатурыДереваГрупп = РезультатГрупп.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаГруппНоменклатурыДереваГрупп.Следующий() Цикл ВыборкаИдГруппы = ВыборкаГруппНоменклатурыДереваГрупп.Выбрать(ОбходРезультатаЗапроса.Прямой); Пока ВыборкаИдГруппы.Следующий() Цикл НовСтрока = ТаблицаТоваровДереваГрупп.Добавить(); НовСтрока.ИдГруппы = ВыборкаИдГруппы.ИдГруппы; НовСтрока.Номенклатура = ВыборкаИдГруппы.Номенклатура; КонецЦикла; КонецЦикла; ЗапросГрупп.Текст = "УНИЧТОЖИТЬ ТаблицаГруппНоменклатурыДереваГрупп; УНИЧТОЖИТЬ ВТ_ном;"; Для й = 1 По НПП Цикл ЗапросГрупп.Текст = ЗапросГрупп.Текст + Символы.ПС + "УНИЧТОЖИТЬ ВТ_Родители_" + Формат(й, "ЧГ="); Если й < НПП Тогда ЗапросГрупп.Текст = ЗапросГрупп.Текст + Символы.ПС + ";"; КонецЕсли; КонецЦикла; ЗапросГрупп.Выполнить(); Возврат ТаблицаТоваровДереваГрупп; КонецФункции |