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