Рекомендации для Условий в вирт. таблицах

Рекомендации с итс.1с.ру:

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

  • в подзапросе только одна таблица, нет соединений с другими таблицами;
  • если в подзапросе таблица табличной части (например, Документ.Накладная.СписокТоваров), то не должно быть обращения к реквизитам таблицы-шапки (Накладная.Проведен);
  • если в подзапросе  таблица, у которой могут быть табличные части (например, Документ.Накладная), то не должно быть обращений к табличным частям (например, ГДЕ Документ.Накладная.СписокТоваров.Номенклатура = "1");
  • если в подзапросе  временная таблица, то не должно быть условий (раздела ГДЕ);
  • если в подзапросе  постоянная таблица, то условие (раздел ГДЕ) может бытьдопустимо, только если условие выполняется для 80% (или более) случаев; отсутствие условия означает выполнение для 100% случаев;
  • если в подзапросе постоянная таблица, то в ограничениях доступа к данным (RLS) не должно содержатся подзапросов и соединений (допускаются только простые условия вида "ГДЕ Реквизит = Значение", "ГДЕ Истина").

Например, неправильно:

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

Правильно:

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

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