Файл: Хрусталева Е. Ю. Язык запросов 1С-Предприятия 8 (2013).pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 12.03.2019

Просмотров: 51775

Скачиваний: 8724

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

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

Рис. 1.87. Вывод всех товаров в порядке иерархии справочника «Товары» с данными об их поступлении за ноябрь

Однако мы видим, что текст запроса (см. листинг 1.89) стал довольно громоздким и
сложным для восприятия. С этой точки зрения лучше поместить результат вложенного
запроса во временную таблицу и затем использовать ее как источник нашего основного
запроса.

Временная таблица не существует в базе данных. Это просто некоторая область в
памяти компьютера, которая создается на ограниченное время, как, например, это
происходит при создании какой-либо переменной встроенного языка. Эта область
создается и заполняется данными при выполнении запроса, содержащего ключевое
слово ПОМЕСТИТЬ, после которого следует произвольное имя временной таблицы.

Подробнее

Документация «1С:Предприятие 8.3. Руководство разработчика», раздел 8.2 «Язык
запросов», а также встроенная справка 

Справка > Содержание справки >

1С:Предприятие > Встроенный язык > Работа с запросами > Выполнение и
работа с запросами во встроенном языке > Работа с временными таблицами

.

Дополним текст вложенного запроса из предыдущего запроса предложением
ПОМЕСТИТЬ, которое располагается сразу после списка полей выборки (листинг 1.90).

Листинг 1.90. Помещение данных о поступлениях товаров за ноябрь во временную таблицу


background image

Заметим, что для быстрой и эффективной выборки данных из временной таблицы
желательно проиндексировать эту таблицу по полям, которые будут затем участвовать в
условии отбора или в условии соединения. Делается это с помощью предложения
ИНДЕКСИРОВАТЬ ПО.

подробнее

«

Эффективное использование индексов. Пример 5

».

Чтобы увидеть данные, помещенные во временную таблицу, в консоли запросов нужно
нажать кнопку Выполнить запрос с временными таблицами рядом с кнопкой
Выполнить (рис. 1.88).

Рис. 1.88. Данные временной таблицы «ПоступлениеТоваров»

Итак, в результате выполнения запроса (листинг 1.90) мы поместили данные о
поступлениях товаров за ноябрь во временную таблицу с именем ПоступлениеТоваров.

Теперь эту таблицу можно использовать в качестве источника других запросов точно так
же, как и таблицу базы данных. Но сделать это можно либо из встроенного языка с


background image

помощью менеджера временных таблиц (этот вариант мы рассмотрим позже в разделе
"

Использование временных таблиц с помощью встроенного языка

"), либо с помощью

пакетного запроса. Этот вариант мы и рассмотрим сейчас.

Пакетный запрос содержит последовательность запросов, разделенных символом «;»
(точка с запятой). При выполнении пакетного запроса входящие в него запросы
выполняются друг за другом. При этом если при выполнении одного из запросов была
создана временная таблица, то следующие за ним запросы при их выполнении могут
использовать данные этой временной таблицы.

Необходимо учитывать, что временные таблицы будут существовать до окончания
исполнения всего пакета запроса или до исполнения в пакете запроса, уничтожающего
данную временную таблицу с помощью конструкции УНИЧТОЖИТЬ.

Подробнее

Документация «1С:Предприятие 8.3. Руководство разработчика», раздел 8.2 «Язык
запросов», а также встроенная справка 

Справка > Содержание справки >

1С:Предприятие > Встроенный язык > Работа с запросами > Выполнение и
работа с запросами во встроенном языке > Работа с пакетными запросами

.

Таким образом, разобьем запрос, содержащий вложенный запрос (см. листинг 1.89), на
два запроса и объединим их в один пакетный запрос (листинг 1.91).

Листинг 1.91. Вывод всех товаров в порядке иерархии справочника «Товары» с данными об их поступлении за ноябрь

В первом запросе мы помещаем данные о поступлении товаров за ноябрь во временную
таблицу с именем ПоступлениеТоваров. Затем следует символ «;» (точка с запятой),
который указывает на то, что это – пакетный запрос. В следующем запросе справочник


background image

товаров связывается левым соединением с временной таблицей по ссылкам товаров, и в
итоге мы получаем результат, аналогичный результату при выполнении запроса,
содержащего вложенный запрос (см. рис. 1.87).

Таким образом, можно сделать вывод, что текст запроса в случае использования
временных таблиц становится более понятным и осмысленным, чем при использовании
вместо них вложенных запросов.

Также использование временных таблиц вместо вложенных запросов почти всегда делает
запрос более оптимальным. С точки зрения эффективности исполнения запросов крайне
не рекомендуется использовать соединения с вложенными запросами, так как в этом
случае СУБД может выбрать неоптимальный план запроса, что на больших объемах
данных приводит к временным задержкам и другим неприятностям при выполнении таких
запросов.

подробнее

Раздел «

Не использовать соединения с вложенными запросами и с виртуальными

таблицами

».

Пример, показывающий использование вложенного запроса для ограничения значений
выборки в условии отбора (раздел «

Как использовать данные одного запроса внутри

другого запроса

»), также можно переделать с использованием временной таблицы

вместо вложенного запроса.

В заключение покажем, как можно переписать запрос, выполняющий несколько
соединений нескольких таблиц (раздел «

Как получить данные из разных таблиц,

связанных несколькими соединениями

») с использованием временной таблицы (листинг

1.92).

Листинг 1.92. Два варианта запроса, выполняющего несколько соединений данных нескольких таблиц


background image

Второй вариант, использующий временную таблицу, более понятен, по крайней мере
полезен для изучения. Так как если выполнить сначала только первую часть запроса
(помещающую данные во временную таблицу), а затем – весь запрос целиком, то можно
поэтапно проследить, какие данные получаются в результате каждого соединения (рис.
1.89).

Рис. 1.89. Левое соединение данных справочника «Товары» и данных таблиц остатков и оборотов товаров