Нашел кусок кода в УПП в Расчетном листке. Внутри цикла вызывается общий модуль, а в общем модуле вполне себе запрос. И да, там не просто цикл, а цикл в цикле в цикле в цикле.
Хочется спросить у 1С, что там со стандартами разработки?
(15)Ну, можно было бы конечно оптимизировать, используя соответствие.
Но тут стоит хотя бы замер производительности сделать, чтобы посмотреть, на сколько это вообще влияет.
(22)Объявляем соответствие до цикла.
Ключ соответствия параметр запроса, в данном случае Организация. Если для ключа есть значение - значит запрос не нужен, если значения нет, делаем запрос, добавляем результат в соответствие.
(25) Можно просто пустое. Соответствие это как кэш для значений, чтобы для уже ранее полученных результатов не выполнять повторно получение данных запросом. Т.к. вряд ли там так уж много организаций будет. Зато запрос на каждую итерацию выполняться не будет, и правки кода минимальные.
СоответствиеГО = Новый Соответствие;
тут циклы
...
ТекГоловнаяОрганизация = СоответствиеГО[Выплачено.Строки[СЧ].Организация];
Если ТекГоловнаяОрганизация = Неопределено Тогда
ТекГоловнаяОрганизация = ОбщегоНазначенияБК.ГоловнаяОрганизация(Выплачено.Строки[СЧ].Организация);
СоответствиеГО.Вставить(Выплачено.Строки[СЧ].Организация,ТекГоловнаяОрганизация );
КонецЕсли;
...
(27) Какая разница что там внутри функции ОбщегоНазначенияБК.ГоловнаяОрганизация? Кеширование через соответствие – это универсальная реализация "ленивого" кеша. Как если бы модуль ОбщегоНазначенияБК был с повторным использованием.
Процедура "ЗадатьИменаОбластямРазбитьТабличныйДокументПоСтраницам", там перед выводом каждой расчетки идет проверка, влезает ли он на этот лист или лучше перенести на следующий.
(1) на самом деле, нельзя рассматривать запросы в цикле, как отдельный механизм.
Запросы в цикле, скажем сложного запроса и обсуждаемого простого запроса, это две большие разницы.
Как правило, при повторном запросе, будет использоваться кеш плана запроса и при простом запросе, получение данных не будет сколь либо заметно нагружать sql сервер.
Во многих других ЯП вообще не стоит остро вопрос запросов в цикле. В разумных пределах.
(14) Да, у компов памяти "дож..ы" чего ее экономить, кэш на то и кэш, пусть за нас кэширует, а мы чего-нить напишем. Это относится к любому ЯП, можно быстро разработать и медленно работать, а можно наоборот. Конечно всегда можно докупить процессоров и памяти. И да, согласен что ко всему нужен взвешенный подход, я не фанатик оптимизации, но иногда кровь из глаз как заметил автор.
(17) причем тут экономия памяти и кэш плана выполнения запроса?
Кэш плана делается в любом случае, используете его в дальнейшем или нет. Он делается всегда.
(18) Притом что размер кэша не резиновый и его может заместить что-то другое. Т.е. нет памяти - нет кэша. Если наш запрос в цикле будет работать час и совершает миллион запросов в цикле, то сколько раз он сможет воспользоваться кэшем при недостаточном его размере. А при этом у нас будет тыща пользователей гоняющих этот запрос в этом цикле с чуть разными начальными условиями - хватит на всех кэша?
(5) Белоусов на своих курсах все время говорит, что запрос в цикле это минус 2 балла на экзамене по специалисту:
Получение информации, хранящейся в информационной базе, (остатков, оборотов, данных базы, данных графика и т.п.) в цикле (2.0)
Здесь речь про запрос в цикле. Единственное место где он «разрешается» это расчет по приоритетам в задачах по сложным периодическим расчетам. Но, это достаточно специфическое место, и только условно можно сказать что там запрос в цикле.
(6) Да, конечно. Это огромный минус.
Но именно в стандартах - нет такого ограничения.
Автор задается неверным вопросом. Надо задаваться вопросом не про стандарты, а про контроль качества.
1c свои правила нарушает всегда. Впрочем только ли 1с так делает.
А запрос в цикле - смотреть надо по месту. В каких-то случаях это вполне нормально. 1с это чисто прикладные программы, единственный важный критерий - чтобы работало правильно.
В данном случае мы не видим, откуда берется переменная Выплачено. Может она тоже изменяется по ходу алгоритма - в ней появляются новые строки, и для такой новой строки вполне естественно выполнять новый же запрос.
Так бывает - не всегда можно изначально получить весь массив параметров для подстановки в запрос.
А вот тот факт, что запрос в функции ГоловнаяОрганизация() предполагает использование только единичного параметра (а не массива) - вот тут есть о чем поспорить. Наверное в данном случае имело бы смысл иметь еще одну функцию типа СоответствиеГоловныхОрганизаций(МассивПараметров).
(1) ко всему нужно подходить без фанатизма. Если участок не критичный и запрос в цикле экономит время разработки, то почему бы и нет. Жаль, специалисты аудита фреша не всегда понимают принцип разумности.
(20) Видимо решение "в лоб" без цикла не принесло значимых результатов за незначимое время.
Запрос в цикле - это смена контекста, когда одно приложение (1С) начинает ждать другое приложение (SQL). При смене контекста меняется и ядро (если их больше одного, но сейчас редко бывает иначе), на котором выполняется код. И "новое" ядро с новым процессом, которое не было наверное до этого загружено, начинает медленно (с точки зрения процессора с его миллиардами операций в секунду) и верно разгоняться, заполнять кеш третьего, потом второго, в потом и первого уровня данными и кодом, вычитывая из памяти и платя циклами простоя (если нет другой нагрузки, которая эти циклы может утилизировать в SMT) за ожидание данных из памяти.
В общем смена контекста выполнения - это нехорошо. Но 1С - это не хайлоад, а 1С-неги - это недопрограммисты, поэтому им можно делать любую дичь - контора купит сервер помощнее если что, а задача будет решена уже сегодня. Технический же долг будет решен переходом с кастомизированной УПП на ЕРП. Профит!