Перейти к содержанию
#std654

Разыменование ссылочных полей составного типа в языке запросов

1.1.

В языке запросов можно обращаться не только к полям таблиц из раздела ИЗ, но и к полям объектов, на которые ссылаются ссылочные поля.

Обращение к полям через точку (ПолеСсылка.Реквизит) добавляет неявные соединения с дополнительными таблицами.

Это относится и к ограничениям доступа на уровне записей (RLS): в запрос могут добавляться таблицы, участвующие в проверках прав к неявно подключенным объектам.

Пример

ВЫБРАТЬ
    ТоварныеЗапасы.Товар КАК Товар,
    ТоварныеЗапасы.Количество КАК Количество,
    ТоварныеЗапасы.Товар.Артикул КАК Артикул
ИЗ
    РегистрНакопления.ТоварныеЗапасы КАК ТоварныеЗапасы
1.2.

Чем больше неявных соединений, тем сложнее и медленнее запрос.

Особенно это критично для ссылочных полей #std728: составного типа: платформа может соединять запрос со всеми таблицами, которые входят в состав типа, а также с таблицами из RLS этих объектов.

Неправильно

ВЫБРАТЬ
    ТоварныеЗапасы.Регистратор.Дата КАК ДатаРегистратора
ИЗ
    РегистрНакопления.ТоварныеЗапасы КАК ТоварныеЗапасы

Подобное получение данных через точку от ссылочных полей составного типа крайне нежелательно. Каждое исключение из этого правила нужно отдельно анализировать.

2.1.

Избегайте избыточных составных типов ссылочных полей.

Указывайте только те типы ссылок, которые действительно нужны бизнес-логике. Без необходимости не применяйте варианты вида «любая ссылка».

Сначала анализируйте прикладную логику, затем оставляйте только реально используемые типы.

2.2.

Чтобы не строить запросы с большим числом соединений, жертвуйте компактностью хранения данных ради производительности и переносите нужные поля в исходную таблицу запроса.

Например, можно добавить в регистр реквизит ДатаРегистратора, заполнять его при проведении и использовать в запросах напрямую.

Правильно

ВЫБРАТЬ
    ТоварныеЗапасы.ДатаРегистратора
ИЗ
    РегистрНакопления.ТоварныеЗапасы КАК ТоварныеЗапасы

Это приведет к дублированию данных и небольшому росту объема хранения, но может существенно повысить производительность и стабильность запроса.

2.3.

При необходимости жертвуйте компактностью и универсальностью кода ради производительности.

  • Для конкретного запроса обычно не нужны все возможные типы составной ссылки. Ограничивайте их через ВЫРАЗИТЬ.
  • Если один и тот же запрос используется в разных сценариях, формируйте его текст динамически и подставляйте в ВЫРАЗИТЬ нужный тип в зависимости от контекста.

Это увеличит объем кода и может снизить универсальность, но обычно заметно повышает производительность и стабильность.

Неправильно

ВЫБРАТЬ
    Продажи.Регистратор.Номер КАК Номер,
    Продажи.Регистратор.Дата КАК Дата,
    Продажи.Контрагент КАК Контрагент,
    Продажи.Количество КАК Количество,
    Продажи.Стоимость КАК Стоимость
ИЗ
    РегистрНакопления.Продажи КАК Продажи
ГДЕ
    ...

В этом примере поле Регистратор может быть ссылкой на один из десятков типов документов. В таком случае SQL-текст развернется в большое число соединений (в исходном стандарте показан пример с 56 соединениями), что резко ухудшает производительность.

Правильно

ВЫБРАТЬ
    ВЫБОР
        КОГДА Продажи.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг
            ТОГДА ВЫРАЗИТЬ(Продажи.Регистратор КАК Документ.РеализацияТоваровУслуг).Номер
        КОГДА Продажи.Регистратор ССЫЛКА Документ.ЗаказПокупателя
            ТОГДА ВЫРАЗИТЬ(Продажи.Регистратор КАК Документ.ЗаказПокупателя).Номер
    КОНЕЦ КАК Номер,
    ВЫБОР
        КОГДА Продажи.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг
            ТОГДА ВЫРАЗИТЬ(Продажи.Регистратор КАК Документ.РеализацияТоваровУслуг).Дата
        КОГДА Продажи.Регистратор ССЫЛКА Документ.ЗаказПокупателя
            ТОГДА ВЫРАЗИТЬ(Продажи.Регистратор КАК Документ.ЗаказПокупателя).Дата
    КОНЕЦ КАК Дата,
    Продажи.Контрагент КАК Контрагент,
    Продажи.Количество КАК Количество,
    Продажи.Стоимость КАК Стоимость
ИЗ
    РегистрНакопления.Продажи КАК Продажи
ГДЕ
    Продажи.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг
    ИЛИ Продажи.Регистратор ССЫЛКА Документ.ЗаказПокупателя

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

См. также
Проверки

#acc:1377

Источник

https://its.1c.ru/db/v8std#content:654