Язык запросов 1С позволяет сделать соединения двух и более таблиц. Под соединением понимается состыковка двух таблиц по ключевым полям.
Быстрый переход
Всего 4 вида соединений
- Полное соединение — в результате получается одна таблица, содержащая все выбранные колонки, обычно число строк равняется количеству совпадающих по ключам строк плюс все несовпадающие.
- Левое соединение — на выходе будет выбранные поля обеих таблиц (полностью первой и совпадающие по ключам соединения второй), количество строк всегда больше или равно количеству в первой таблице (условие соединения может вызывать дубли, если в правой таблице поля соединения дублируются))
- Правое соединение — обратное левому (главная таблица вторая).
- Внутреннее соединение — количество строк такой таблице равно количеству совпадающих по условию объединения строк.
Возможно выборка всех полей объединяемых таблиц (обращение к ним по псевдониму), но если соединение не внутреннее, то в отсутствующем поле будет значение NULL, поэтому следует рассматривать его особым образом или подменять значение через функцию ЕстьNULL().
Условием соединения может быть и простое условие «ИСТИНА», которое соединит таблицы с значительным увеличением количества строк (каждая строка соединится с каждой строкой второй таблицы).
[qu_note note_color=»#f7ebe6″]Такие запросы на больших источниках может вызвать нехватку памяти, либо длительно выполнятся, вплоть до «зависания».[/qu_note]Различные виды объединений используются для своих своих задач и целей:
Левое, когда требуется к одной основной таблице добавить какие-то свойства из другой. Например к списку контрагентов добавить задолженность, банковские реквизиты, фио руководителей.
При формировании такого запроса, следует добиться отсутствия в правой таблице дублей строк, этому способствует использование временных таблиц или вложенных. В противном случае в левой таблице появятся дубли контрагентов, что будет мешать верному восприятию.
Если задвоения будут в динамическом списке, это может вызвать ошибку дублирования ключевого поля.
Внутреннее соединение служит для максимально ограничения выборки, например: получить контрагентов у которых были реализации в выбранный период.
В управлении торговлей для решения такой задачи соединение не так уж важно, достаточного было бы обратится к регистру «Продажи», а вот в «Бухгалтерии предприятия» соединение будет более верным решением: ведь мы не знаем заранее какой счет учета используется для продажи, могут быть созданные пользователем субсчета (это даст более короткое решение, но все зависит от ситуации — не обязательно же оно должно быть универсальным).
При необходимости соединения более двух таблиц производится цепочка соединений — сначала производится первое соединение, а с результатом производится соединение последующих таблиц.
Требование к таким таблицам:
- различные их псевдонимы и непересечение имен ключей и таблиц.
- При множественных соединениях допустимо комбинация нескольких видов соединений.
Как задать соединение в конструкторе запроса:
Шаг 1: выберите необходимые таблицы, которые возможно соединить
- Это производится на вкладке таблицы конструктора запроса.
- Далее можно сразу выбрать нужные поля.
Шаг 2: Переходим на вкладку «Связи»
- Для простых таблиц, где явно определяются связи, система их объединит самостоятельно
- В данном случае левое соединение
- Чтобы получить внутреннее: снимаются оба флажка «Все» — тогда в таблицу попадут только контрагенты у которых есть контактные лица
- Чтобы получить полное: устанавливаются оба флажка
- Если требуется соединение по двум условиям добавляется еще одна строка связи.
Вид соединения задается соответствующим словом перед «СОЕДИНЕНИЕ», остальной синтаксис идентичен. Правое не рассматриваем, так как конструктор запроса автоматически поменяет таблицы местами и сделает левое соединение.
Пример текста запроса «Внутреннее соединение»:
ВЫБРАТЬ
Контрагенты.Ссылка,
КонтактныеЛица.Ссылка КАК КонтактноеЛицо
ИЗ
Справочник.Контрагенты КАК Контрагенты
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.КонтактныеЛица КАК КонтактныеЛица
ПО Контрагенты.ОсновноеКонтактноеЛицо = КонтактныеЛица.Ссылка
И (Контрагенты.ЮрФизЛицо = ЗНАЧЕНИЕ(Перечисление.ЮрФизЛицо.ЮрЛицо)
Пример левого соединения
ВЫБРАТЬ
Контрагенты.Ссылка,
КонтактныеЛица.Ссылка КАК КонтактноеЛицо
ИЗ
Справочник.Контрагенты КАК Контрагенты
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.КонтактныеЛица КАК КонтактныеЛица
ПО Контрагенты.ОсновноеКонтактноеЛицо = КонтактныеЛица.Ссылка
И (Контрагенты.ЮрФизЛицо = ЗНАЧЕНИЕ(Перечисление.ЮрФизЛицо.ЮрЛицо)
Пример «полного соединения»
ВЫБРАТЬ
Контрагенты.Ссылка,
КонтактныеЛица.Ссылка КАК КонтактноеЛицо
ИЗ
Справочник.Контрагенты КАК Контрагенты
ПОЛНОЕ СОЕДИНЕНИЕ Справочник.КонтактныеЛица КАК КонтактныеЛица
ПО Контрагенты.ОсновноеКонтактноеЛицо = КонтактныеЛица.Ссылка
И (Контрагенты.ЮрФизЛицо = ЗНАЧЕНИЕ(Перечисление.ЮрФизЛицо.ЮрЛицо)
На что следует обратить внимание:
- Как уже было сказано на пустые значения при левом или полном соединении.
- С осторожностью используйте полные соединения и срезы последних из регистров, это может сильно замедлить выборку.
- При использовании конструктора обращайте внимание на соединяемые таблицы иногда он может подставить в левую таблицу не ожидаемое вами, если это упустить вначале придется затем исправлять руками или через правое (одна секунда внимания сбережет время в дальнейшем).
- Если вы выберете 2 таблицы, но не укажите связи, то получится неявное полное соединение (таблицы будут через «запятую»). Пример:
ВЫБРАТЬ
Контрагенты.Ссылка,
КонтактныеЛица.Ссылка КАК КонтактноеЛицо
ИЗ
Справочник.Контрагенты КАК Контрагенты,
Справочник.КонтактныеЛица КАК КонтактныеЛица
Газетные объявления содержат больше правды о том, что происходит в стране, чем газетные передовицы.