1C-CodeКак сделать → Как избавиться от запроса в цикле в 1С

Запрос в цикле в 1С — чем заменить

Заменить тысячу маленьких запросов одним большим: передать список значений параметром и получить всё нужное разом, а потом искать в результате.

Код

// было: запрос на каждой итерации
Для Каждого Строка Из Товары Цикл
	// ... Запрос.Выполнить() ...
КонецЦикла;

// стало: один запрос на всё
Запрос = Новый Запрос(
	"ВЫБРАТЬ Цены.Номенклатура, Цены.Цена
	|ИЗ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&НаДату, ) КАК Цены
	|ГДЕ Цены.Номенклатура В (&СписокТоваров)");
Запрос.УстановитьПараметр("НаДату", КонецДня(Дата));
Запрос.УстановитьПараметр("СписокТоваров", Товары.ВыгрузитьКолонку("Номенклатура"));

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

Что здесь важно

1. Дорог не запрос, а поход в базу

Каждое обращение — это подготовка, отправка, ожидание и разбор ответа. Тысяча обращений по три миллисекунды — это три секунды на пустом месте, причём под блокировками.

2. Список передаётся параметром

ВыгрузитьКолонку у таблицы значений отдаёт массив, и он кладётся в параметр напрямую. Склеивать значения в текст запроса не нужно и вредно.

3. Соответствие вместо повторного поиска

Разложив результат в Соответствие, вы ищете по ключу за одинаковое время при любом объёме. Поиск перебором по таблице внутри цикла даёт квадрат — вторую беду того же рода.

Где обычно спотыкаются

Если позиций много — десятки тысяч, — параметр-список сам становится тяжёлым. Тогда данные кладут во временную таблицу через ПОМЕСТИТЬ и соединяют с ней прямо в запросе. Это и есть штатный способ обработать много строк за один раз.

Задача на это. Прочитать приём и применить его — разные умения. В тренажёре есть задача «Убрать запрос из цикла»: переписать код так, чтобы вместо тысячи обращений к базе осталось одно. Проверяется не только ответ, но и число походов в базу. Решение проверяется скрытыми тестами, в том числе на краевых случаях, о которых в условии не сказано.

Решить задачу

Разобраться глубже

Другие вопросы

Как получить остатки на дату запросом в 1С Как программно провести документ в 1С Как добавить колонку в таблицу значений программно Как свернуть таблицу значений Как найти строку в таблице значений Как выгрузить колонку таблицы значений в массив Как превратить массив в таблицу значений Как передать таблицу значений с сервера на клиент Как отобрать строки в таблице значений Как отсортировать таблицу значений Как записать движения регистра накопления программно Чем регистр остатков отличается от регистра оборотов Как контролировать остатки при проведении документа Как добавить реквизит расширением конфигурации Как сравнить две таблицы значений Какие бывают соединения в запросе 1С и чем отличаются Как выгрузить таблицу значений в Excel Чем дерево значений отличается от таблицы значений Как задать условное оформление таблицы на форме