Как запросы в цикле экономят бюджет клиента
Всем известна почти религиозная вера сотрудников 1С в то, что запросы в цикле — это зло.
А на практике очень даже не зло.
Вот например я делал платежный календарь и мне нужно было понять, какая часть заказа оплачена.
Для этого я использовал функцию:
Функция ОпределитьСуммуОплатыДляПлана(Период, Заказ, СуммаПлан) Экспорт З = Новый Запрос( "ВЫБРАТЬ | ТК.СуммаОплатыОборот КАК СуммаОплаты |ИЗ | РегистрНакопления.ДвиженияДенежныеСредстваКонтрагент.Обороты(, &Дата2, , ОбъектРасчетов = &Заказ) КАК ТК"); //Проверяем факт до даты планового платежа З.УстановитьПараметр("Дата2", Период); З.УстановитьПараметр("Заказ", Заказ); СуммаОплаты = 0; Выборка = З.Выполнить().Выбрать(); Если Выборка.Следующий() Тогда СуммаОплаты = Выборка.СуммаОплаты; КонецЕсли; Если СуммаОплаты > 0 Тогда Результат = Макс(0, СуммаПлан - СуммаОплаты); Сообщить("По заказу: " + Заказ + " (" + Заказ.Партнер + ") плановая оплата: " + СуммаПлан + " уменьшена на факт оплаты: " + СуммаОплаты + " Остаток: " + XMLСтрока(Результат)); возврат Результат; КонецЕсли; Возврат СуммаПлан; КонецФункции
Понятно, что эта функция вызывается для каждой даты оплаты по заказу. Казалось бы зло и настоящий адепт «всё делать через запросы» должен написать один общий запрос по всем заказам.
Правда, 1С не умеет в запрос по оборотам с динамической границей периода, пришлось бы суммировать движения по условию.
По трудоемкости это заняло бы лишний час.
А что мы видим по замеру производительности?
Оказывается, вызовы запроса по заказам занимают мало времени. Всего полсекунды на 13 запросов. Если в день планируется в кредит 20 заказов, а отсрочка заказов 10 дней, там максимум 200 заказов будет в плане. Т.е. 20 секунд максимум.
Жаль, что не всегда это можно объяснить аудиторам Fresh, которые молятся на единые запросы, как на «святую корову». Но тут слава богу не Fresh.
В итоге такого религиозного фанатизма процедуры печати и проведения документов, например, тоже потеряли в прозрачности и стали собираться запросами, что привело к их усложнению. Не думаю, что выигрыш в скорости там оказался существенным.
Среда: УТ 11.4.13.46
А если планируется больше?
Мастерство программиста в выборе инструмента — что брать — лопату, самосвал или динамит.