Файл: Хрусталева Е. Ю. Язык запросов 1С-Предприятия 8 (2013).pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 12.03.2019
Просмотров: 51756
Скачиваний: 8724
накладных и каким покупателям продавались товары, перечисленные в составе
конкретной приходной накладной. Для этого нужно выполнить следующий запрос (листинг
1.67).
Листинг 1.67. Использование вложенного запроса в условии отбора основного запроса
В условии отбора (Расход.Состав.Товар В ()) значение поля Товар из табличной части
Состав расходной накладной проверяется на попадание в перечень возможных значений.
Для получения этого набора значений используется вложенный запрос. Описание
вложенного запроса начинается с предложения ВЫБРАТЬ и ничем не отличается от
обычного запроса.
Обратите внимание, что текст вложенного запроса принято располагать со смещением
относительно основного запроса для повышения наглядности и структурированности
запроса в целом.
Выполним в консоли запросов отдельно сам вложенный запрос. Для этого необязательно
писать заново текст запроса (листинг 1.68). Достаточно просто выделить мышью текст
вложенного запроса и нажать кнопку Выполнить.
Листинг 1.68. Описание вложенного запроса
Как мы видим, вложенный запрос является запросом к табличной части документа,
который мы рассматривали в разделе «
Как получить данные из табличной части
В результате будет получен перечень товаров из табличной части приходной накладной,
выбранной в качестве значения параметра Документ (см. рис. 1.64, верхняя таблица).
При выполнении внешнего запроса сначала выполняется вложенный запрос, и результат
его выполнения подставляется в условие отбора внешнего запроса.
В результате выполнения основного запроса (листинг 1.67) мы увидим список расходных
накладных, в которых продавались товары, перечисленные в составе конкретной
приходной накладной, указанной в параметре Документ (рис. 1.64).
Рис. 1.64. Использование вложенного запроса в условии отбора
Таким же образом вложенные запросы могут использоваться в условии отбора,
передаваемого в качестве параметра в виртуальную таблицу. В этом случае при
формировании виртуальной таблицы на основе исходной (реальной) таблицы базы
данных выборка значений из исходной таблицы будет ограничена набором значений,
полученным в результате выполнения вложенного запроса.
Например, виртуальная таблица РегистрСведений.Цены.СрезПоследних возвращает
срез последних записей регистра сведений Цены по каждому товару на определенную
дату. Эта таблица имеет параметры Период и Условие, которые мы можем использовать
в языке запросов.
Подробнее
Посмотреть состав таблиц запросов можно во встроенной справке
Справка > Содержание
справки > 1С:Предприятие > Встроенный язык > Работа с запросами > Таблицы
запросов
.
В параметре Период мы можем задать дату, на которую должен быть выполнен срез
последних записей регистра сведений. В параметре Условие мы можем задать условие
отбора записей из исходной (реальной) таблицы регистра сведений при формировании
виртуальной таблицы.
Допустим, нам нужно увидеть последние установленные цены товаров на сегодняшнюю
дату. Но не на все товары, а только на те, которые перечислены в составе конкретной
расходной накладной. Для этого нужно выполнить следующий запрос (листинг 1.69).
Листинг 1.69. Использование вложенного запроса в условии отбора, передаваемого в параметр виртуальной таблицы
В данном запросе нет ничего необычного, кроме того, что после имени виртуальной
таблицы (после ключевого слова ИЗ) в скобках мы можем задать параметры для отбора
записей регистра сведений в эту таблицу. Поскольку мы хотим увидеть самые последние
цены на товары из регистра сведений, то параметр Период мы не указываем. В
параметре Условие мы можем задать произвольное условие на языке запросов,
использующее любые поля регистра сведений Цены.
В этом условии (Товар В ()) значение поля регистра сведений Товар проверяется на
попадание в перечень возможных значений. Для получения этого набора значений
используется вложенный запрос. Таким образом, при формировании виртуальной таблицы
из исходной (реальной) таблицы регистра сведений Цены будут отбираться записи об
изменении цен только тех товаров, которые перечислены в составе расходной накладной,
выбранной в качестве значения параметра Документ.
В результате выполнения запроса мы увидим последние установленные цены на товары,
перечисленные в составе конкретной расходной накладной (рис. 1.65).
Рис. 1.65. Использование вложенного запроса в условии отбора, передаваемого в параметр виртуальной таблицы
подробнее
В данном примере мы используем виртуальную таблицу
СрезПоследних
регистра сведений
Цены
. Подробнее о назначении и использовании виртуальных таблиц регистра сведений
будет рассказано в разделе «
Получение данных из периодических регистров сведений
».
Заметим, что пример с использованием вложенного запроса в условии отбора,
передаваемого в параметр виртуальной таблицы, показан в чисто демонстрационных
целях, но на практике в таких ситуациях лучше использовать временные таблицы, о
которых будет рассказано ниже.
подробнее
Временные таблицы и пакетные запросы
».
Как получить данные из разных таблиц для одного и того же поля
Часто в результате запроса требуется вывести данные из разных таблиц, связав их по
значению некоторого поля, то есть какие-то поля вывести из одной таблицы, какие-то – из
другой для одного и того же значения поля из этих таблиц. Например, можно вывести для
одного и того же товара количество его поступлений и продаж.
В этом случае используются несколько источников данных, которые перечисляются после
ключевого слова ИЗ. В качестве источников запроса могут выступать реальные и
виртуальные таблицы, а также вложенные запросы, но мы пока для упрощения примера
будем рассматривать ситуацию, когда в качестве источников запроса выступают две
таблицы базы данных. Суть примера от этого не изменится.
Исходные таблицы запроса обычно связываются (соединяются) между собой по
некоторому условию – условию связи. Поле, по которому производится связь, обычно
имеет ссылочный тип. При соединении данных из исходных таблиц запроса для каждой
записи из этих таблиц проверяется условие равенства значений ссылочных полей этого
типа. Условие связи источников запроса задается в предложении ИЗ, после ключевого
слова ПО. Например, ПО Товары.Ссылка = Цены.Товар.
В зависимости от того, должны ли записи каждой из таблиц удовлетворять условию
связи, таблицы соединяются внутренним, левым внешним, правым внешним или
полным внешним соединением. Ключевые слова, определяющие тип соединения
(например, ЛЕВОЕ СОЕДИНЕНИЕ), располагаются между именами таблиц в
предложении ИЗ.
Рассмотрим пример, который позволит понять сущность каждого типа соединения.
Допустим, мы хотим вывести перечень товаров из справочника Товары и при этом
показать для каждого товара последнюю установленную на него цену.
В нашей демонстрационной конфигурации существует регистр сведений Цены, который
хранит информацию об изменении цен товаров во времени. Виртуальная таблица
СрезПоследних этого регистра сведений позволяет получить информацию о последних
ценах, установленных для каждого товара.
Поэтому для выполнения поставленной задачи нам нужно соединить в запросе данные из
таблиц Справочник.Товары и РегистрСведений.Цены.СрезПоследних.
подробнее
В данном примере для большей наглядности мы используем виртуальную таблицу
СрезПоследних
регистра сведений
Цены
. Подробнее о назначении и использовании
виртуальных таблиц регистра сведений будет рассказано в разделе «
периодических регистров сведений
Регистр сведений Цены содержит поле Товар, ссылающееся на справочник Товары. По
полю этого типа и будет производиться связь таблиц в запросе, то есть в условии связи
для каждой записи из обеих таблиц будут сравниваться значения уникального поля
Ссылка из справочника и ссылочного поля Товар из среза последних записей регистра
сведений.
Исходные данные, используемые в примере о соединении таблиц в запросе,
представлены на рис. 1.66.
Рис. 1.66. Исходные записи справочника «Товары» и среза последних записей регистра сведений «Цены»
Однако, как мы видим на рисунке, не для всех товаров из справочника Товары
существует соответствующая им цена в срезе последних записей регистра сведений
Цены. В частности, для товара Пинетки не найдено цены в регистре сведений, так как
товар – новый, и цена на него еще не устанавливалась. Также для записей справочника
Обувь, Продукты и Детская обувь не найдено соответствий в регистре сведений, так