О чем пойдет речь
При работе с запросами в 1С часто возникает необходимость получать данные сразу из нескольких таблиц. Например, нужно вывести список клиентов вместе с их заказами, сопоставить товары и остатки на складе или объединить данные из разных регистров.
Для решения таких задач в языке запросов 1С используются соединения таблиц. От правильного выбора типа соединения зависит итоговый набор данных и производительность запроса.
В этой статье разберем все основные виды соединений в 1С: внутреннее, левое, правое и полное, а также их производные. Рассмотрим, в каких случаях их использовать, какой результат они возвращают и приведем практические примеры.
Для всех примеров будем использовать две таблицы:
Таблица «Сотрудники»
| Код | Имя |
|---|---|
| 1 | Иванов |
| 2 | Петров |
| 3 | Сидоров |
Таблица «Премии»
| КодСотрудника | Сумма |
|---|---|
| 1 | 1000 |
| 2 | 500 |
| 5 | 2000 |
ЛЕВОЕ соединение
Что дает: Все записи из левой таблицы + совпадающие данные из правой. Если справа нет соответствия — поля правой таблицы заполняются NULL.

Пример: Показать всех сотрудников и их премии (если премии нет – будет пусто).
ВЫБРАТЬ
Сотрудники.Имя,
Премии.Сумма
ИЗ
Справочник.Сотрудники КАК Сотрудники
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Премии КАК Премии
ПО Сотрудники.Код = Премии.КодСотрудникаРезультат:
| Имя | Сумма |
|---|---|
| Иванов | 1000 |
| Петров | 500 |
| Сидоров | NULL |
ЛЕВОЕ соединение, исключая внутреннее
Что дает: Только те записи из левой таблицы, для которых нет соответствия в правой. То есть строки левой таблицы без пары.

Пример: Найти сотрудников, которые не получили премию.
ВЫБРАТЬ
Сотрудники.Имя
ИЗ
Справочник.Сотрудники КАК Сотрудники
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Премии КАК Премии
ПО Сотрудники.Код = Премии.КодСотрудника
ГДЕ
Премии.КодСотрудника ЕСТЬ NULL
Результат:
| Имя |
|---|
| Сидоров |
Пояснение: мы исключили строки, где нашлось совпадение (Иванов, Петров), оставив только NULL в правой таблице.
ВНУТРЕННЕЕ соединение
Что дает: Только те строки, которые имеют совпадающее значение в обеих таблицах по условию связи.

Пример: Найти сотрудников, у которых есть премия, и показать сумму.
ВЫБРАТЬ
Сотрудники.Имя,
Премии.Сумма
ИЗ
Справочник.Сотрудники КАК Сотрудники
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.Премии КАК Премии
ПО Сотрудники.Код = Премии.КодСотрудникаРезультат:
| Имя | Сумма |
|---|---|
| Иванов | 1000 |
| Петров | 500 |
Сидоров отсеялся (нет премии), премия на 2000 отсеялась (нет сотрудника с кодом 5).
ПОЛНОЕ соединение
Что дает: Все строки из левой + все строки из правой. Совпавшие склеиваются в одну строку, несовпавшие добиваются NULL с противоположной стороны.

Пример: Полная картина: все сотрудники и все премии, даже если они ни с кем не связаны.
ВЫБРАТЬ
Сотрудники.Имя,
Премии.Сумма
ИЗ
Справочник.Сотрудники КАК Сотрудники
ПОЛНОЕ СОЕДИНЕНИЕ РегистрСведений.Премии КАК Премии
ПО Сотрудники.Код = Премии.КодСотрудникаРезультат:
| Имя | Сумма |
|---|---|
| Иванов | 1000 |
| Петров | 500 |
| Сидоров | NULL |
| NULL | 2000 |
ПОЛНОЕ соединение, исключая внутреннее
Что дает: Все строки, которые не имеют пары ни с одной стороны. То есть «сироты» из левой таблицы + «сироты» из правой таблицы. Совпавшие строки отбрасываются.

Пример: Отчет по расхождениям – показать и сотрудников без премий, и премии, начисленные неизвестно кому.
ВЫБРАТЬ
Сотрудники.Имя,
Премии.Сумма
ИЗ
Справочник.Сотрудники КАК Сотрудники
ПОЛНОЕ СОЕДИНЕНИЕ РегистрСведений.Премии КАК Премии
ПО Сотрудники.Код = Премии.КодСотрудника
ГДЕ
Сотрудники.Код ЕСТЬ NULL
ИЛИ Премии.КодСотрудника ЕСТЬ NULLРезультат:
| Имя | Сумма |
|---|---|
| Сидоров | NULL |
| NULL | 2000 |
Совпавшие Иванов и Петров исчезли из результата.
ПРАВОЕ соединение
Что дает: Все записи из правой таблицы + совпадающие данные из левой. Если слева нет соответствия – поля левой таблицы = NULL.
Это полный аналог Левого содинения, но с переставленными таблицами. На практике почти не используется

Пример: Показать все начисленные премии (даже ошибочные) и, если возможно, имя сотрудника.
ВЫБРАТЬ
Сотрудники.Имя,
Премии.Сумма
ИЗ
Справочник.Сотрудники КАК Сотрудники
ПРАВОЕ СОЕДИНЕНИЕ РегистрСведений.Премии КАК Премии
ПО Сотрудники.Код = Премии.КодСотрудника
Результат:
| Имя | Сумма |
|---|---|
| Иванов | 1000 |
| Петров | 500 |
| NULL | 2000 |
ПРАВОЕ соединение, исключая внутреннее
Что дает: Только те записи из правой таблицы, для которых нет соответствия в левой. То есть «висячие» записи правой таблицы.

Пример: Найти премии, которые начислены на несуществующего сотрудника.
ВЫБРАТЬ
Премии.Сумма,
Премии.КодСотрудника
ИЗ
Справочник.Сотрудники КАК Сотрудники
ПРАВОЕ СОЕДИНЕНИЕ РегистрСведений.Премии КАК Премии
ПО Сотрудники.Код = Премии.КодСотрудника
ГДЕ
Сотрудники.Код ЕСТЬ NULLРезультат:
| Сумма | КодСотрудника |
|---|---|
| 2000 | 5 |
Строки с Ивановым и Петровым отброшены – у них есть совпадение.
Памятка по видам соединения
| Вариант | Что получаем | Условие в WHERE |
|---|---|---|
| ЛЕВОЕ | Все из левой + совпавшие из правой | |
| ЛЕВОЕ исключая ВНУТРЕННЕЕ | Только строки левой без пары | Правое.Поле IS NULL |
| ВНУТРЕННЕЕ | Только строки с парой в обеих таблицах | |
| ПОЛНОЕ | Все строки из обеих таблиц | |
| ПОЛНОЕ исключая ВНУТРЕННЕЕ | Строки без пары (слева + справа) | Левое.Поле IS NULL OR Правое.Поле IS NULL |
| ПРАВОЕ | Все из правой + совпавшие из левой | |
| ПРАВОЕ исключая ВНУТРЕННЕЕ | Только строки правой без пары | Левое.Поле IS NULL |