Запрос в цикле - это плохо?

1. Painted 49 20.10.22 10:21 Сейчас в теме
Нашел кусок кода в УПП в Расчетном листке. Внутри цикла вызывается общий модуль, а в общем модуле вполне себе запрос. И да, там не просто цикл, а цикл в цикле в цикле в цикле.
Хочется спросить у 1С, что там со стандартами разработки?
Прикрепленные файлы:
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
4. SlavaKron 20.10.22 10:42 Сейчас в теме
(1) Плохо, если это заметно влияет на производительность.
13. Sashares 35 20.10.22 12:43 Сейчас в теме
(1)А модуль ОбщегоНазнченияЗК повторного использования?
15. Painted 49 20.10.22 13:48 Сейчас в теме
16. Sashares 35 20.10.22 14:11 Сейчас в теме
(15)Ну, можно было бы конечно оптимизировать, используя соответствие.
Но тут стоит хотя бы замер производительности сделать, чтобы посмотреть, на сколько это вообще влияет.
22. user1826630 20.10.22 16:08 Сейчас в теме
(16)
Ну, можно было бы конечно оптимизировать, используя соответствие.
Как? Если в запросе условие остановлено в "="?
24. Sashares 35 20.10.22 16:13 Сейчас в теме
(22)Объявляем соответствие до цикла.
Ключ соответствия параметр запроса, в данном случае Организация. Если для ключа есть значение - значит запрос не нужен, если значения нет, делаем запрос, добавляем результат в соответствие.
25. user1826630 20.10.22 16:15 Сейчас в теме
(24)
Объявляем соответствие до цикла.
Каким образом? Еще одним запросом по головным организациям?
26. Sashares 35 20.10.22 16:21 Сейчас в теме
(25) Можно просто пустое. Соответствие это как кэш для значений, чтобы для уже ранее полученных результатов не выполнять повторно получение данных запросом. Т.к. вряд ли там так уж много организаций будет. Зато запрос на каждую итерацию выполняться не будет, и правки кода минимальные.

СоответствиеГО = Новый Соответствие;
тут циклы
...

ТекГоловнаяОрганизация = СоответствиеГО[Выплачено.Строки[СЧ].Организация];
Если ТекГоловнаяОрганизация  = Неопределено Тогда
ТекГоловнаяОрганизация = ОбщегоНазначенияБК.ГоловнаяОрганизация(Выплачено.Строки[СЧ].Организация);
СоответствиеГО.Вставить(Выплачено.Строки[СЧ].Организация,ТекГоловнаяОрганизация );
КонецЕсли;
...
Показать
27. user1826630 20.10.22 16:25 Сейчас в теме
28. SlavaKron 20.10.22 16:34 Сейчас в теме
(27) Какая разница что там внутри функции ОбщегоНазначенияБК.ГоловнаяОрганизация? Кеширование через соответствие – это универсальная реализация "ленивого" кеша. Как если бы модуль ОбщегоНазначенияБК был с повторным использованием.
starik-2005; +1 Ответить
29. user1826630 20.10.22 16:35 Сейчас в теме
(28) Конечно. Но она тоже подразумевает лишний запрос.

Я ж не спорю. Лично у меня половина алгоритмов строится на ленивом кэше.

Но это не отменяет того, что.
31. Painted 49 21.10.22 07:39 Сейчас в теме
(16)
Но тут стоит хотя бы замер производительности сделать, чтобы посмотреть, на сколько это вообще влияет.

Сделал. Примерно 400 сотрудников.
Прикрепленные файлы:
32. SlavaKron 21.10.22 09:03 Сейчас в теме
(31) Да уж, не очень хорошо. Я бы исправил в расширении. Еще интересно чего это там в первой про затратам строчке?
33. Painted 49 21.10.22 09:16 Сейчас в теме
(32)
 КоличествоСтраниц = ТабличныйДокументДляПроверки.КоличествоСтраниц();

Процедура "ЗадатьИменаОбластямРазбитьТабличныйДокументПоСтраницам", там перед выводом каждой расчетки идет проверка, влезает ли он на этот лист или лучше перенести на следующий.
14. spacecraft 20.10.22 13:08 Сейчас в теме
(1) на самом деле, нельзя рассматривать запросы в цикле, как отдельный механизм.
Запросы в цикле, скажем сложного запроса и обсуждаемого простого запроса, это две большие разницы.
Как правило, при повторном запросе, будет использоваться кеш плана запроса и при простом запросе, получение данных не будет сколь либо заметно нагружать sql сервер.
Во многих других ЯП вообще не стоит остро вопрос запросов в цикле. В разумных пределах.
17. sergling 34 20.10.22 14:15 Сейчас в теме
(14) Да, у компов памяти "дож..ы" чего ее экономить, кэш на то и кэш, пусть за нас кэширует, а мы чего-нить напишем. Это относится к любому ЯП, можно быстро разработать и медленно работать, а можно наоборот. Конечно всегда можно докупить процессоров и памяти. И да, согласен что ко всему нужен взвешенный подход, я не фанатик оптимизации, но иногда кровь из глаз как заметил автор.
18. spacecraft 20.10.22 14:41 Сейчас в теме
(17) причем тут экономия памяти и кэш плана выполнения запроса?
Кэш плана делается в любом случае, используете его в дальнейшем или нет. Он делается всегда.
34. sergling 34 21.10.22 10:53 Сейчас в теме
(18) Притом что размер кэша не резиновый и его может заместить что-то другое. Т.е. нет памяти - нет кэша. Если наш запрос в цикле будет работать час и совершает миллион запросов в цикле, то сколько раз он сможет воспользоваться кэшем при недостаточном его размере. А при этом у нас будет тыща пользователей гоняющих этот запрос в этом цикле с чуть разными начальными условиями - хватит на всех кэша?
35. spacecraft 21.10.22 10:55 Сейчас в теме
(34) Вы утрируете. Вот совсем.
2. user1203706 14 20.10.22 10:25 Сейчас в теме
(1) если получение головной организации идёт в модуле повторного использования, то пофиг
3. Painted 49 20.10.22 10:40 Сейчас в теме
(2) Не
Прикрепленные файлы:
5. user1826630 20.10.22 10:58 Сейчас в теме
Не помню, чтобы в стандартах 1С было какое-то ограничение на запросы в цикле.
6. Zevzm 20.10.22 11:06 Сейчас в теме
(5) Белоусов на своих курсах все время говорит, что запрос в цикле это минус 2 балла на экзамене по специалисту:

Получение информации, хранящейся в информационной базе, (остатков, оборотов, данных базы, данных графика и т.п.) в цикле (2.0)

Здесь речь про запрос в цикле. Единственное место где он «разрешается» это расчет по приоритетам в задачах по сложным периодическим расчетам. Но, это достаточно специфическое место, и только условно можно сказать что там запрос в цикле.
8. user1826630 20.10.22 11:15 Сейчас в теме
(6) Да, конечно. Это огромный минус.
Но именно в стандартах - нет такого ограничения.
Автор задается неверным вопросом. Надо задаваться вопросом не про стандарты, а про контроль качества.
10. user1826630 20.10.22 11:23 Сейчас в теме
(9) Так это рекомендация. А в стандартах есть еще и прямые запреты.
На запросы в цикле запретов нет.

Вот пример запрета (п. 3.2) https://its.1c.ru/db/v8std#content:487:hdoc
7. starjevschik 20.10.22 11:09 Сейчас в теме
1c свои правила нарушает всегда. Впрочем только ли 1с так делает.
А запрос в цикле - смотреть надо по месту. В каких-то случаях это вполне нормально. 1с это чисто прикладные программы, единственный важный критерий - чтобы работало правильно.
11. meriferi 20.10.22 11:26 Сейчас в теме
Очень плохо и не оптимально
12. user1826630 20.10.22 11:28 Сейчас в теме
В данном случае мы не видим, откуда берется переменная Выплачено. Может она тоже изменяется по ходу алгоритма - в ней появляются новые строки, и для такой новой строки вполне естественно выполнять новый же запрос.

Так бывает - не всегда можно изначально получить весь массив параметров для подстановки в запрос.

А вот тот факт, что запрос в функции ГоловнаяОрганизация() предполагает использование только единичного параметра (а не массива) - вот тут есть о чем поспорить. Наверное в данном случае имело бы смысл иметь еще одну функцию типа СоответствиеГоловныхОрганизаций(МассивПараметров).
19. fixin 4273 20.10.22 14:47 Сейчас в теме
(1) ко всему нужно подходить без фанатизма. Если участок не критичный и запрос в цикле экономит время разработки, то почему бы и нет. Жаль, специалисты аудита фреша не всегда понимают принцип разумности.
21. user1826630 20.10.22 16:06 Сейчас в теме
(19) А где можно ознакомиться с требованиями Фреша по поводу запросов в цикле?
20. Vanch90 20.10.22 15:52 Сейчас в теме
Был где-то в коде типовом erp комментарий при запросе в цикле "проверено работает быстрее")
36. starik-2005 3087 21.10.22 12:19 Сейчас в теме
(20) Видимо решение "в лоб" без цикла не принесло значимых результатов за незначимое время.

Запрос в цикле - это смена контекста, когда одно приложение (1С) начинает ждать другое приложение (SQL). При смене контекста меняется и ядро (если их больше одного, но сейчас редко бывает иначе), на котором выполняется код. И "новое" ядро с новым процессом, которое не было наверное до этого загружено, начинает медленно (с точки зрения процессора с его миллиардами операций в секунду) и верно разгоняться, заполнять кеш третьего, потом второго, в потом и первого уровня данными и кодом, вычитывая из памяти и платя циклами простоя (если нет другой нагрузки, которая эти циклы может утилизировать в SMT) за ожидание данных из памяти.

В общем смена контекста выполнения - это нехорошо. Но 1С - это не хайлоад, а 1С-неги - это недопрограммисты, поэтому им можно делать любую дичь - контора купит сервер помощнее если что, а задача будет решена уже сегодня. Технический же долг будет решен переходом с кастомизированной УПП на ЕРП. Профит!
23. XAKEP 20.10.22 16:11 Сейчас в теме
если запрос не нашел нужного реквизита,
а разраб не предусмотрел выход из цикла в случае ошибки или повторном запуске на то же условие

думаю тогда это " нехватает ресурсов, зависает, тормозит " и т.д.


ну и если реквизит изменился во время работы цикла :)
30. muskul 21.10.22 03:16 Сейчас в теме
Это фигня. вот заполнение какой нибудь таблицы для выгрузки на весы, где построчно делается запрос на ШК, Упаковки и остатки, вот это дичь
37. starik-2005 3087 21.10.22 12:22 Сейчас в теме
(30)
это дичь
Это слесарь 1С.
38. muskul 23.10.22 08:58 Сейчас в теме
(37)В типовой торговле кстати похоже работает механизм пересчет строки. в цикле строк подзапросы на единицы и коэффициенты
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот