Ответ вслух Junior Производительность спрашивают часто обновлено

Почему тормозит обращение через точку

Вопрос

Объясните, почему код с обращениями через точку в цикле работает медленно и как его переписать.

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Когда во встроенном языке пишем Строка.Номенклатура.ВидНоменклатуры, платформа читает из базы весь объект номенклатуры, чтобы взять одно поле. В цикле по тысяче строк это тысяча чтений.

Что должно прозвучать в ответе

  • Каждое обращение к реквизиту ссылки читает объект целиком

  • В цикле это тысячи отдельных обращений к базе

  • Переписать одним запросом со всеми нужными полями

  • Для одиночных случаев функции БСП ЗначениеРеквизитаОбъекта

  • Сначала замерить, чтобы убедиться, что проблема здесь

Что могут спросить следом

  • Чем это отличается от точки в тексте запроса?
  • Есть ли кеш объектов?

Разбор

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

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме