Smart1Spec Документация
Studio
РуководствоИзучающий Spec1C

Добавить соединение и отбор по периоду

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

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

На этой странице

Соединение позволяет получить в одном запросе поля двух источников, а отбор по периоду — оставить только записи, у которых дата попадает в интервал. Обе конструкции пишутся внутри блока data { }. Ниже — порядок действий и то, что потребуется доделать в 1С после сборки.

Когда это нужно#

  • К основному источнику нужно присоединить связанный объект, например регистр сведений по договору.
  • Запрос должен выбирать записи только за период — например, договоры с датой в заданном интервале.

Перед началом#

  • В блоке data { } уже есть оба источника с полями — см. Добавить или удалить источник данных.
  • Вы знаете поля связи: у какого поля присоединяемого источника значение равно какому полю основного (например, Договор = Ссылка).
  • Для отбора нужно поле с датой в одном из источников, и оно должно быть в строке fields:.

Шаги#

  1. Ниже обоих источников добавьте строку rows = <основной>. На результат она не влияет, но делает текст понятнее.
  2. Под ней добавьте строку соединения: |> left_join <присоединяемый> on <присоединяемый>.<Поле> == <основной>.<Поле>. Сравнение пишется двумя знаками ==.
  3. Ниже добавьте строку отбора: where <ПолеДаты> between ПериодT или filter period on <ПолеДаты>.
  4. Нажмите «Ещё» → «Применить без сборки» и проверьте уведомление: в нём должно быть «источников 2». Связь видна на вкладке Intent → «Данные», например «Договор = Ссылка · left_join».
  5. Нажмите «Собрать .epf» и скачайте файл — Собрать файл .epf или .erf, Скачать собранный файл.
Spec1C
spec1c {
  report contracts
    title:  "Договоры и изменения условий"
    target: ordinary

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

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

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

    where ДатаДоговора between ПериодT
  }
}

Тот же отбор можно записать другой строкой — результат одинаковый:

Spec1C
spec1c {
  report contracts
  data {
    contracts = Справочник.КлиентскиеДоговора
      fields: Ссылка, ДатаДоговора
    filter period on ДатаДоговора
  }
}

Результат#

В модуль формы собранного файла попадает запрос такого вида (фрагмент живой сборки, служебные комментарии убраны):

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

Что важно знать о результате:

  • Вид соединения всегда левый. inner_join и right_join сохраняются в модели, но в запрос попадает ЛЕВОЕ СОЕДИНЕНИЕ — Соединения: left_join, inner_join, right_join.
  • Из строки отбора берётся только имя поля. Всё после него (between ПериодT) игнорируется; границы всегда &ДатаНачПериода и &ДатаКонПериода. Поле ищется среди полей источников; если его нет ни в одной строке fields:, оно относится к первому источнику — where и filter period.
  • Реквизитов периода в новом файле нет. Код обращается к ДатаНачПериода и ДатаКонПериода, но в собранном новом файле таких реквизитов нет. Добавьте их в обработку в Конфигураторе (тип «Дата») или не используйте отбор по периоду. Иначе в 1С ожидаема ошибка о неопределённой переменной.

Как проверить файл в 1С — Проверить результат в 1С.

Если не получилось#

Что видноПричина и что сделать
Соединения нет на вкладке Intent → «Данные» и в запросеСтрока не распознана: одинарный = вместо ==, нет части on … или имя источника не из блока data. Ошибки при этом не выводится — исправьте строку по Соединения: left_join, inner_join, right_join
Нужен внутренний или правый вид соединенияПосле скачивания замените в Конфигураторе ЛЕВОЕ СОЕДИНЕНИЕ на нужный вид
Удалили строку where, а отбор остался в собранном файлеОтбор не очищается удалением строки. Укажите другое поле или создайте новый файл — см. Добавить или удалить источник данных
Удалили строку |>, а связь осталась в моделиЕсли в тексте не осталось ни одного соединения, прежнее сохраняется. Замените его другим соединением — Ограничения реализации
В 1С ошибка про ДатаНачПериодаДобавьте реквизиты периода в обработку в Конфигураторе (см. выше)

См. также

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

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

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