Smart1Spec Документация
Studio
СправочникИзучающий Spec1C

Соединения: left_join, inner_join, right_join

Как соединить два источника данных в Spec1C и почему в BSL всегда получается левое соединение.

Перед чтением

  • data Справочник
На этой странице

Соединение связывает два источника данных из блока data { }, чтобы в одном запросе получить поля обоих. В Spec1C его записывают строкой, начинающейся с |>.

Назначение#

Соединение нужно, когда для каждой записи основного источника требуются поля другого объекта: например, для договора — сведения из регистра изменений условий. Соединение описывается внутри блока data { } после объявления обоих источников.

Синтаксис#

Spec1C
|> <вид_соединения> <присоединяемый> on <присоединяемый>.<Поле> == <основной>.<Поле>

Строку соединения обычно пишут после rows = <основной>, но на результат это не влияет — см. rows.

Элементы#

ЭлементОбязателенЧто означает
|>даначало строки соединения
left_join, inner_join, right_joinдавид соединения; в сгенерированном коде всегда левое (см. ниже)
присоединяемый источникдаимя источника из data { }, латиницей
on A.Поле == B.Поледаусловие связи: ровно одно равенство двух полей

Значений по умолчанию нет: если любой элемент пропущен, строка не распознаётся как соединение и молча пропускается.

Пример#

Spec1C
spec1c {
  report contracts
    title:  "Договоры и изменения условий"
    target: ordinary

  data {
    contracts = Справочник.КлиентскиеДоговора
      fields: Ссылка, Код, ДатаДоговора

    amendments = РегистрСведений.ДокументыИзменяющиеУсловияДоговора
      fields: Договор, Период

    rows = contracts
      |> left_join amendments on amendments.Договор == contracts.Ссылка
  }
}

Такой же пример с inner_join разбирается без ошибок, а в модели вид соединения сохраняется как внутреннее:

Spec1C
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#

Независимо от указанного вида, в текст запроса попадает ЛЕВОЕ СОЕДИНЕНИЕ. Фрагмент из живой сборки:

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

Поля присоединённого источника добавляются в список выборки после полей основного. Как запрос встраивается в модуль формы, зависит от target — см. Соответствие конструкций и BSL.

Работа в 1С#

Сгенерированный текст запроса синтаксически соответствует языку запросов 1С. Выполнится ли он, зависит от того, есть ли указанные объекты и поля в вашей конфигурации, — Studio этого не проверяет. В 1С сгенерированный запрос не выполнялся; проверьте файл по шагам Проверить результат в 1С.

Ограничения#

  • Вид соединения в сгенерированном коде всегда левый.
  • Условие связи — только одно равенство двух полей; составные условия (И, ИЛИ) и сравнения кроме == не поддерживаются.
  • Неверная строка соединения пропускается без сообщения об ошибке.
  • Удаление строки соединения из текста не всегда убирает соединение из модели при «Применить без сборки»: модель не очищается, если в новом тексте соединений нет. Надёжнее заменить спецификацию целиком или проверить вкладку Intent → «Данные».

Полный список ограничений языка — Ограничения реализации.

Связанные конструкции#

  • data — источники данных, которые соединяются.
  • fields — выбор полей источника.
  • rows — строка rows, рядом с которой обычно пишут соединение.

См. также

Сверено с продуктом: 27.10.2026

Нашли неточность? Напишите на [email protected] и укажите адрес страницы.

Smart1Spec · документация описывает текущую версию сервиса.