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