Соединения: left_join, inner_join, right_join
Как соединить два источника данных в Spec1C и почему в BSL всегда получается левое соединение.
Перед чтением
- data Справочник
На этой странице
Соединение связывает два источника данных из блока data { }, чтобы в одном запросе получить поля обоих. В Spec1C его записывают строкой, начинающейся с |>.
Назначение#
Соединение нужно, когда для каждой записи основного источника требуются поля другого объекта: например, для договора — сведения из регистра изменений условий. Соединение описывается внутри блока data { } после объявления обоих источников.
Синтаксис#
|> <вид_соединения> <присоединяемый> on <присоединяемый>.<Поле> == <основной>.<Поле>Строку соединения обычно пишут после rows = <основной>, но на результат это не влияет — см. rows.
Элементы#
| Элемент | Обязателен | Что означает |
|---|---|---|
|> | да | начало строки соединения |
left_join, inner_join, right_join | да | вид соединения; в сгенерированном коде всегда левое (см. ниже) |
| присоединяемый источник | да | имя источника из data { }, латиницей |
on A.Поле == B.Поле | да | условие связи: ровно одно равенство двух полей |
Значений по умолчанию нет: если любой элемент пропущен, строка не распознаётся как соединение и молча пропускается.
Пример#
spec1c {
report contracts
title: "Договоры и изменения условий"
target: ordinary
data {
contracts = Справочник.КлиентскиеДоговора
fields: Ссылка, Код, ДатаДоговора
amendments = РегистрСведений.ДокументыИзменяющиеУсловияДоговора
fields: Договор, Период
rows = contracts
|> left_join amendments on amendments.Договор == contracts.Ссылка
}
}Такой же пример с inner_join разбирается без ошибок, а в модели вид соединения сохраняется как внутреннее:
spec1c {
report contracts
data {
contracts = Справочник.КлиентскиеДоговора
fields: Ссылка, Код
amendments = РегистрСведений.ДокументыИзменяющиеУсловияДоговора
fields: Договор
rows = contracts
|> inner_join amendments on amendments.Договор == contracts.Ссылка
}
}Что принимает разбор#
- Все три вида:
left_join,inner_join,right_join. - Имена источников — латинские идентификаторы из
data { }; имена полей — как в конфигурации (кириллица допустима). - Несколько строк
|>подряд — каждая становится отдельным соединением. - Строка без
on … == …или с одинарным=вместо==не распознаётся и не вызывает ошибку — соединение просто не появится в модели. Проверьте уведомление после «Применить без сборки»: в нём указано число источников. На вкладке Intent → «Данные» между карточками источников видна связь полей (например «Договор = Ссылка»); подпись вида соединения на этой вкладке сейчас всегда показываетleft_join, даже если в спецификации указаныinner_joinилиright_join.
Что попадает в модель#
Для каждого соединения сохраняются: вид (left_join, inner_join или right_join), присоединяемый источник и пара полей связи. Фактический вид хранится в модели; вкладка Intent → «Данные» вид пока не отражает верно (всегда left_join).
Что проверяется#
Studio не проверяет, что источники и поля существуют в конфигурации: в облачной среде конфигурация не загружается. Опечатка в имени поля обнаружится только в 1С при выполнении запроса. Не проверяется и то, что поля связи совместимы по типу.
Что генерируется в BSL#
Независимо от указанного вида, в текст запроса попадает ЛЕВОЕ СОЕДИНЕНИЕ. Фрагмент из живой сборки:
"ВЫБРАТЬ
| КлиентскиеДоговора.Ссылка КАК Ссылка,
| КлиентскиеДоговора.Код КАК Код,
| ДокументыИзменяющиеУсловияДоговора.Договор КАК Договор,
| ДокументыИзменяющиеУсловияДоговора.Период КАК Период
|ИЗ
| Справочник.КлиентскиеДоговора КАК КлиентскиеДоговора
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДокументыИзменяющиеУсловияДоговора КАК ДокументыИзменяющиеУсловияДоговора
| ПО ДокументыИзменяющиеУсловияДоговора.Договор = КлиентскиеДоговора.Ссылка"Поля присоединённого источника добавляются в список выборки после полей основного. Как запрос встраивается в модуль формы, зависит от target — см. Соответствие конструкций и BSL.
Работа в 1С#
Сгенерированный текст запроса синтаксически соответствует языку запросов 1С. Выполнится ли он, зависит от того, есть ли указанные объекты и поля в вашей конфигурации, — Studio этого не проверяет. В 1С сгенерированный запрос не выполнялся; проверьте файл по шагам Проверить результат в 1С.
Ограничения#
- Вид соединения в сгенерированном коде всегда левый.
- Условие связи — только одно равенство двух полей; составные условия (
И,ИЛИ) и сравнения кроме==не поддерживаются. - Неверная строка соединения пропускается без сообщения об ошибке.
- Удаление строки соединения из текста не всегда убирает соединение из модели при «Применить без сборки»: модель не очищается, если в новом тексте соединений нет. Надёжнее заменить спецификацию целиком или проверить вкладку Intent → «Данные».
Полный список ограничений языка — Ограничения реализации.
Связанные конструкции#
- data — источники данных, которые соединяются.
- fields — выбор полей источника.
- rows — строка
rows, рядом с которой обычно пишут соединение.
См. также
- fields Справочник
- rows Справочник
- Соответствие конструкций и BSL Справочник
- Матрица поддержки конструкций Справочник
- Ограничения реализации Справочник
Сверено с продуктом: 27.10.2026