Соединения в запросах 1С, пожалуй, наиважнейшая операция с таблицами базы данных. Именно от корректности применения нужного соединения, в каждом конкретном случае, зависят получаемые итоговые данные из базы.
При помощи соединений, мы сопоставляем записи одной таблицы, с записями другой. Прежде чем приступить к рассмотрению соединений, подготовим небольшую базу данных. (Демонстрационную базу данных можно скачать внизу страницы.)
Итак, мы имеем несколько справочников, а именно:
Справочник «Люди».
Справочник «Цвета».
Справочник «Ассоциации».
Мы будем получать данные об ассоциациях людей, беря за основу цвет.
К примеру, для Ольги ассоциацией будет трава, так как она предпочитает зелёный цвет. Для Александра и Василия, подходящих им ассоциаций, нет, по причине того, что они предпочитают синий и красный цвета. А вот ассоциаций для этих цветов, в базе не указано. Нужно ещё обратить внимание, что белый цвет никто не предпочитает, хотя в базе он указан и ассоциация ему — мел. Запомните это, дальше эти сведения нам пригодятся.
Давайте получим имена людей, с предпочитаемыми ими, цветами.
1 2 3 4 5 |
ВЫБРАТЬ Люди.Наименование КАК Наименование, Люди.ПредпочитаетЦвет КАК ПредпочитаетЦвет ИЗ Справочник.Люди КАК Люди |
Теперь получим ассоциации с их цветами.
1 2 3 4 5 |
ВЫБРАТЬ Ассоциации.Наименование КАК Наименование, Ассоциации.Цвет КАК Цвет ИЗ Справочник.Ассоциации КАК Ассоциации |
Перекрёстное соединение в запросах 1С.
Выполним перекрёстное соединение. Здесь мы получим получим все записи из всех таблиц.
1 2 3 4 5 6 7 8 |
ВЫБРАТЬ Люди.Наименование КАК Наименование, Люди.ПредпочитаетЦвет КАК ПредпочитаетЦвет, Ассоциации.Наименование КАК Наименование1, Ассоциации.Цвет КАК Цвет ИЗ Справочник.Люди КАК Люди, Справочник.Ассоциации КАК Ассоциации |
Как видите, никакой информативности.
Внутреннее соединение в запросах 1С.
Всё же, давайте получим интересующие нас результаты, где значение предпочитаемого цвета, равно значению цвета ассоциации. Для этого, нам нужно добавить к запросу, конструкцию ГДЕ.
1 2 3 4 5 6 7 8 9 10 |
ВЫБРАТЬ Люди.Наименование КАК Наименование, Люди.ПредпочитаетЦвет КАК ПредпочитаетЦвет, Ассоциации.Наименование КАК Наименование1, Ассоциации.Цвет КАК Цвет ИЗ Справочник.Люди КАК Люди, Справочник.Ассоциации КАК Ассоциации ГДЕ Люди.ПредпочитаетЦвет = Ассоциации.Цвет |
Ещё один вариант внутреннего соединения, в котором конструкция ГДЕ не применяется. Вместо неё, мы укажем в запросе, само выражение ВНУТРЕННЕЕ СОЕДИНЕНИЕ.
1 2 3 4 5 6 7 8 9 |
ВЫБРАТЬ Люди.Наименование КАК Наименование, Люди.ПредпочитаетЦвет КАК ПредпочитаетЦвет, Ассоциации.Наименование КАК Наименование1, Ассоциации.Цвет КАК Цвет ИЗ Справочник.Люди КАК Люди ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Ассоциации КАК Ассоциации ПО Люди.ПредпочитаетЦвет = Ассоциации.Цвет |
Как видите, в том и другом случае, полученные нами данные, абсолютно идентичны.
Схематично:
Левое соединение в запросах 1С.
Как видно из предыдущего запроса, в результирующие данные не попали Василий и Александр, по причине того, что они предпочитают синий и красный цвета. А ассоциаций для этих цветов, в нашей базе данных нет.
Нам необходимо переписать запрос так, чтобы эти люди, всё же, были представлены в результатах, не смотря на то, что для их любимых цветов, ассоциации не сопоставлены.
1 2 3 4 5 6 7 8 9 |
ВЫБРАТЬ Люди.Наименование КАК Наименование, Люди.ПредпочитаетЦвет КАК ПредпочитаетЦвет, Ассоциации.Наименование КАК Наименование1, Ассоциации.Цвет КАК Цвет ИЗ Справочник.Люди КАК Люди ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Ассоциации КАК Ассоциации ПО Люди.ПредпочитаетЦвет = Ассоциации.Цвет |
Левое соединение представляет из себя:
Схематично:
Правое соединение в запросах 1С.
Давайте ещё раз взглянем на внутреннее соединение:
Как видно, здесь отсутствует ассоциация Мел с белым цветом, так как этот цвет никто из наших людей не предпочитает.
Нам необходимо переписать запрос так, чтобы мы получили записи из второй таблицы, которые не имеют пар (не сопоставлены) с первой.
1 2 3 4 5 6 7 8 9 |
ВЫБРАТЬ Люди.Наименование КАК Наименование, Люди.ПредпочитаетЦвет КАК ПредпочитаетЦвет, Ассоциации.Наименование КАК Наименование1, Ассоциации.Цвет КАК Цвет ИЗ Справочник.Люди КАК Люди ПРАВОЕ СОЕДИНЕНИЕ Справочник.Ассоциации КАК Ассоциации ПО Люди.ПредпочитаетЦвет = Ассоциации.Цвет |
Правое соединение представляет из себя:
Схематично:
Полное соединение в запросах 1С.
А теперь представим, что возникла необходимость получить все записи из двух таблиц. Независимо от того, есть ли у них сопоставленные пары или нет. Для этой цели, нам нужно будет совместить результаты левого и правого соединений. Как раз для таких случаев существует полное соединение.
1 2 3 4 5 6 7 8 9 |
ВЫБРАТЬ Люди.Наименование КАК Наименование, Люди.ПредпочитаетЦвет КАК ПредпочитаетЦвет, Ассоциации.Наименование КАК Наименование1, Ассоциации.Цвет КАК Цвет ИЗ Справочник.Люди КАК Люди ПОЛНОЕ СОЕДИНЕНИЕ Справочник.Ассоциации КАК Ассоциации ПО Люди.ПредпочитаетЦвет = Ассоциации.Цвет |
Полное соединение представляет из себя:
Схематично:
Как видно выше, некоторые поля у нас пустые. На самом деле эти данные являются очень коварными значениями NULL. NULL означает отсутствие значения, любая операция с ним приведёт к ошибке. Даже, если сравнить NULL с NULL, результатом этого сравнения будет Ложь. Не даром, во всех конфигурациях, в обязательном порядке, требуется проводить обработку такого значения, в местах возможного его возникновения.
Мы так же, не оставим это без внимания и в запросе с полным соединением, применим функцию ЕСТЬNULL. Эта функция проверяет результаты запроса на NULL и если, она получает такое значение, то возвращает другое значение, указанное нами в параметрах этой функции.
1 2 3 4 5 6 7 8 9 |
ВЫБРАТЬ ЕСТЬNULL(Люди.Наименование,"Это Null") КАК Наименование, ЕСТЬNULL(Люди.ПредпочитаетЦвет,"Это Null") КАК ПредпочитаетЦвет, ЕСТЬNULL(Ассоциации.Наименование,"Это Null") КАК Наименование1, ЕСТЬNULL(Ассоциации.Цвет,"Это Null") КАК Цвет ИЗ Справочник.Люди КАК Люди ПОЛНОЕ СОЕДИНЕНИЕ Справочник.Ассоциации КАК Ассоциации ПО Люди.ПредпочитаетЦвет = Ассоциации.Цвет |
Демонстрационная база данных Обзор Видов Соединений