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

Обращения к виртуальным таблицам

1.

Передавайте в параметры виртуальной таблицы все условия, относящиеся к ней. Не переносите такие условия в секцию ГДЕ.

Так запрос будет работать быстрее: СУБД сможет выбрать лучший план выполнения и не будет обрабатывать лишние записи.

Неправильно

ВЫБРАТЬ
    Номенклатура
ИЗ
    РегистрНакопления.ТоварыНаСкладах.Остатки()
ГДЕ
    Склад = &Склад

Правильно

ВЫБРАТЬ
    Номенклатура
ИЗ
    РегистрНакопления.ТоварыНаСкладах.Остатки(, Склад = &Склад)
2.1.

В параметрах виртуальной таблицы используйте простые условия вида Измерение = Значение. Не используйте подзапросы и соединения.

Примечание

Под соединениями понимаются:

  • явные соединения в подзапросах;
  • неявные соединения при обращении к полям через точку;
  • соединения, добавляемые из ограничений доступа к данным (RLS).
2.2.

Если подзапросы нужны, соблюдайте условия:

  • в подзапросе только одна таблица, без соединений с другими таблицами;
  • если таблица подзапроса - табличная часть, не обращайтесь к реквизитам шапки документа;
  • если таблица подзапроса - документ с табличными частями, не обращайтесь к табличным частям;
  • если таблица подзапроса - временная, не используйте раздел ГДЕ;
  • если таблица подзапроса - постоянная, раздел ГДЕ допустим только если условие выполняется в 80% случаев и более;
  • если таблица подзапроса - постоянная, в RLS не должно быть подзапросов и соединений (допустимы только простые условия).

Неправильно

...
ИЗ
РегистрНакопления.ТоварыКОтгрузке.Остатки(
    &ДатаОтгрузки,
    &ОтображениеРаспоряжений
    И ДокументОтгрузки.Склад = &Склад // (1)
    ИЛИ ДокументОтгрузки В
        (ВЫБРАТЬ // (2)
            Распоряжения.Распоряжение КАК ДокументОтгрузки
        ИЗ
            Документ.ЗаданиеНаПеревозку.Распоряжения КАК Распоряжения // (3)
            ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЗаданиеНаПеревозку.СкладыПогрузки КАК СкладыПогрузки
        ПО
            Распоряжения.Ссылка = СкладыПогрузки.Ссылка
            И СкладыПогрузки.Склад = &Склад
            И Распоряжения.Ссылка.Проведен // (4)
            И Распоряжения.Ссылка.Статус В (...)))
  1. Неявное соединение через точку
  2. Подзапрос с соединением
  3. Доступ к этому документу ограничен по сложному RLS, который неявно добавляет еще пару соединений
  4. Здесь и ниже обращения к реквизитам шапки

Правильно

...
ИЗ
РегистрНакопления.ТоварыКОтгрузке.Остатки(
    &ДатаОтгрузки,
    Склад = &Склад // (1)
    ИЛИ ДокументОтгрузки В
        (ВЫБРАТЬ
            ЗаданияНаПеревозку.Распоряжение
        ИЗ
            ВременнаяТаблицаЗаданийНаПеревозку КАК ЗаданияНаПеревозку)) // (2)
  1. Теперь это реквизит регистра
  2. Выборка из временной таблицы без условий
2.3.

Если нужно несколько условий с подзапросами, выберите одно, которое удовлетворяет требованиям выше и отфильтровывает максимум записей. Остальные условия накладывайте на внешний запрос.

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

Неправильно

Номенклатура В (...)
И Характеристика В (...)
И Серия В (...)

Правильно

(Номенклатура, Характеристика, Серия) В
    (ВЫБРАТЬ
        Номенклатура,
        Характеристика,
        Серия
    ИЗ
        ВременнаяТаблицаТоваров)
См. также
Источник

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