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