Перейти к содержимому

7.10 На закладке «Связи» конструктора запросов можно определить

Опубликовано: Обновлено:

Telegram → Просто о платформе 1С

❓ 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

Для этого в языке запросов используются ОБЪЕДИНИТЬ и ОБЪЕДИНИТЬ ВСЕ.

В конструкторе запроса объединение настраивается на вкладке «Объединения/Псевдонимы». Для создания объединения на этой вкладке добавляется новый запрос, результат которого объединяется с результатом основного запроса.

Таким образом, закладка «Связи» используется для соединения таблиц внутри запроса, а вкладка «Объединения/Псевдонимы» — для настройки объединения результатов нескольких запросов.

МеханизмЧто происходитГде задается в конструкторе
СоединениеСопоставляет записи разных таблиц и позволяет получить в одной строке поля из этих таблицЗакладка «Связи»
ОбъединениеДобавляет строки результатов нескольких запросов в один общий результатЧерез добавление объединяемых запросов

Упрощенно различие можно представить так: соединение добавляет данные по горизонтали, объединение — строки по вертикали.


Закладка «Связи» конструктора запроса позволяет определить участвующие в соединении таблицы, условие их связи и с помощью флагов «Все» настроить вид соединения. Для добавленной строки связи условие обязательно; если же между несколькими источниками связь не задана, формируется декартово произведение их записей.