Оптимизация поиска по подчиненным выборкам в запросе

В одном запросе 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", МассивКартинок);

Это оптимальное решение задачи?

image_pdfimage_print

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Вам может также понравиться...

комментария 2

  1. fedignat:

    Это шутка что-ли?

    Запрос = Новый Запрос();

    Запрос.Текст = »
    |ВЫБРАТЬ
    | НоменклатураПрисоединенныеФайлы.ВладелецФайла КАК Номенклатура,
    | НоменклатураПрисоединенныеФайлы.Размер КАК Размер,
    | НоменклатураПрисоединенныеФайлы.Расширение КАК Расширение,
    | НоменклатураПрисоединенныеФайлы.Наименование КАК Наименование
    |ИЗ
    | Справочник.НоменклатураПрисоединенныеФайлы КАК НоменклатураПрисоединенныеФайлы
    |ИТОГИ ПО
    | Номенклатура
    |»;

    ВыборкаНоменклатура = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, «Номенклатура»);
    Пока ВыборкаНоменклатура.Следующий() Цикл

    ВыборкаКартинки = ВыборкаНоменклатура.Выбрать();
    Пока ВыборкаКартинки.Следующий() Цикл

    КонецЦикла;

    КонецЦикла;

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *