Добавить соединение и отбор по периоду
Как связать два источника данных и добавить отбор по периоду, что получится в запросе и что доделать в 1С.
Перед чтением
- Добавить или удалить источник данных Руководство
На этой странице
Соединение позволяет получить в одном запросе поля двух источников, а отбор по периоду — оставить только записи, у которых дата попадает в интервал. Обе конструкции пишутся внутри блока data { }. Ниже — порядок действий и то, что потребуется доделать в 1С после сборки.
Когда это нужно#
- К основному источнику нужно присоединить связанный объект, например регистр сведений по договору.
- Запрос должен выбирать записи только за период — например, договоры с датой в заданном интервале.
Перед началом#
- В блоке
data { }уже есть оба источника с полями — см. Добавить или удалить источник данных. - Вы знаете поля связи: у какого поля присоединяемого источника значение равно какому полю основного (например,
Договор=Ссылка). - Для отбора нужно поле с датой в одном из источников, и оно должно быть в строке
fields:.
Шаги#
- Ниже обоих источников добавьте строку
rows = <основной>. На результат она не влияет, но делает текст понятнее. - Под ней добавьте строку соединения:
|> left_join <присоединяемый> on <присоединяемый>.<Поле> == <основной>.<Поле>. Сравнение пишется двумя знаками==. - Ниже добавьте строку отбора:
where <ПолеДаты> between ПериодTилиfilter period on <ПолеДаты>. - Нажмите «Ещё» → «Применить без сборки» и проверьте уведомление: в нём должно быть «источников 2». Связь видна на вкладке Intent → «Данные», например «Договор = Ссылка · left_join».
- Нажмите «Собрать .epf» и скачайте файл — Собрать файл .epf или .erf, Скачать собранный файл.
spec1c {
report contracts
title: "Договоры и изменения условий"
target: ordinary
data {
contracts = Справочник.КлиентскиеДоговора
fields: Ссылка, Код, ДатаДоговора
amendments = РегистрСведений.ДокументыИзменяющиеУсловияДоговора
fields: Договор, Период
rows = contracts
|> left_join amendments on amendments.Договор == contracts.Ссылка
where ДатаДоговора between ПериодT
}
}Тот же отбор можно записать другой строкой — результат одинаковый:
spec1c {
report contracts
data {
contracts = Справочник.КлиентскиеДоговора
fields: Ссылка, ДатаДоговора
filter period on ДатаДоговора
}
}Результат#
В модуль формы собранного файла попадает запрос такого вида (фрагмент живой сборки, служебные комментарии убраны):
"ВЫБРАТЬ
| КлиентскиеДоговора.Ссылка КАК Ссылка,
| КлиентскиеДоговора.Код КАК Код,
| КлиентскиеДоговора.ДатаДоговора КАК ДатаДоговора,
| ДокументыИзменяющиеУсловияДоговора.Договор КАК Договор,
| ДокументыИзменяющиеУсловияДоговора.Период КАК Период
|ИЗ
| Справочник.КлиентскиеДоговора КАК КлиентскиеДоговора
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДокументыИзменяющиеУсловияДоговора КАК ДокументыИзменяющиеУсловияДоговора
| ПО ДокументыИзменяющиеУсловияДоговора.Договор = КлиентскиеДоговора.Ссылка
|ГДЕ
| КлиентскиеДоговора.ДатаДоговора МЕЖДУ &ДатаНачПериода И &ДатаКонПериода
|";
Запрос.УстановитьПараметр("ДатаНачПериода", ДатаНачПериода);
Запрос.УстановитьПараметр("ДатаКонПериода", ДатаКонПериода);Что важно знать о результате:
- Вид соединения всегда левый.
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С ошибка про ДатаНачПериода | Добавьте реквизиты периода в обработку в Конфигураторе (см. выше) |
См. также
- Соединения: left_join, inner_join, right_join Справочник
- where и filter period Справочник
- Соответствие конструкций и BSL Справочник
- Ограничения реализации Справочник
- Проверить результат в 1С Руководство
Сверено с продуктом: 27.10.2026