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

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

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

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

Добавлен: 12.03.2019

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

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

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

В условии связи источников запроса сравниваются значения ссылочных полей из обеих
таблиц (Событие.Клиент = Клиенты.Ссылка). Как мы знаем, при левом соединении
таблиц в результат запроса попадут записи из обеих таблиц, которые удовлетворяют
условию связи, и, кроме того, записи из первой таблицы, расположенной слева от
ключевого слова СОЕДИНЕНИЕ, для которых не найдено соответствия во второй
таблице.

Результат запроса (см. рис. 1.83), использующего соединение таблиц, будет аналогичен
выполнению предыдущего запроса, использующего разыменование полей ссылочного
типа.

Как получить данные из разных таблиц, не связывая, а дополняя их
При выборке данных с помощью запросов бывает необходимо дополнить данные,
получившиеся в результате выполнения одного запроса, данными другого запроса.
Например, можно дополнить информацию из приходных накладных со структурой
(КонтрагентТоварКоличествоЦена) данными из расходных накладных с такой же
структурой.

Для этого в языке запросов существует возможность объединения нескольких запросов.
При этом записи, полученные с помощью каждого из объединяемых запросов, собираются
в один результат запроса. При объединении каждый запрос получает данные независимо,
то есть у каждого из запросов – свое описание выбираемых полей (ВЫБРАТЬ),
источников запроса (ИЗ), условий отбора (ГДЕ), полей группировки (СГРУППИРОВАТЬ
ПО
). Затем данные, получаемые в результате каждого запроса, объединяются, и уже над
этим объединением выполняются такие операции, как упорядочивание результатов
(УПОРЯДОЧИТЬ ПО) и расчет итогов (ИТОГИ ПО).

Для объединения запросов используется предложение ОБЪЕДИНИТЬ, которое
располагается в секции Объединение запросов текста запроса. Все секции запроса
приведены на 

рис. 1.13

.

Предположим, нам нужно объединить вместе информацию из документов Заказ товара и
информацию из документов Расходная накладная. При этом нужно вывести суммарное
количество заказанных и проданных товаров по каждому клиенту. Также мы хотим видеть
общий итог по результату запроса в целом и отдельно по каждому клиенту.

Для решения поставленной задачи нужно получить данные из таблицы
Документ.ЗаказТовара, сгруппировать их по полям этой таблицы Клиент и Товар, затем
получить данные из таблицы Документ.РасходнаяНакладная, сгруппировать их по полям
этой таблицы Покупатель и Товар и объединить полученную информацию. Затем
рассчитать общие итоги и итоги по полю Клиент для результата объединения запросов
(листинг 1.86).

Листинг 1.86. Объединение данных о заказах товаров клиентами и данных о продажах товаров этим клиентам


background image

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

Названия полей результата запроса описываются в списке полей выборки первого из
объединяемых запросов. Поля выборки второго запроса сопоставляются с полями
результата в соответствии с порядком их следования в списке полей выборки.

Поэтому объединяемые запросы должны иметь одинаковое количество полей в списке
полей выборки. В случае, если поля выборки объединяемых запросов имеют разный тип,
поля результата запроса будут иметь составной тип. Но в нашем случае поле выборки
результата объединения Клиент имеет тип СправочникСсылка.Клиенты, так как поле
Клиент документа ЗаказТовара и поле Покупатель документа РасходнаяНакладная из
объединяемых запросов также принадлежат к этому типу.

Результат выполнения запроса представлен на рис. 1.84.


background image

Рис. 1.84. Объединение данных о заказах товаров клиентами и данных о продажах товаров этим клиентам

В общем случае могут объединяться результаты выполнения сразу нескольких запросов.

По умолчанию при объединении запросов полностью одинаковые строки в результате
запроса, сформированные разными запросами, заменяются одной. Если требуется, чтобы
были оставлены разные строки, необходимо указать ключевое слово ВСЕ.

В общем случае при объединении в запросе результатов нескольких запросов следует
использовать конструкцию ОБЪЕДИНИТЬ ВСЕ, а не ОБЪЕДИНИТЬ, поскольку во втором
варианте при объединении запросов полностью одинаковые строки заменяются одной, на
что затрачивается дополнительное время, даже в случаях, когда одинаковых строк в
запросах заведомо быть не может.

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

Запрос, служащий источником данных, является вложенным, а запрос, который эти
данные использует, является основным или внешним.

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


background image

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

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

Результат выполнения запроса представлен на рис. 1.85.

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

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

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

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


background image

Мы видим, что результат запроса – несколько не такой, как мы ожидали (рис. 1.86).

Рис. 1.86. Вывод товаров, поступавших в ноябре, из справочника «Товары»

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

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

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