Оптимизация поиска по подчиненным выборкам в запросе
В одном запросе 1С нельзя использовать несколько подчиненных группировок.
Рассмотрим на примере выгрузки картинок на сайт. Я сделал отдельный запрос по картинкам и хотел организовать поиск по номенклутуре. Но работало медленно:
МассивКартинок = Новый Массив(); //Сбрасываем перед поиском ВыборкаНоменклатураПоКартинкам.Сбросить(); Если ВыборкаНоменклатураПоКартинкам.НайтиСледующий(Новый Структура("Номенклатура", Ссылка)) Тогда ВыборкаКартинки = ВыборкаНоменклатураПоКартинкам.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); ИндексКартинки = 0; Пока ВыборкаКартинки.Следующий() Цикл СтруктураКартинки = Новый Структура(); ИндексКартинки = ИндексКартинки + 1; СтруктураКартинки.Вставить("img_number", ИндексКартинки); СтруктураКартинки.Вставить("img_guid", XMLСтрока(ВыборкаКартинки.Ссылка)); СтруктураКартинки.Вставить("img_name", XMLСтрока(СокрЛП(ВыборкаКартинки.Наименование))); СтруктураКартинки.Вставить("img_ext", XMLСтрока(СокрЛП(ВыборкаКартинки.Расширение))); СтруктураКартинки.Вставить("img_size", ВыборкаКартинки.Размер); МассивКартинок.Добавить(СтруктураКартинки); КонецЦикла; КонецЕсли; СтруктураТовар.Вставить("images", МассивКартинок);
Замер производительности показывал, что работало медленно на поиске.
Пришлось переписать через формирование соответствия:
СооКартинки = Новый Соответствие(); Пока ВыборкаНоменклатураПоКартинкам.Следующий() Цикл Номенклатура = ВыборкаНоменклатураПоКартинкам.Номенклатура; МассивКартинок = Новый Массив(); ИндексКартинки = 0; ВыборкаКартинки = ВыборкаНоменклатураПоКартинкам.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаКартинки.Следующий() Цикл СтруктураКартинки = Новый Структура(); ИндексКартинки = ИндексКартинки + 1; СтруктураКартинки.Вставить("img_number", ИндексКартинки); СтруктураКартинки.Вставить("img_guid", XMLСтрока(Номенклатура)); СтруктураКартинки.Вставить("img_name", XMLСтрока(СокрЛП(ВыборкаКартинки.Наименование))); СтруктураКартинки.Вставить("img_ext", XMLСтрока(СокрЛП(ВыборкаКартинки.Расширение))); СтруктураКартинки.Вставить("img_size", ВыборкаКартинки.Размер); МассивКартинок.Добавить(СтруктураКартинки); КонецЦикла; СооКартинки.Вставить(Номенклатура, МассивКартинок); КонецЦикла;
И последующий поиск в соответствии:
МассивКартинок = СооКартинки[Ссылка]; Если МассивКартинок = Неопределено Тогда МассивКартинок = Новый Массив(); КонецЕсли; СтруктураТовар.Вставить("images", МассивКартинок);
Это оптимальное решение задачи?
