Smart1Spec Документация
Studio
ОбучениеИзучающий Spec1C

Урок 4. Соединения и период

Как соединить два источника и задать отбор по периоду в Spec1C, почему в коде всегда левое соединение и каких реквизитов не хватает новому файлу.

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

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

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

Цель урока#

После урока вы сможете:

  • соединить два источника строкой |>;
  • задать поле периода через where или filter period;
  • понять, что нужно доделать в Конфигураторе, чтобы сгенерированный запрос выполнился.

Что нужно знать#

  • Источники и поля — Урок 2. Источники данных и поля. Второй источник попадает в запрос только через соединение.
  • Имена объектов и полей в примере — из типовой конфигурации. В вашей конфигурации они должны существовать; Studio в облаке их не проверяет.

Объяснение#

Соединение#

Строка соединения пишется внутри data { }, после объявления обоих источников:

Spec1C
|> left_join <присоединяемый> on <источник>.<Поле> == <источник>.<Поле>
  • Вид — left_join, inner_join или right_join. Все три принимаются и сохраняются в модели, но в коде всегда получается ЛЕВОЕ СОЕДИНЕНИЕ. Если нужно внутреннее или правое соединение, исправьте текст запроса в Конфигураторе после скачивания.
  • Условие — ровно одно равенство двух полей через ==. Одинарное =, составные условия и другие сравнения не поддерживаются: такая строка молча пропускается.
  • Строку соединения обычно пишут после rows = <источник>. Строка rows разбирается и сохраняется, но ни на модель, ни на код не влияет — rows.

Подробно — Соединения: left_join, inner_join, right_join.

Период#

Поле периода задаётся одной из двух строк:

Spec1C
where <Поле> between <что угодно>
filter period on <Поле>

Studio запоминает только имя поля. Остальная часть строки (between ПериодОтчета) и префикс источника (sales.Дата) не используются. Таблицу поля Studio определяет по спискам fields:: поле берётся из того источника, у которого оно указано, иначе — из первого источника. Если в тексте есть и where, и filter period, используется where.

В коде появляется условие ГДЕ <Таблица>.<Поле> МЕЖДУ &ДатаНачПериода И &ДатаКонПериода и установка параметров из переменных ДатаНачПериода и ДатаКонПериода.

Полный пример#

Spec1C
spec1c {
  report sales
    title:  "Реализации и контрагенты"
    target: ordinary

  data {
    sales = Документ.РеализацияТоваровУслуг
      fields: Ссылка, Номер, Дата, Контрагент

    partners = Справочник.Контрагенты
      fields: ИНН

    rows = sales
      |> left_join partners on partners.Ссылка == sales.Контрагент

    where Дата between ПериодОтчета
  }
}

Разбор примера#

СтрокаЧто происходит
sales = Документ.РеализацияТоваровУслугОсновной источник — первый в ИЗ
partners = Справочник.КонтрагентыПрисоединяемый источник с полем ИНН
rows = salesСохраняется, на результат не влияет
|> left_join partners on partners.Ссылка == sales.КонтрагентСоединение по ссылке на контрагента
where Дата between ПериодОтчетаПоле периода — Дата источника sales (оно есть в его fields)

Сгенерированный запрос (такой же получится и с inner_join):

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

Тот же пример с filter period on вместо where даёт то же поле периода:

Spec1C
report sales
  target: ordinary
data {
  sales = Документ.РеализацияТоваровУслуг
    fields: Ссылка, Дата, Контрагент
  partners = Справочник.Контрагенты
    fields: ИНН
  |> inner_join partners on partners.Ссылка == sales.Контрагент
  filter period on sales.Дата
}

Ожидаемый результат#

После «Ещё» → «Применить без сборки» — уведомление «Spec1C → модель · источников 2». На этапе Intent на вкладке «Данные» — две карточки источников и связь между ними с видом соединения, например «· left_join». При сборке Studio попросит подтверждение (источников: 2).

УровеньЧто получится
РазборОшибок и предупреждений нет
МодельДва источника, одно соединение с видом из текста, поле периода Дата, строка rows
ПроверкаНе проверяется, что поля связи и поле периода существуют и совместимы по типу
Код BSLЛЕВОЕ СОЕДИНЕНИЕ при любом виде; условие МЕЖДУ и параметры периода
Работа в 1СНе проверялась. Без реквизитов ДатаНачПериода и ДатаКонПериода ожидаема ошибка; с inner_join в результат попадут и строки без пары

Типичные ошибки#

Что видноПричинаЧто сделать
Соединения нет ни на вкладке «Данные», ни в запросеВ условии = вместо ==, нет on, условие из двух равенствРовно одно A.Поле == B.Поле
Соединение есть в модели, но не в запросеВ условии идентификатор, которого нет среди источников dataИспользуйте идентификаторы источников из этого же блока
В 1С ошибка в запросе про поле второго источникаСоединение не распознано, а поля второго источника есть в ВЫБРАТЬИсправьте строку соединения
Отбор по периоду взят не из той таблицыПоле периода не указано в fields нужного источникаДобавьте поле периода в fields своего источника
Удалили where, а ГДЕ … МЕЖДУ в коде осталсяУдаление строки не очищает поле периода в модели — наблюдалось на живой сборкеЧтобы убрать отбор, начните с нового файла (Создать новую обработку или отчёт); заменить поле другим можно новой строкой where
Нужно ВНУТРЕННЕЕ СОЕДИНЕНИЕВ коде всегда левоеЗамените вид соединения в Конфигураторе

Упражнение#

  1. Примените полный пример и соберите файл. В модуле формы найдите ЛЕВОЕ СОЕДИНЕНИЕ и МЕЖДУ.
  2. Замените left_join на right_join, примените и соберите. Сравните тексты запросов: они совпадут.
  3. Замените == в условии на =, примените. Ошибки не будет; откройте вкладку «Данные» и убедитесь, что вид связи не изменился — модель сохранила прежнее соединение, потому что новое не распознано. Верните ==.

Следующий урок#

Урок 5. Вывод: макет и Excel — вывод: макет и Excel.

См. также

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

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

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