Как использовать данные одного запроса внутри другого запроса
страницаПримеры использования языка запросов для получения данных из нескольких таблиц
Как использовать данные одного запроса внутри другого запроса
Иногда внутри одного запроса необходимо использовать данные другого запроса. Например, требуется ограничить выборку значений в условии отбора одного запроса данными другого запроса. Второй запрос по отношению к первому является вложенным, а первый запрос по отношению ко второму является основным, или внешним. Причем уровней вложенности запросов друг в друга в общем случае может быть несколько.
Рассмотрите эту ситуацию на примере. Допустим, необходимо узнать, в каких документах ОказаниеУслуги и каким клиентам продавались материалы, перечисленные в конкретной приходной накладной. Для этого нужно выполнить следующий запрос (листинг 11.29).
Листинг **11.**29. Использование вложенного запроса в условии отбора основного запроса
ВЫБРАТЬ
ОказаниеУслуги.Ссылка КАК Ссылка,
ОказаниеУслуги.Клиент КАК Клиент
ИЗ
Документ.ОказаниеУслуги КАК ОказаниеУслуги
ГДЕ
ОказаниеУслуги.ПереченьНоменклатуры.Номенклатура В
(ВЫБРАТЬ
ПриходнаяНакладнаяМатериалы.Материал КАК Материал
ИЗ
Документ.ПриходнаяНакладная.Материалы КАК ПриходнаяНакладнаяМатериалы
ГДЕ
ПриходнаяНакладнаяМатериалы.Ссылка = &Документ)
УПОРЯДОЧИТЬ ПО
Ссылка
АВТОУПОРЯДОЧИВАНИЕ
В условии отбора (ОказаниеУслуги.ПереченьНоменклатуры.Номенклатура В ()) значение поля Номенклатура из табличной части ПереченьНоменклатуры документа ОказаниеУслуги проверяется на попадание в перечень возможных значений. Для получения этого набора значений используется вложенный запрос. Описание вложенного запроса начинается с предложения ВЫБРАТЬ и ничем не отличается от обычного запроса.
Обратите внимание, что текст вложенного запроса принято располагать со смещением относительно основного запроса для повышения наглядности и структурированности запроса в целом.
Напишите в консоли запросов текст, показанный в листинге 11.29, задайте параметр запроса – «Приходная накладная № 1». Если вы не помните, как задавать значения параметров запроса, посмотрите рис. 11.22.
После этого выполните только вложенный запрос. Для этого выделите его текст мышью и нажмите Выполнить (рис. 11.25).

Рис. 11.2****5. Выполнение вложенного запроса в консоли запросов
В результате будет получен перечень товаров из табличной части приходной накладной, выбранной в качестве значения параметра Документ.
При выполнении внешнего запроса сначала выполняется вложенный запрос, и результат его выполнения подставляется в условие отбора внешнего запроса.
Теперь снимите выделение в консоли запросов и выполните весь запрос целиком. В результате выполнения основного запроса (листинг 11.29) вы увидите список документов ОказаниеУслуги, в которых продавались товары, перечисленные в конкретной приходной накладной, указанной в параметре Документ (рис. 11.26).

Рис. 11.26. Использование вложенного запроса в условии отбора
Таким же образом вложенные запросы могут использоваться в условии отбора, передаваемом в качестве параметра в виртуальную таблицу. В этом случае при формировании виртуальной таблицы на основе исходной (реальной) таблицы базы данных выборка значений из исходной таблицы будет ограничена набором значений, полученным в результате выполнения вложенного запроса.
Например, виртуальная таблица РегистрНакопления.ОстаткиМатериалов.Остатки возвращает остатки по каждому материалу на указанную дату. Эта таблица имеет параметры Период и Условие, которые вы можете использовать в языке запросов.
В параметре Период вы можете задать дату, на которую должны быть получены остатки. В параметре Условие вы можете задать условие отбора записей из исходной (реальной) таблицы регистра накопления при формировании виртуальной таблицы.
Допустим, вам нужно увидеть актуальные остатки материалов на сегодняшнюю дату. Но не для всех материалов, а только для тех, которые перечислены в конкретной приходной накладной. Для этого нужно выполнить следующий запрос (листинг 11.30).
Листинг **11.**30. Использование вложенного запроса в условии отбора, передаваемом в параметр виртуальной таблицы
ВЫБРАТЬ
ОстаткиМатериаловОстатки.Материал КАК Материал,
ОстаткиМатериаловОстатки.Склад КАК Склад,
ОстаткиМатериаловОстатки.КоличествоОстаток КАК КоличествоОстаток
ИЗ
РегистрНакопления.ОстаткиМатериалов.Остатки(
,
Материал В (ВЫБРАТЬ
ПриходнаяНакладнаяМатериалы.Материал КАК Материал
ИЗ
Документ.ПриходнаяНакладная.Материалы КАК ПриходнаяНакладнаяМатериалы
ГДЕ
ПриходнаяНакладнаяМатериалы.Ссылка = &Документ))
КАК ОстаткиМатериаловОстатки
УПОРЯДОЧИТЬ ПО
Материал
АВТОУПОРЯДОЧИВАНИЕ
В данном запросе нет ничего необычного, кроме того, что после имени виртуальной таблицы РегистрНакопления.ОстаткиМатериалов.Остатки в скобках вы можете задать параметры для отбора записей регистра накоплений в эту таблицу.
Поскольку вы хотите увидеть актуальные остатки, параметр Период вы не указываете. В параметре Условие вы задаете произвольное условие на языке запросов, использующее любые поля регистра накопления ОстаткиМатериалов.
В этом условии (Материал В ()) значение поля регистра накопления Материал проверяется на попадание в перечень возможных значений. Для получения этого набора значений используется вложенный запрос. Таким образом, при формировании виртуальной таблицы из исходной (реальной) таблицы регистра накопления ОстаткиМатериалов будут отбираться записи об изменении цен только тех материалов, которые перечислены в приходной накладной, выбранной в качестве значения параметра Документ.
В результате выполнения запроса вы увидите актуальные остатки материалов, перечисленных в конкретной приходной накладной (рис. 11.27).

Рис. 11.27. Использование вложенного запроса в условии отбора, передаваемом в параметр виртуальной таблицы