Запрос внутри цикла по строкам табличной части документа
Заполнение цен в документе реализовано так:
Для Каждого Строка Из Объект.Товары Цикл
Запрос.УстановитьПараметр("Номенклатура", Строка.Номенклатура);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Строка.Цена = Выборка.Цена;
КонецЕсли;
КонецЦикла;
В документах закупки бывает до 2000 строк, заполнение занимает несколько минут и подвешивает сеанс.
Что нужно изменить в первую очередь?
- Обернуть цикл в явную транзакцию: обращения к базе тогда уйдут одним пакетом, и накладные расходы на каждый отдельный запрос исчезнут
- Выполнить один запрос: передать в него табличную часть параметром, получить цены для всех строк сразу и разложить результат по строкам
- Отсортировать табличную часть по номенклатуре, чтобы сервер переиспользовал план запроса
- Перенести цикл на клиент, чтобы разгрузить сервер приложений
