К статье
Практический материал

Разработка и Конфигурация · 11 мин

Внутреннее соединение в 1С: что это такое и как применять

Внутреннее соединение в запросах 1С: синтаксис ВНУТРЕННЕЕ СОЕДИНЕНИЕ, отличия от левого соединения, примеры кода, типичные ошибки и проверка результата.

Внутреннее соединение — это способ объединения двух таблиц в запросе 1С, при котором в результат попадают только те строки, для которых условие связи выполняется в обеих таблицах одновременно. Если в левой таблице есть запись, а в правой подходящей пары нет, такая строка просто отбрасывается. Именно этим внутреннее соединение отличается от левого, правого и полного соединений.

На практике внутреннее соединение применяется, когда нужны только «пересекающиеся» данные: например, список товаров, по которым были движения, или сотрудники, у которых заполнены данные о подразделении. Все «висячие» записи без пары в результат не попадут, что часто и требуется для отчётов по фактическим операциям.

В языке запросов 1С соединение описывается в секции ИЗ через конструкцию ВНУТРЕННЕЕ СОЕДИНЕНИЕ с указанием условия после ключевого слова ПО. В конструкторе запроса тот же результат получается на закладке «Связи» выбором типа связи «Внутреннее соединение».

Что такое внутреннее соединение простыми словами

Представьте два списка: справочник «Номенклатура» и таблицу продаж. Если соединить их внутренним соединением по ссылке на товар, в результат попадут только те товары, которые реально продавались. Позиции номенклатуры без продаж исчезнут из выборки, как если бы их не существовало.

Это поведение одновременно и удобно, и опасно. Удобно — когда нужен именно факт наличия связи. Опасно — когда разработчик ожидает увидеть все записи основной таблицы, а получает усечённый результат и не сразу понимает, куда пропали данные.

Математически внутреннее соединение — это пересечение множеств по ключу связи. Если условие связи составное (по нескольким полям), строка попадёт в результат только при совпадении всех условий одновременно.

Синтаксис внутреннего соединения в запросе 1С

Базовая конструкция выглядит так: сначала указывается основная таблица, затем ключевые слова ВНУТРЕННЕЕ СОЕДИНЕНИЕ, присоединяемая таблица с псевдонимом и условие после слова ПО.

ВЫБРАТЬ

Товары.Ссылка КАК Товар,

Продажи.Количество КАК Количество

ИЗ

Справочник.Номенклатура КАК Товары

ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты КАК Продажи

ПО Товары.Ссылка = Продажи.Номенклатура

Ключевое слово ВНУТРЕННЕЕ можно опустить — простое СОЕДИНЕНИЕ по умолчанию работает как внутреннее. Однако явное указание типа считается хорошей практикой: текст запроса читается однозначно, и при ревизии кода не возникает вопросов о намерениях автора.

Условие связи может быть составным: несколько равенств объединяются через И. Допускаются и другие операторы сравнения, но на практике неравенства в условиях соединения почти всегда приводят к декартову взрыву строк и резкому падению производительности.

Чем внутреннее соединение отличается от других типов

Выбор типа соединения определяет, какие строки попадут в результат и появятся ли в нём значения NULL. Ошибка в выборе типа — одна из самых частых причин «пропавших» или «лишних» данных в отчётах.

Тип соединенияЧто попадает в результатКогда применять
ВнутреннееТолько строки с парой в обеих таблицахНужны только факты совпадения: проданные товары, проведённые документы с движениями
ЛевоеВсе строки левой таблицы плюс совпадения справа; при отсутствии пары — NULLНужен полный список основной таблицы с дополнительными данными, если они есть
ПравоеВсе строки правой таблицы плюс совпадения слеваРедко; обычно проще поменять таблицы местами и использовать левое
ПолноеВсе строки обеих таблиц, несовпавшие — с NULLСверка двух источников: найти расхождения в обе стороны

Классическая ошибка — использовать внутреннее соединение там, где нужно левое. Например, в отчёте по остаткам склада соединяют товары с остатками внутренним соединением, и товары с нулевым остатком исчезают из отчёта. Для такой задачи корректно левое соединение с обработкой NULL через ЕСТЬNULL.

Внутреннее или левое соединение

Внутреннее

Подходит, когда запись без пары бессмысленна для отчёта. Ограничение: «тихо» отбрасывает строки, легко не заметить потерю данных.

Левое

Подходит, когда основная таблица должна быть показана целиком. Требует обработки NULL через ЕСТЬNULL и проверки ЕСТЬ NULL в условиях.

Как настроить внутреннее соединение в конструкторе запроса

Конструктор запроса позволяет настроить соединение без ручного написания текста. Это удобно для проверки логики и для тех, кто только осваивает язык запросов.

Настройка соединения в конструкторе
  1. 1
    Откройте конструктор запроса и добавьте обе таблицы на закладке «Таблицы и поля».
  2. 2
    Перетащите нужные поля в список выбора.
  3. 3
    Перейдите на закладку «Связи» — конструктор часто создаёт связь автоматически по ссылочному полю.
  4. 4
    Проверьте тип связи: снимите флажок «Все» у обеих таблиц — это и есть внутреннее соединение. Флажок «Все» у первой таблицы превращает связь в левое соединение.
  5. 5
    Проверьте условие связи: при необходимости добавьте дополнительные поля в условие.
  6. 6
    Нажмите «ОК» и выполните запрос в консоли запросов, сравнив количество строк с исходными таблицами.

Важный нюанс конструктора: автоматически созданная связь по умолчанию часто является левой, потому что у первой таблицы установлен флажок «Все». Если нужно именно внутреннее соединение, флажки «Все» должны быть сняты у обеих таблиц.

После настройки всегда открывайте текст запроса и смотрите, что реально сгенерировал конструктор. Это помогает выучить синтаксис и поймать случаи, когда конструктор добавил лишние условия или не тот тип связи.

Типичные сценарии применения

Отбор только объектов с движениями

Самый частый сценарий — отчёт по продажам, оборотам, начислениям. Внутреннее соединение справочника с виртуальной таблицей оборотов регистра автоматически отсекает позиции без операций за период, что сокращает выборку и упрощает группировку.

Связь документа с табличной частью

При соединении шапки документа с его табличной частью внутреннее соединение отбросит документы с пустой табличной частью. Иногда это желаемое поведение, но для отчёта «все документы» оно даст потерю данных — тогда нужно левое соединение.

Проверка соответствия двух источников

Внутреннее соединение удобно для поиска совпадений между двумя системами учёта: например, найти контрагентов, присутствующих и в справочнике, и в таблице загруженных из внешнего файла данных. Несовпавшие записи в выборку не попадут.

Перед выбором типа соединения задайте себе вопрос: «Должна ли строка попасть в отчёт, если пары для неё нет?» Если ответ «нет» — внутреннее соединение. Если «да» — левое с обработкой NULL. Этот простой вопрос исключает большинство ошибок.
ПЗ
Практическое замечание

Ошибки и ограничения внутреннего соединения

Главная опасность внутреннего соединения — неявная потеря строк. Запрос выполняется без ошибок, отчёт выглядит правдоподобно, но часть данных отсутствует. Обнаруживается это обычно при сверке с бухгалтерией, когда суммы не сходятся.

Вторая группа проблем — дублирование строк. Если в правой таблице несколько записей соответствуют одной записи левой (например, соединение с регистром сведений без отбора по периоду или без среза последних), каждая строка левой таблицы размножится, и итоги по суммовым полям задвоятся или ещё сильнее завысятся.

Типичные ошибки
01
Внутреннее соединение вместо левого — из отчёта пропадают объекты без движений, итоги занижены.
02
Соединение с регистром сведений без среза последних — строки дублируются, суммы завышаются.
03
Соединение по неуникальному полю с обеих сторон — декартово произведение, резкий рост выборки и падение производительности.
04
Условия по правой таблице в секции ГДЕ вместо условия соединения — при левом соединении это фактически превращает его во внутреннее.
05
Соединение по полям разного типа или по строковым полям с разной длиной — условие не срабатывает, результат пустой.

Производительность тоже стоит учитывать. Внутреннее соединение больших таблиц без индексированных полей связи выполняется долго. Соединяйте по ссылочным полям и измерениям регистров — они индексированы платформой, а вот соединение по реквизитам или строковым представлениям работает заметно медленнее.

Как проверить, что соединение работает правильно

Базовая проверка — сравнение количества строк. Выполните запрос с внутренним соединением и отдельно запрос по основной таблице. Разница в количестве строк должна объясняться: это записи без пары. Если объяснить разницу не можете, в запросе ошибка.

Вторая проверка — контроль дублей. Сгруппируйте результат по ключевым полям связи с подсчётом количества: если по одному ключу больше одной строки там, где ожидалась одна, правая таблица содержит несколько соответствий и итоги могут быть завышены.

Контрольные точки

Как проверить результат

Количество строк результата
Норма

Меньше или равно количеству строк основной таблицы, разница объяснима отсутствием пар

Тревожный признак

Строк больше, чем в основной таблице, без понятной причины — вероятно дублирование

Итоговые суммы
Норма

Совпадают с контрольным отчётом или суммой по регистру

Тревожный признак

Суммы кратно завышены — соединение размножает строки

Поле связи в результате
Норма

Не содержит NULL — при внутреннем соединении пара гарантирована

Тревожный признак

Есть NULL — значит, тип соединения не внутренний или условие составлено неверно

Полезный приём — временно заменить внутреннее соединение на полное и посмотреть записи с NULL с любой стороны. Это покажет, какие данные теряются, и поможет принять осознанное решение о типе соединения.

Итог

Что важно запомнить

Внутреннее соединение оставляет только строки с парой в обеих таблицах. Применяйте его, когда записи без связи не нужны по смыслу отчёта. Всегда проверяйте результат на потерю строк и на дублирование, соединяйте таблицы по индексированным полям.

Частые вопросы о внутреннем соединении в 1С

Чем отличается ВНУТРЕННЕЕ СОЕДИНЕНИЕ от просто СОЕДИНЕНИЕ?

Ничем по поведению: если тип не указан, платформа выполняет внутреннее соединение. Явное написание ВНУТРЕННЕЕ СОЕДИНЕНИЕ предпочтительнее, потому что делает намерение разработчика очевидным при чтении кода.

Почему после внутреннего соединения пропали часть товаров из отчёта?

Потому что у этих товаров нет записей в присоединяемой таблице — например, не было продаж за период. Внутреннее соединение отбрасывает такие строки. Если нужны все товары, замените соединение на левое и обработайте NULL функцией ЕСТЬNULL.

Можно ли соединять больше двух таблиц внутренним соединением?

Да, соединения можно перечислять последовательно — результат первого соединения соединяется со следующей таблицей и так далее. На каждом шаге действует то же правило: остаются только строки, нашедшие пару. Следите за порядком и не допускайте размножения строк.

Что быстрее: внутреннее или левое соединение?

Однозначного ответа нет — скорость зависит от объёма таблиц, индексов и условий. На практике внутреннее соединение часто позволяет оптимизатору раньше отсечь лишние строки, но заменять левое на внутреннее ради производительности без анализа смысла данных нельзя.

Как соединить таблицу значений с таблицей базы данных?

Передайте таблицу значений в запрос через параметр, поместите её во временную таблицу (конструкция ПОМЕСТИТЬ), а затем соедините с таблицей базы обычным внутренним соединением по нужному полю. Для ускорения можно создать индекс временной таблицы через ИНДЕКСИРОВАТЬ ПО.

Почему условие по полю правой таблицы в секции ГДЕ даёт эффект внутреннего соединения?

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