Чем отличается левое соединение от внутреннего и полного в запросах 1С?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
JOIN типы в запросах 1С: Левое, Внутреннее и Полное соединение
В 1С используются три основных типа соединения таблиц (JOIN), которые определяют, какие строки будут выбраны при объединении источников данных.
Внутреннее соединение (INNER JOIN)
Внутреннее соединение возвращает только те строки, которые имеют совпадения в обеих таблицах:
ВЫБРАТЬ
Документы.Накладные.Номер,
Документы.Накладные.Дата,
Справочники.Контрагенты.Наименование
ИЗ
Документ.Накладная Как Накладные
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Контрагенты Как Контрагенты
ПО Накладные.Контрагент = Контрагенты.Ссылка
- Результат: только строки, где контрагент найден
- Исключает: накладные без контрагента, контрагентов без накладных
- Использование: когда нужны только полные записи с заполненными ссылками
- Пример: получить все счета с указанными контрагентами
Визуально (диаграмма Венна):
Таблица А Таблица В
[ A ∩ B ]
Пересечение двух множеств — только совпадающие записи.
Левое соединение (LEFT JOIN)
Левое соединение возвращает все строки из левой таблицы и совпадающие строки из правой:
ВЫБРАТЬ
Документы.Накладные.Номер,
Документы.Накладные.Дата,
Справочники.Контрагенты.Наименование
ИЗ
Документ.Накладная Как Накладные
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты Как Контрагенты
ПО Накладные.Контрагент = Контрагенты.Ссылка
- Результат: все накладные, даже если контрагент не заполнен
- Поля правой таблицы: будут пусты (NULL) если совпадения нет
- Использование: когда нужно сохранить все записи из левой таблицы
- Пример: получить все накладные, включая те, которые не имеют контрагента
Визуально:
Таблица А Таблица В
[ A ∪ (A ∩ B) ]
Вся левая таблица + её пересечение с правой.
Полное соединение (FULL JOIN)
Полное соединение возвращает все строки из обеих таблиц:
ВЫБРАТЬ
Документы.Накладные.Номер,
Документы.Накладные.Дата,
Справочники.Контрагенты.Наименование
ИЗ
Документ.Накладная Как Накладные
ПОЛНОЕ СОЕДИНЕНИЕ Справочник.Контрагенты Как Контрагенты
ПО Накладные.Контрагент = Контрагенты.Ссылка
- Результат: все накладные И все контрагенты
- Пустые поля: как в левой, так и в правой части при отсутствии совпадения
- Использование: редко, когда нужна полная статистика обеих таблиц
- Пример: найти контрагентов, которые никогда не получали накладных
Визуально:
Таблица А Таблица В
[ A ∪ B ]
Объединение двух множеств — все записи из обеих таблиц.
Сравнительная таблица
| Характеристика | INNER JOIN | LEFT JOIN | FULL JOIN |
|---|---|---|---|
| Левая таблица | Только совпадения | Все записи | Все записи |
| Правая таблица | Только совпадения | Только совпадения | Все записи |
| Строки без пары | Исключены | Сохранены (левые) | Сохранены (обе) |
| NULL поля | Нет | Могут быть (правые) | Могут быть (обе) |
| Производительность | Лучше | Средняя | Медленнее |
| Типичный случай | Обязательные связи | Опциональные ссылки | Полная статистика |
Практические примеры
Пример 1: INNER JOIN — только полные данные
// Получить расходы только по заполненным статьям затрат
ВЫБРАТЬ
РегистрСведений.Расходы.Сумма,
СтатьяЗатрат.Наименование
ИЗ
РегистрСведений.Расходы
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.СтатьиЗатрат Как СтатьяЗатрат
ПО РегистрСведений.Расходы.Статья = СтатьяЗатрат.Ссылка
ГДЕ
РегистрСведений.Расходы.Период >= &ДатаНачала
Пример 2: LEFT JOIN — все записи с опциональной информацией
// Получить всех сотрудников с их должностями (если указаны)
ВЫБРАТЬ
Сотрудники.ФИО,
ИFNULL(Должности.Наименование, "Не указана") Как Должность
ИЗ
Справочник.Сотрудники Как Сотрудники
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Должности Как Должности
ПО Сотрудники.Должность = Должности.Ссылка
ГДЕ
Сотрудники.ПометкаУдаления = ЛОЖЬ
Пример 3: FULL JOIN — поиск несоответствий
// Найти контрагентов без накладных и накладных без контрагентов
ВЫБРАТЬ
Контрагенты.Наименование,
КОЛИЧЕСТВО(Накладные.Номер) Как КолНакладных
ИЗ
Справочник.Контрагенты Как Контрагенты
ПОЛНОЕ СОЕДИНЕНИЕ Документ.Накладная Как Накладные
ПО Контрагенты.Ссылка = Накладные.Контрагент
ГДЕ
Контрагенты.ПометкаУдаления = ЛОЖЬ
ГРУППИРОВАТЬ ПО
Контрагенты.Наименование
Советы оптимизации
- Используй INNER JOIN по умолчанию — он быстрее и требует меньше памяти
- LEFT JOIN для опциональных связей — когда ссылка может быть незаполнена
- Избегай FULL JOIN — часто можно заменить на UNION двух LEFT JOIN
- Индексы на колонки соединения — улучшат производительность запроса
- Ограничивай результаты WHERE — уменьшай количество объединяемых строк
Частая ошибка
// ❌ НЕПРАВИЛЬНО: забыли про опциональные ссылки
ВЫБРАТЬ * ИЗ Документ.Счёт
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Контрагенты
// → потеряем все счета без контрагента
// ✅ ПРАВИЛЬНО: используем LEFT для опциональных
ВЫБРАТЬ * ИЗ Документ.Счёт
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты
// → сохраняем все счета
Выбор типа JOIN определяет корректность выборки данных, поэтому важно понимать бизнес-логику и семантику отношений между таблицами.