Правильный способ обращения к реквизитам
Хочу понять, как лучше вывести комплект и количество комплектов - через ссылку, или с помощью параметров? Я читал, что получение полей через точку от других полей не желательно.
ВЫБРАТЬ
СборкаСписокНоменклатуры.Ссылка.Комплект КАК Комплект,
СУММА(СборкаСписокНоменклатуры.Ссылка.Количество) КАК КоличествоКомплектов,
СборкаСписокНоменклатуры.Номенклатура КАК Номенклатура,
СУММА(СборкаСписокНоменклатуры.Количество) КАК Количество
ПОМЕСТИТЬ втТЧТовары
ИЗ
Документ.Сборка.СписокНоменклатуры КАК СборкаСписокНоменклатуры
ГДЕ
СборкаСписокНоменклатуры.Ссылка = &Ссылка
СГРУППИРОВАТЬ ПО
СборкаСписокНоменклатуры.Номенклатура,
СборкаСписокНоменклатуры.Ссылка.Комплект
ИНДЕКСИРОВАТЬ ПО
Комплект,
Номенклатура
Ответы (1 шт):
В данном случае ваш запрос адекватный и не содержит каких-либо мест, которые следовало бы оптимизировать.
Я читал, что получение полей через точку от других полей не желательно
Получение полей через точку (ещё это называют "разыменованием") в запросе не рекомендуется, если у вас поле составного типа. Потому что разыменование приводит к неявному соединению таблиц. Например, представим гипотетически, поле "Ссылка" имеет составной тип (хоть в вашем примере такого и не может быть) и может содержать ссылку на Документ1, Документ2, Документ3.
Тогда строчка:
СУММА(СборкаСписокНоменклатуры.Ссылка.Количество)
неявно будет создавать три левых соединения с этими документами. То есть, понимаем, что будет если вместо 3-х там будет 50 документов.
Но у меня ощущение, что вы спутали рекомендацию касаемо разыменования, которая относится просто к коду, а не в контексте языка запросов. Там суть в том, что не рекомендуется получать через точку значения реквизитов от ссылки. Например:
Контрагент = ДокументСборка.Контрагент;
Потому что для того, чтобы получить значение контрагента, платформа неявно считает весь объект (ДокументСборка) из БД. А что, если у документа будет добрая пачка реквизитов штук на N-цать и ещё в придачу тележка табличных частей? Она всё это будет грузить. Поэтому рекомендуется получать значения свойств от ссылки с помощью запросов. В типовых конфигурациях на базе БСП для этого существуют в общем модуле "ОбщегоНазначения" удобные методы "ЗначениеРеквизитаОбъекта() и "ЗначенияРеквизитовОбъектов()".
Контрагент = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ДокументСборка, "Контрагент");