Файл: Хрусталева Е. Ю. Язык запросов 1С-Предприятия 8 (2013).pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 12.03.2019
Просмотров: 51753
Скачиваний: 8724
как эти записи являются группами товаров, и цены на них не имеют смысла.
Теперь посмотрим, что же произойдет при связывании данных двух этих таблиц разными
видами соединений.
Внутреннее соединение
При внутреннем соединении таблиц в результат запроса попадут только те записи из
таблиц-источников, которые удовлетворяют заданному условию связи (после ключевого
слова ПО).
Предположим, нам необходимо вывести из справочника Товары те товары, на которые
установлена цена в регистре сведений Цены, и показать актуальную цену для каждого
товара. Товары, на которые не установлена цена, выводить не нужно, а также не нужно
выводить последние установленные цены из регистра сведений для товаров, которых не
существует в справочнике товаров.
Для этого нам нужно соединить в запросе данные из таблиц Справочник.Товары и
РегистрСведений.Цены.СрезПоследних внутренним соединением. Из справочника
Товары выведем поля Код, Наименование и Производитель, а из среза последних
записей регистра сведений Цены – поле Цена (листинг 1.70).
Листинг 1.70. Внутреннее соединение данных справочника «Товары» и среза последних записей регистра сведений
«Цены»
Результат запроса представлен на рис. 1.67.
Рис. 1.67. Внутреннее соединение данных справочника «Товары» и среза последних записей регистра сведений «Цены»
ПРИМЕЧАНИЕ
При соединениях источников запроса в заголовке таблицы, содержащей результат запроса,
в консоли запросов выводится имя первой таблицы из списка соединений.
Мы видим, что в результат запроса попали только те записи из обеих таблиц, для которых
было выполнено условие связи (Товары.Ссылка = Цены.Товар), то есть для каждой
записи из справочника Товары была найдена соответствующая запись из среза последних
записей регистра сведений Цены, в которой значение ссылочного поля Товар было равно
значению поля Ссылка. Поэтому в результате запроса содержатся 6 записей, а в
исходной таблице справочника – 10 (см. рис. 1.68), так как для четырех записей
справочника не было найдено соответствий в регистре сведений.
В обратную сторону условие связи также должно выполняться, то есть если в
справочнике товаров не существует товара, для которого установлена цена в регистре
сведений, то такая запись также не попадет в результат запроса. Но обычно
разработчики программно поддерживают целостность базы данных, и такие ситуации
встречаются редко.
ПРИМЕЧАНИЕ
Ключевое слово
ВНУТРЕННЕЕ
в тексте запроса можно не указывать, но оно повышает
наглядность и читаемость текста запроса.
При соединениях чаще всего применяется условие на равенство, но в языке запросов есть
возможность использовать все операции сравнения и логические операции
И
,
ИЛИ
,
НЕ
.
Если в таблице будет найдено несколько записей, удовлетворяющих условию
соединения, то в результат запроса будут включены все эти записи. Например, если в
запросе использовать соединение таблицы справочника Товары и реальной таблицы
регистра сведений Цены (листинг 1.71), то в результате мы увидим несколько
установленных цен для одного и того же товара (рис. 1.68).
Листинг 1.71. Внутреннее соединение данных справочника «Товары» и регистра сведений «Цены»
Рис. 1.68. Внутреннее соединение данных справочника «Товары» и регистра сведений «Цены»
Левое внешнее соединение
Если связать таблицы регистров накопления левым соединением, то в результат запроса
попадут записи из обеих таблиц, удовлетворяющие условию связи, и, кроме того, записи
из первой таблицы, расположенной слева от ключевого слова СОЕДИНЕНИЕ, для
которых не найдено соответствия во второй таблице.
Предположим, нам необходимо вывести все записи из справочника Товары и показать
актуальную цену товаров, на которые установлена цена в регистре сведений Цены. При
этом последние установленные цены из регистра сведений для товаров, которых не
существует в справочнике товаров, выводить не нужно. Для этого нам нужно соединить в
запросе данные из таблиц Справочник.Товары и
РегистрСведений.Цены.СрезПоследних левым внешним соединением (листинг 1.72).
Листинг 1.72. Левое внешнее соединение данных справочника «Товары» и среза последних записей регистра сведений
«Цены»
Результат запроса представлен на рис. 1.69.
Рис. 1.69. Левое внешнее соединение данных справочника «Товары» и среза последних записей регистра сведений
«Цены»
Мы видим, что в результат запроса попали все 10 записей из Товары (см. рис. 1.66)
независимо от того, была найдена соответствующая им запись из среза последних
записей регистра сведений Цены или нет. Так произошло потому, что таблица
Справочник.Товары расположена слева от слова СОЕДИНЕНИЕ.
Строки результата запроса, для которых не найдено соответствующих условию записей
из второго источника, будут содержать значение NULL в полях, формируемых на
основании записей из этого источника. Обратите внимание, что значения NULL не
являются нулем или пустой строкой. Значения данного типа обозначают неуказанные
(отсутствующие) значения или значения, не имеющие смысла. В данном случае в поле
Цена для товаров Обувь, Продукты, Детская обувь и Пинетки будет находиться
значение NULL.
Из второй таблицы в результат запроса попадут только записи, удовлетворяющие
условию связи, то есть если в справочнике товаров не существует товара, для которого
установлена цена в регистре сведений, то такая запись не попадет в результат запроса.
ПРИМЕЧАНИЕ
Ключевое слово
ВНЕШНЕЕ
в тексте запроса можно не указывать, но оно повышает
наглядность и читаемость текста запроса.
Таким образом, в случае, когда таблица справочника связывается левым внешним
соединением с таблицей по полю, имеющему тип ссылки на этот справочник, вы можете
быть уверены, что не потеряете нужных вам данных. Поэтому в отчетах используется в
основном именно левое соединение таблиц.
Правое внешнее соединение
При правом соединении таблиц ситуация зеркально противоположная. То есть из правой
таблицы в результат запроса попадут все записи, а из левой – только те, которые
удовлетворяют условию связи.
Предположим, нам необходимо вывести из справочника Товары те товары, на которые
установлена цена в регистре сведений Цены, и показать актуальную цену для каждого
товара. При этом товары, на которые не установлена цена, выводить не нужно, а из
регистра сведений нужно вывести срез всех последних записей. Для этого нам нужно
соединить в запросе данные из таблиц Справочник.Товары и
РегистрСведений.Цены.СрезПоследних правым внешним соединением (листинг 1.73).
Листинг 1.73. Правое внешнее соединение данных справочника «Товары» и среза последних записей регистра
сведений «Цены»
Результат запроса представлен на рис. 1.70.
Рис. 1.70. Правое внешнее соединение данных справочника «Товары» и среза последних записей регистра сведений
«Цены»
Мы видим, что в результат запроса попали все 6 записей из таблицы среза последних
записей регистра сведений Цены (см. рис. 1.66), расположенной справа от слова
СОЕДИНЕНИЕ. В нашем примере это не так очевидно: так, все товары, для которых
установлены цены, присутствуют в справочнике Товары. Но в общем случае если в
справочнике товаров не существует товара, для которого установлена цена в регистре
сведений, то такая запись все равно попадет в результат запроса.
Строки результата запроса, для которых не найдено соответствующих условию записей
из первого источника, будут содержать значение NULL в полях, формируемых на
основании записей из этого источника.
Из первой таблицы в результат запроса попадут только записи, удовлетворяющие
условию связи. То есть если в срезе последних записей регистра сведений Цены не
найдена цена для какого-то товара, то такая запись из справочника Товары не попадет в
результат запроса.
Правое соединение полностью аналогично левому, но при этом таблицы меняются
местами в тексте запроса. Именно так и происходит в «1С:Предприятии».
Таким образом, если мы поменяем местами наши исходные таблицы и свяжем их правым
соединением (первый вариант запроса), то мы получим результат, полностью
аналогичный предыдущему примеру с левым соединением (см. рис. 1.69), листинг 1.74.
Листинг 1.74. Правое внешнее соединение данных справочника «Товары» и среза последних записей регистра
сведений «Цены»