Как соединять таблицы в 1С 8.5

О чем пойдет речь

При работе с запросами в 1С часто возникает необходимость получать данные сразу из нескольких таблиц. Например, нужно вывести список клиентов вместе с их заказами, сопоставить товары и остатки на складе или объединить данные из разных регистров.

Для решения таких задач в языке запросов 1С используются соединения таблиц. От правильного выбора типа соединения зависит итоговый набор данных и производительность запроса.

В этой статье разберем все основные виды соединений в 1С: внутреннее, левое, правое и полное, а также их производные. Рассмотрим, в каких случаях их использовать, какой результат они возвращают и приведем практические примеры.

Для всех примеров будем использовать две таблицы:

Таблица «Сотрудники»

КодИмя
1Иванов
2Петров
3Сидоров

Таблица «Премии»

КодСотрудникаСумма
11000
2500
52000

ЛЕВОЕ соединение

Что дает: Все записи из левой таблицы + совпадающие данные из правой. Если справа нет соответствия — поля правой таблицы заполняются NULL.

Пример: Показать всех сотрудников и их премии (если премии нет – будет пусто).

ВЫБРАТЬ
    Сотрудники.Имя,
    Премии.Сумма
ИЗ
    Справочник.Сотрудники КАК Сотрудники
      ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Премии КАК Премии
            ПО Сотрудники.Код = Премии.КодСотрудника

Результат:

ИмяСумма
Иванов1000
Петров500
СидоровNULL

ЛЕВОЕ соединение, исключая внутреннее

Что дает: Только те записи из левой таблицы, для которых нет соответствия в правой. То есть строки левой таблицы без пары.

Пример: Найти сотрудников, которые не получили премию.

ВЫБРАТЬ
Сотрудники.Имя
ИЗ
Справочник.Сотрудники КАК Сотрудники
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Премии КАК Премии
ПО Сотрудники.Код = Премии.КодСотрудника
ГДЕ
Премии.КодСотрудника ЕСТЬ NULL

Результат:

Имя
Сидоров

Пояснение: мы исключили строки, где нашлось совпадение (Иванов, Петров), оставив только NULL в правой таблице.

ВНУТРЕННЕЕ соединение

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

Пример: Найти сотрудников, у которых есть премия, и показать сумму.

ВЫБРАТЬ
    Сотрудники.Имя,
    Премии.Сумма
ИЗ
    Справочник.Сотрудники КАК Сотрудники
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.Премии КАК Премии
    ПО Сотрудники.Код = Премии.КодСотрудника

Результат:

ИмяСумма
Иванов1000
Петров500

Сидоров отсеялся (нет премии), премия на 2000 отсеялась (нет сотрудника с кодом 5).

ПОЛНОЕ соединение

Что дает: Все строки из левой + все строки из правой. Совпавшие склеиваются в одну строку, несовпавшие добиваются NULL с противоположной стороны.

Пример: Полная картина: все сотрудники и все премии, даже если они ни с кем не связаны.

ВЫБРАТЬ
    Сотрудники.Имя,
    Премии.Сумма
ИЗ
    Справочник.Сотрудники КАК Сотрудники
ПОЛНОЕ СОЕДИНЕНИЕ РегистрСведений.Премии КАК Премии
    ПО Сотрудники.Код = Премии.КодСотрудника

Результат:

ИмяСумма
Иванов1000
Петров500
СидоровNULL
NULL2000

ПОЛНОЕ соединение, исключая внутреннее

Что дает: Все строки, которые не имеют пары ни с одной стороны. То есть «сироты» из левой таблицы + «сироты» из правой таблицы. Совпавшие строки отбрасываются.

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

ВЫБРАТЬ
    Сотрудники.Имя,
    Премии.Сумма
ИЗ
    Справочник.Сотрудники КАК Сотрудники
ПОЛНОЕ СОЕДИНЕНИЕ РегистрСведений.Премии КАК Премии
    ПО Сотрудники.Код = Премии.КодСотрудника
ГДЕ
    Сотрудники.Код ЕСТЬ NULL
    ИЛИ Премии.КодСотрудника ЕСТЬ NULL

Результат:

ИмяСумма
СидоровNULL
NULL2000

Совпавшие Иванов и Петров исчезли из результата.

ПРАВОЕ соединение

Что дает: Все записи из правой таблицы + совпадающие данные из левой. Если слева нет соответствия – поля левой таблицы = NULL.
Это полный аналог Левого содинения, но с переставленными таблицами. На практике почти не используется

Пример: Показать все начисленные премии (даже ошибочные) и, если возможно, имя сотрудника.

ВЫБРАТЬ
Сотрудники.Имя,
Премии.Сумма
ИЗ
Справочник.Сотрудники КАК Сотрудники
ПРАВОЕ СОЕДИНЕНИЕ РегистрСведений.Премии КАК Премии
ПО Сотрудники.Код = Премии.КодСотрудника

Результат:

ИмяСумма
Иванов1000
Петров500
NULL2000

ПРАВОЕ соединение, исключая внутреннее

Что дает: Только те записи из правой таблицы, для которых нет соответствия в левой. То есть «висячие» записи правой таблицы.

Пример: Найти премии, которые начислены на несуществующего сотрудника.

ВЫБРАТЬ
    Премии.Сумма,
    Премии.КодСотрудника
ИЗ
    Справочник.Сотрудники КАК Сотрудники
ПРАВОЕ СОЕДИНЕНИЕ РегистрСведений.Премии КАК Премии
    ПО Сотрудники.Код = Премии.КодСотрудника
ГДЕ
    Сотрудники.Код ЕСТЬ NULL

Результат:

СуммаКодСотрудника
20005

Строки с Ивановым и Петровым отброшены – у них есть совпадение.

Памятка по видам соединения

ВариантЧто получаемУсловие в WHERE
ЛЕВОЕВсе из левой + совпавшие из правой
ЛЕВОЕ исключая ВНУТРЕННЕЕТолько строки левой без парыПравое.Поле IS NULL
ВНУТРЕННЕЕТолько строки с парой в обеих таблицах
ПОЛНОЕВсе строки из обеих таблиц
ПОЛНОЕ исключая ВНУТРЕННЕЕСтроки без пары (слева + справа)Левое.Поле IS NULL OR Правое.Поле IS NULL
ПРАВОЕВсе из правой + совпавшие из левой
ПРАВОЕ исключая ВНУТРЕННЕЕТолько строки правой без парыЛевое.Поле IS NULL

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Отправьте форму и мы вам перезвоним

Отправляя форму вы соглашаетесь с политикой конфиденциальности и даете согласие на обработку персональных данных компании ИП Рыжиченко Антону Ивановичу
Сайт itviar.ru использует cookie для персонализации и хранения настроек.
Отправляя форму вы соглашаетесь с политикой конфиденциальности и даете согласие на обработку персональных данных компании ИП Рыжиченко Антону Ивановичу