7.10 На закладке «Связи» конструктора запросов можно определить
Опубликовано: Обновлено:
❓ 7.10 На закладке «Связи» конструктора запросов можно определить:
📚 Документация
Заголовок раздела «📚 Документация»-
ИТС: Руководство разработчика — Спецификация соединения.
🧠 Краткая теория
Заголовок раздела «🧠 Краткая теория»В предыдущем вопросе 7.9 были рассмотрены варианты соединения таблиц в языке запросов 1С. Теперь посмотрим, как соединения настраиваются в конструкторе запроса.
Где задаются связи
Заголовок раздела «Где задаются связи»При использовании нескольких таблиц-источников в конструкторе запроса для настройки их соединения используется закладка «Связи».

В тексте запроса соединения относятся к секции ИЗ:
ВЫБРАТЬ [РАЗРЕШЕННЫЕ] [РАЗЛИЧНЫЕ] [ПЕРВЫЕ <Количество>]
<Список полей выборки>
[ПОМЕСТИТЬ|ДОБАВИТЬ <Имя таблицы>]
[ИЗ <Список источников>]
[ИНДЕКСИРОВАТЬ ПО [НАБОРАМ] <Список полей>]
[ГДЕ <Условие отбора>]
[СГРУППИРОВАТЬ ПО <Поля группировки>]
[ИМЕЮЩИЕ <Условие отбора>]
[ДЛЯ ИЗМЕНЕНИЯ [<Список таблиц верхнего уровня>]]
Именно внутри ИЗ указывается, какие таблицы соединяются, каким способом и по какому условию.
Например:
ИЗ Документ.РеализацияТоваровУслуг КАК Реализация ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты ПО Реализация.Контрагент = Контрагенты.СсылкаЧто содержит строка на закладке «Связи»
Заголовок раздела «Что содержит строка на закладке «Связи»»Каждая строка описывает связь между двумя таблицами по определенному условию.
Основные колонки:
| Колонка | Назначение |
|---|---|
| Таблица 1 | Первая таблица, участвующая в связи |
| Все для таблицы 1 | Требует включать в результат все записи первой таблицы, даже если для них не найдена соответствующая запись второй таблицы |
| Таблица 2 | Вторая таблица, участвующая в связи |
| Все для таблицы 2 | Требует включать в результат все записи второй таблицы, даже если для них не найдена соответствующая запись первой таблицы |
| Произвольно | Позволяет задавать условие связи произвольным выражением |
| Условие связи | Выражение, определяющее, какие записи двух таблиц соответствуют друг другу |
Если на закладке «Связи» добавлена строка связи, для нее необходимо задать условие связи. В тексте запроса такое соединение представляется конструкцией
СОЕДИНЕНИЕ ... ПО <условие>.
Флаги «Все» и вид соединения
Заголовок раздела «Флаги «Все» и вид соединения»Флаги «Все» определяют, должны ли в результат попадать записи таблицы, для которых соответствующая запись другой таблицы не найдена.
| Таблица 1 — «Все» | Таблица 2 — «Все» | Соединение |
|---|---|---|
| нет | нет | внутреннее |
| да | нет | левое внешнее |
| нет | да | правое внешнее |
| да | да | полное внешнее |
Таким образом, флаги «Все» позволяют непосредственно в конструкторе определить тип соединения таблиц.
Условие связи
Заголовок раздела «Условие связи»Условие определяет, по какому признаку записи таблиц сопоставляются друг с другом.
Типичный вариант — равенство полей:
ПО Реализация.Контрагент = Контрагенты.СсылкаУсловие не ограничивается сравнением одного поля. Оно может содержать несколько частей:
ПО Таблица1.Номенклатура = Таблица2.Номенклатура И Таблица1.Склад = Таблица2.СкладКолонка «Произвольно»
Заголовок раздела «Колонка «Произвольно»»Условие связи может быть простым или произвольным.
Для простого условия выбираются поля соединяемых таблиц и операция сравнения.
Если установлено «Произвольно», условие задается выражением. Для его редактирования можно открыть форму «Произвольное выражение».
Например, условие может быть сложнее простого равенства полей:
ПО Таблица1.Дата >= Таблица2.ДатаНачала И Таблица1.Дата <= Таблица2.ДатаОкончанияТаким образом, условие соединения не обязательно имеет вид:
ПолеТаблицы1 = ПолеТаблицы2
Оно может представлять собой более сложное выражение.
Если на закладке «Связи» нет ни одной связи
Заголовок раздела «Если на закладке «Связи» нет ни одной связи»Если в запрос добавлено несколько таблиц, но на закладке «Связи» не задано ни одной строки, конструктор не создает между этими таблицами условие соединения.
В тексте запроса источники будут перечислены в секции ИЗ без условия, связывающего их записи:
ИЗ Справочник.Номенклатура КАК Номенклатура, Справочник.Склады КАК СкладыВ результате получается декартово произведение: каждая запись одной таблицы сочетается с каждой записью другой таблицы.
Таблица 1: 3 записи
Таблица 2: 4 записи
↓
3 × 4 = 12 сочетаний
При большем количестве таблиц источники не обязательно должны быть непосредственно связаны каждый с каждым. Но если одна из таблиц остается независимой от остальных источников запроса, ее записи будут образовывать декартово произведение с результатом, сформированным остальными источниками.
Соединение и объединение — в чем разница
Заголовок раздела «Соединение и объединение — в чем разница»Соединение и объединение — разные механизмы языка запросов.
Соединение связывает записи нескольких таблиц по условию. В результате одна строка может содержать поля из разных таблиц.
Например:
Таблица «Товары» Таблица «Цены»
Товар Наименование Товар Цена
───── ──────────── ───── ────
001 Стол 001 5000
002 Стул 002 2000
СОЕДИНЕНИЕ
ПО Товары.Товар = Цены.Товар
↓
Товар Наименование Цена
───── ──────────── ────
001 Стол 5000
002 Стул 2000
Для соединения используется конструкция СОЕДИНЕНИЕ ... ПО <условие>. В конструкторе запроса соединения настраиваются на закладке «Связи».
Объединение работает иначе: оно объединяет результаты нескольких запросов в один результат. Строки второго результата добавляются к строкам первого.
Например:
Результат запроса 1 Результат запроса 2
Товар Количество Товар Количество
───── ────────── ───── ──────────
Стол 10 Шкаф 3
Стул 20 Диван 5
ОБЪЕДИНИТЬ
↓
Товар Количество
───── ──────────
Стол 10
Стул 20
Шкаф 3
Диван 5
Для этого в языке запросов используются ОБЪЕДИНИТЬ и ОБЪЕДИНИТЬ ВСЕ.
В конструкторе запроса объединение настраивается на вкладке «Объединения/Псевдонимы». Для создания объединения на этой вкладке добавляется новый запрос, результат которого объединяется с результатом основного запроса.
Таким образом, закладка «Связи» используется для соединения таблиц внутри запроса, а вкладка «Объединения/Псевдонимы» — для настройки объединения результатов нескольких запросов.
| Механизм | Что происходит | Где задается в конструкторе |
|---|---|---|
| Соединение | Сопоставляет записи разных таблиц и позволяет получить в одной строке поля из этих таблиц | Закладка «Связи» |
| Объединение | Добавляет строки результатов нескольких запросов в один общий результат | Через добавление объединяемых запросов |
Упрощенно различие можно представить так: соединение добавляет данные по горизонтали, объединение — строки по вертикали.
🧠 Ключевая мысль
Заголовок раздела «🧠 Ключевая мысль»Закладка «Связи» конструктора запроса позволяет определить участвующие в соединении таблицы, условие их связи и с помощью флагов «Все» настроить вид соединения. Для добавленной строки связи условие обязательно; если же между несколькими источниками связь не задана, формируется декартово произведение их записей.