Приветствую, Форумчане!
УФ, учебная задача
В процедуре проведения в регистре накопления документа использую следующий код:
Сама функция ПроверкаНаНаличие(Выборка.Номенклатура, Количество) большая с большим запросом
В этой функции есть операции добавления в ТЗ
Джедай написал, что это плохо использовать запрос в цикле, в частности претензии по
ВыборкаЗапрос.Номенклатура.ЭтоКомплект;
Неужели в запросе "ВыборкаЗапрос" реквизит "ЭтоКомплект" выводит в отдельную колонку? разъясните смысл ошибки и как с этим справится?
УФ, учебная задача
В процедуре проведения в регистре накопления документа использую следующий код:
Пока Выборка.Следующий Цикл
..................
КритерийОтказа = ПроверкаНаНаличие(Выборка.Номенклатура, Количество);
Отказ = КритерийОтказа.ОтказДа;
..................
Сама функция ПроверкаНаНаличие(Выборка.Номенклатура, Количество) большая с большим запросом
В этой функции есть операции добавления в ТЗ
ТК = ТаблицаКомплектующих.Добавить();
.......
ТК.Номенклатура = ВыборкаЗапрос.Номенклатура;
ТК.Комплект = ВыборкаЗапрос.Номенклатура.ЭтоКомплект;
....................
Джедай написал, что это плохо использовать запрос в цикле, в частности претензии по
ВыборкаЗапрос.Номенклатура.ЭтоКомплект;
Неужели в запросе "ВыборкаЗапрос" реквизит "ЭтоКомплект" выводит в отдельную колонку? разъясните смысл ошибки и как с этим справится?
По теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1)
У вас и так запрос, так нахера вы после запроса вытаскиваете реквизит номенклатуры через точку, если можно в запросе сразу его получить?
При получении реквизита через точку в память считывается весь объект. В данном случае это бессмысленный расход ресурсов.
Джедай написал, что это плохо использовать запрос в цикле, в частности претензии по
ВыборкаЗапрос.Номенклатура.ЭтоКомплект;
ВыборкаЗапрос.Номенклатура.ЭтоКомплект;
У вас и так запрос, так нахера вы после запроса вытаскиваете реквизит номенклатуры через точку, если можно в запросе сразу его получить?
При получении реквизита через точку в память считывается весь объект. В данном случае это бессмысленный расход ресурсов.
Есть один большой секрет. Только чур никому!
Так вот. Если вопросов к производительности нет и работает все правильно, можно оставить как есть. Совершенно неважно, как там запрос или его вообще нет, никто никогда этого не увидит.
Только тс-с-с-с!
Так вот. Если вопросов к производительности нет и работает все правильно, можно оставить как есть. Совершенно неважно, как там запрос или его вообще нет, никто никогда этого не увидит.
Только тс-с-с-с!
Есть еще один кусок кода проведения документа поступления товара. Сделал классикой по учебнику с помощью помощника...
Это тоже Запрос в цикле? И как здесь тогда бороться? Выводить новый реквизит в ТЧ "Товары" - "ЭтоКомплект"?
Или Делать запрос к табличной части "Товары", там получать "ЭтоКомплект" и потом делать обход по запросу?
Для Каждого СТР Из Товары Цикл
Движение = Движения.ОстаткиНоменклатуры.Добавить();
Движение.Номенклатура = СТР.Номенклатура;
Движение.Комплект = СТР.Номенклатура.ЭтоКомплект;
Это тоже Запрос в цикле? И как здесь тогда бороться? Выводить новый реквизит в ТЧ "Товары" - "ЭтоКомплект"?
Или Делать запрос к табличной части "Товары", там получать "ЭтоКомплект" и потом делать обход по запросу?
(8)
Да, в типовых так и делается.
Запрос в цикле, да если еще цикл на большое количество итераций да в обработке проведения - считается очень большим злом.
Суть в том, что работа с базой данных - обычно самое узкое место в 1С и по производительности и по масштабируемости (возможностям параллельной работы в том числе). Даже простые запросы имеют ощутимые накладные расходы. А цикл умножает эту беду на количество итераций, что особенно печально в части масштабируемости. Ибо общая производительность будет падать пропорционально количеству итераций. Другими словами кроме текущей плохой эффективности это может сработать еще и как мина замедленного действия, если характер работы с конфигурацией приведет к увеличению количества итераций.
В запущенных случаях избавление от запросов в цикле дает прирост производительности даже не в разы, а в десятки и сотни раз.
А обращение через точку даже в единичных случаях бывает не очень хорошо. Потому что само по себе оно выполняется не очень оптимально - при этом вычитывается весь объект (вместе с табличными частями), а не только требуемый реквизит (зато на некоторое время этот объект кэшируется и повторное обращение к нему уже не вызовет запроса к базе данных). Чем "тяжелее" объект, тем менее эффективно будет обращаться к нему через точку за значением его реквизита. Поэтому в типовых есть специальные функции, которые вместо обращения через точку получают нужный реквизит явным запросом.
ЗЫ. А вы думали - вводный учебник прошли и можно промышленные базы программировать? :)
Или Делать запрос к табличной части "Товары", там получать "ЭтоКомплект" и потом делать обход по запросу?
Да, в типовых так и делается.
Запрос в цикле, да если еще цикл на большое количество итераций да в обработке проведения - считается очень большим злом.
Суть в том, что работа с базой данных - обычно самое узкое место в 1С и по производительности и по масштабируемости (возможностям параллельной работы в том числе). Даже простые запросы имеют ощутимые накладные расходы. А цикл умножает эту беду на количество итераций, что особенно печально в части масштабируемости. Ибо общая производительность будет падать пропорционально количеству итераций. Другими словами кроме текущей плохой эффективности это может сработать еще и как мина замедленного действия, если характер работы с конфигурацией приведет к увеличению количества итераций.
В запущенных случаях избавление от запросов в цикле дает прирост производительности даже не в разы, а в десятки и сотни раз.
А обращение через точку даже в единичных случаях бывает не очень хорошо. Потому что само по себе оно выполняется не очень оптимально - при этом вычитывается весь объект (вместе с табличными частями), а не только требуемый реквизит (зато на некоторое время этот объект кэшируется и повторное обращение к нему уже не вызовет запроса к базе данных). Чем "тяжелее" объект, тем менее эффективно будет обращаться к нему через точку за значением его реквизита. Поэтому в типовых есть специальные функции, которые вместо обращения через точку получают нужный реквизит явным запросом.
ЗЫ. А вы думали - вводный учебник прошли и можно промышленные базы программировать? :)
Для Каждого СТР Из Товары Цикл
Движение = Движения.ОстаткиНоменклатуры.Добавить();
Движение.Номенклатура = СТР.Номенклатура;
Движение.Комплект = СТР.Номенклатура.ЭтоКомплект;
Ну неужели из-за одного реквизита создавать запрос для обхода?
А такой вариант будет нормальным?
Движение.Комплект = ПолучитьЗначениереквизита(СТР.Номенклатура);
&НаСервере
Функция ПолучитьЗначениереквизита(Номенклатура)
Возврат Номенклатура.ЭтоКомплект;
КонецФункции
(14)Представьте, что вам нужно войти в комнату, где сидит 10 человек и узнать возраст каждого. Ваш вариант-зайти в комнату-спросить возраст первого-выйти из комнаты. И так 10 раз. А запрос - зайти 1 раз и у всех сразу спросить возраст. Может быть в первом варианте вы и не сильно устанете, но что, если комнат 1000 и в каждой по тысяче человек?)
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот