Обращение к стандартному реквизиту регистра составного типа без использования конструкции Выразить или с неверным использованием Выразить
Обращение к реквизитам составного регистратора регистра составного типа без использования конструкции Выразить
В случаях, когда у регистра существуют несколько документов-регистраторов, критически важно не использовать в полях выборки запроса простое обращение к регистратору через выражение ТаблицаРегистра.Регистратор.Поле
Например:
- у регистра накопления
РегистрНакопленияНесколькоРегистраторов
существуют 2 документа, регистрирующие в нём движения -документ1
идокумент2
.
В таком случае текст запроса:
Неправильный
ВЫБРАТЬ
РегистрНакопленияНесколькоРегистраторов.Регистратор.Дата КАК ДатаРегистратора
ИЗ
РегистрНакопления.РегистрНакопленияНесколькоРегистраторов КАК РегистрНакопленияНесколькоРегистраторов
Также не очень корректный вариант - из-за возможности неявного получения NULL
для документа другого типа.
ВЫБРАТЬ
ВЫРАЗИТЬ(РегистрНакопленияНесколькоРегистраторов.Регистратор КАК Документ.Документ1).Дата КАК ДатаРегистратора
ИЗ
РегистрНакопления.РегистрНакопленияНесколькоРегистраторов КАК РегистрНакопленияНесколькоРегистраторов
Правильный
ВЫБРАТЬ
КОГДА РегистрНакопленияНесколькоРегистраторов.Регистратор ССЫЛКА Документ.Документ1
ТОГДА ВЫРАЗИТЬ(РегистрНакопленияНесколькоРегистраторов.Регистратор КАК Документ.Документ1).Дата
КОГДА РегистрНакопленияНесколькоРегистраторов.Регистратор ССЫЛКА Документ.Документ2
ТОГДА ВЫРАЗИТЬ(РегистрНакопленияНесколькоРегистраторов.Регистратор КАК Документ.Документ2).Дата
КОНЕЦ КАК ДатаРегистратора
ИЗ
РегистрНакопления.РегистрНакопленияНесколькоРегистраторов КАК РегистрНакопленияНесколькоРегистраторов
Однако в целом - разработчику, который хочет выполнить выборку типового поля регистратор в запросе, стоит помнить, что данное поле предназначено для организации отборов по документу, осуществившему движение, а не для аналитических отчетов и алгоритмов.
Согласно сертификации "Специалист 1С" по платформе 1С:Предприятие 8.x документ обязан совершить свои движения и отразить все необходимые ресурсы и измерения в регистрах, после чего его функция завершена.
Все аналитические отчеты должны оперировать наборами записей регистров, агрегатами и другими виртуальными таблицами.
При разработке структуры регистров необходимо придерживаться правила, что регистр должен быть логически независим от регистраторов. Любая логика, опирающаяся или анализирующая данные регистра, а также любые отчеты по этому регистру не должны обращаться к полям регистратора, им должно быть достаточно данных самого регистра.
Обращение к полям регистратора "через точку" приводит к неявному соединению с дополнительными таблицами.
Кроме того, в распределенной информационной базе регистратора может и не быть, если движения в регистрах мигрируют между узлами, а регистраторы - нет.
См. также
- в статье "Получение данных через точку от полей составного типа" в разделе технологических вопросов крупных внедрений
- в разделе "Оптимизация запросов" в стандартах ИТС
- в разделе "Самодостаточность регистров"
- в статье "Разыменование ссылочных полей составного типа в языке запросов"
Экранирование кода
// sonar:CompositePropsInTheQuery:off
// sonar:CompositePropsInTheQuery:on