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

Рис. 4.20.2. Делаем дубль запроса, а результаты самого запроса помещаем во временную таблицу
Далее в конструкторе на вкладке Связи смотрим, нет ли условий, ограничивающих нашу виртуальную таблицу РасчетыСКлиентами.Остатки. Если таковые есть, переносим их копированием: при наличии возможности – в параметры, при отсутствии – в ГДЕ.
Затем на вкладке Таблицы и поля убираем все таблицы, кроме виртуальной таблицы РасчетыСКлиентами.Остатки, и добавляем поля, использующиеся в условии соединения, при этом может потребоваться ограничивать тип оператором ВЫРАЗИТЬ (см. рис. 4.20.3). На вкладке Индекс по этим полям индексируем временную таблицу.

Рис. 4.20.3. Добавление поля для условия соединения
Переходим на запрос пакета 2.
На вкладке Таблицы и поля заменяем виртуальную таблицу на временную (см. рис. 4.20.4).

Рис. 4.20.4. Замена виртуальной таблицы на временную
Проверяем, что поля и связи остались после замены таблицы, при необходимости восстанавливаем. Результат изменений выглядит так:
ВЫБРАТЬ
РасчетыСКлиентамиОстатки.СуммаОстаток КАК СуммаОстаток,
ВЫРАЗИТЬ(РасчетыСКлиентамиОстатки.ЗаказКлиента КАК Документ.ЗаказПациента) КАК ЗаказКлиента
ПОМЕСТИТЬ ВТ_РасчетыСКлиентамиОстатки
ИЗ
РегистрНакопления.РасчетыСКлиентами.Остатки(, ЗаказКлиента = &ЗаказКлиента) КАК РасчетыСКлиентамиОстатки
ИНДЕКСИРОВАТЬ ПО
ЗаказКлиента
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ЗаказПациента.Ответственный,
ВТ_РасчетыСКлиентамиОстатки.СуммаОстаток
ИЗ
Документ.ЗаказПациента КАК ЗаказПациента
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_РасчетыСКлиентамиОстатки КАК ВТ_РасчетыСКлиентамиОстатки
ПО (ВТ_РасчетыСКлиентамиОстатки.ЗаказКлиента = ЗаказПациента.Ссылка)
Приведем дополнение из цитированной в предыдущих пояснениях статьи К. Рупасова.
Виртуальные таблицы, используемые в языке запросов «1С:Предприятия», могут разворачиваться в подзапросы при трансляции в язык SQL. Это связано с тем, что виртуальная таблица часто (но не всегда) получает данные из нескольких физических таблиц СУБД. Если вы используете соединение с виртуальной таблицей, то на уровне SQL оно может быть в некоторых случаях реализовано как соединение с подзапросом. В этом случае оптимизатор СУБД может точно так же выбрать неоптимальный план, как при работе с подзапросом, использованным в языке «1С:Предприятия» в явном виде.