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

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

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

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

Добавлен: 12.03.2019

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

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

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

При этом порядок следования полей таблиц в условии связи значения не имеет, важно
лишь, какая таблица расположена слева, а какая – справа от слова СОЕДИНЕНИЕ.

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

Предположим, нам необходимо вывести все записи из справочника Товары и срез всех
последних записей из регистра сведений Цены. При этом нужно показать актуальную цену
для тех товаров, на которые она устанавливалась. Для этого нам нужно соединить в
запросе данные из таблиц Справочник.Товары и
РегистрСведений.Цены.СрезПоследних полным внешним соединением (листинг 1.75).

Листинг 1.75. Полное внешнее соединение данных справочника «Товары» и среза последних записей регистра
сведений «Цены»

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


background image

Рис. 1.71. Полное внешнее соединение данных справочника «Товары» и среза последних записей регистра сведений

«Цены»

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

Строки результата запроса, для которых не найдено соответствующих условию записей
из какого-либо источника, будут содержать значение NULL в полях, формируемых на
основании записей из этого источника.

Следует иметь в виду, что при работе в клиент-серверном варианте, когда в качестве
СУБД используется PostgreSQL, производительность выполнения запросов с
конструкцией ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ значительно снижается. В особенности
это касается случаев, когда в запросе встречаются две и более такие конструкции.
Поэтому в общем случае не рекомендуется использовать полное внешнее соединение в
запросах. И в тех случаях, где это возможно, рекомендуется переписать текст исходного
запроса без использования этой конструкции.

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

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

Подробнее

Раздел «

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

таблицами

».

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


background image

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

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

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

подробнее

В данном примере для большей наглядности мы используем виртуальную таблицу

Остатки

 регистра накопления 

ОстаткиТоваров

 и виртуальную таблицу 

Обороты

регистра накопления 

Продажи

. Подробнее о назначении и использовании виртуальных

таблиц регистра накопления будет рассказано в разделах «

Получение остатков

»,

«

Получение оборотов

».

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

Исходные данные, используемые в примере о соединении таблиц в запросе,
представлены на рис. 1.72.


background image

Рис. 1.72. Исходные записи справочника «Товары» и виртуальных таблиц регистров накопления «ОстаткиТоваров» и

«Продажи»

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

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

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


background image

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

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

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

Если проанализировать текст запроса, представленный в листинге 1.76, то понятно, что
сначала выполняется левое соединение справочника Товары с виртуальной таблицей
остатков. Результат этого соединения мы видим на рис. 1.74, слева. Для каждого товара
из справочника ищется соответствующая запись в таблице остатков, и найденный остаток
выводится для конкретного товара. Товары, у которых нет остатка (СапогиМасло,
Пинетки), также попадают в результат соединения.

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

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