Почему тормозит обращение через точку
Вопрос
Объясните, почему код с обращениями через точку в цикле работает медленно и как его переписать.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Каждое обращение к реквизиту ссылки читает объект целиком
В цикле это тысячи отдельных обращений к базе
Переписать одним запросом со всеми нужными полями
Для одиночных случаев функции БСП ЗначениеРеквизитаОбъекта
Сначала замерить, чтобы убедиться, что проблема здесь
Что могут спросить следом
- Чем это отличается от точки в тексте запроса?
- Есть ли кеш объектов?
Разбор
Когда во встроенном языке пишем Строка.Номенклатура.ВидНоменклатуры, платформа читает из базы весь объект номенклатуры, чтобы взять одно поле. В цикле по тысяче строк это тысяча чтений. У платформы есть кратковременный кеш объектов, но на него полагаться нельзя. Переписываю одним запросом: передаю табличную часть параметром или кладу во временную таблицу и соединяю со справочником, получая все нужные поля сразу. Если нужен один-два реквизита одной ссылки, использую ОбщегоНазначения.ЗначенияРеквизитовОбъекта. До переписывания замеряю, чтобы оптимизировать то, что действительно тормозит.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.