Меню

Запрос 1с типы соединений таблиц



Соединение таблиц в запросе

Соединение таблиц в запросе

Язык запросов 1С позволяет сделать соединения двух и более таблиц. Под соединением понимается состыковка двух таблиц по ключевым полям.

Всего 4 вида соединений

  • Полное соединение — в результате получается одна таблица, содержащая все выбранные колонки, обычно число строк равняется количеству совпадающих по ключам строк плюс все несовпадающие.
  • Левое соединение — на выходе будет выбранные поля обеих таблиц (полностью первой и совпадающие по ключам соединения второй), количество строк всегда больше или равно количеству в первой таблице (условие соединения может вызывать дубли, если в правой таблице поля соединения дублируются))
  • Правое соединение — обратное левому (главная таблица вторая).
  • Внутреннее соединение — количество строк такой таблице равно количеству совпадающих по условию объединения строк.

Возможно выборка всех полей объединяемых таблиц (обращение к ним по псевдониму), но если соединение не внутреннее, то в отсутствующем поле будет значение NULL, поэтому следует рассматривать его особым образом или подменять значение через функцию ЕстьNULL().

Условием соединения может быть и простое условие «ИСТИНА», которое соединит таблицы с значительным увеличением количества строк (каждая строка соединится с каждой строкой второй таблицы).

[qu_note note_color=»#f7ebe6″]Такие запросы на больших источниках может вызвать нехватку памяти, либо длительно выполнятся, вплоть до «зависания».[/qu_note]

Различные виды объединений используются для своих своих задач и целей:

Левое, когда требуется к одной основной таблице добавить какие-то свойства из другой. Например к списку контрагентов добавить задолженность, банковские реквизиты, фио руководителей.
При формировании такого запроса, следует добиться отсутствия в правой таблице дублей строк, этому способствует использование временных таблиц или вложенных. В противном случае в левой таблице появятся дубли контрагентов, что будет мешать верному восприятию.

Если задвоения будут в динамическом списке, это может вызвать ошибку дублирования ключевого поля.

Внутреннее соединение служит для максимально ограничения выборки, например: получить контрагентов у которых были реализации в выбранный период.

В управлении торговлей для решения такой задачи соединение не так уж важно, достаточного было бы обратится к регистру «Продажи», а вот в «Бухгалтерии предприятия» соединение будет более верным решением: ведь мы не знаем заранее какой счет учета используется для продажи, могут быть созданные пользователем субсчета (это даст более короткое решение, но все зависит от ситуации — не обязательно же оно должно быть универсальным).

При необходимости соединения более двух таблиц производится цепочка соединений — сначала производится первое соединение, а с результатом производится соединение последующих таблиц.

Требование к таким таблицам:

  • различные их псевдонимы и непересечение имен ключей и таблиц.
  • При множественных соединениях допустимо комбинация нескольких видов соединений.

Как задать соединение в конструкторе запроса:

Шаг 1: выберите необходимые таблицы, которые возможно соединить

  • Это производится на вкладке таблицы конструктора запроса.
  • Далее можно сразу выбрать нужные поля.

Шаг 2: Переходим на вкладку «Связи»

  • Для простых таблиц, где явно определяются связи, система их объединит самостоятельно
  • В данном случае левое соединение
  • Чтобы получить внутреннее: снимаются оба флажка «Все» — тогда в таблицу попадут только контрагенты у которых есть контактные лица
  • Чтобы получить полное: устанавливаются оба флажка
  • Если требуется соединение по двум условиям добавляется еще одна строка связи.
Читайте также:  Расчет освещения методы и последовательность

Вид соединения задается соответствующим словом перед «СОЕДИНЕНИЕ», остальной синтаксис идентичен. Правое не рассматриваем, так как конструктор запроса автоматически поменяет таблицы местами и сделает левое соединение.

Пример текста запроса «Внутреннее соединение»:

Пример левого соединения

Пример «полного соединения»

На что следует обратить внимание:

  • Как уже было сказано на пустые значения при левом или полном соединении.
  • С осторожностью используйте полные соединения и срезы последних из регистров, это может сильно замедлить выборку.
  • При использовании конструктора обращайте внимание на соединяемые таблицы иногда он может подставить в левую таблицу не ожидаемое вами, если это упустить вначале придется затем исправлять руками или через правое (одна секунда внимания сбережет время в дальнейшем).
  • Если вы выберете 2 таблицы, но не укажите связи, то получится неявное полное соединение (таблицы будут через «запятую»). Пример:

Кодак продает фотопленку, но рекламируют они не фотопленку. Они рекламируют память.

— Теодор Левит

Источник

1С 8.3 Соединение в запросе — Программист 1С Минск. Автоматизация бизнеса.

1С 8.3 Соединение в запросе

  • Левое соединение — это внутреннее соединение, результат которого выбранные поля обеих таблиц (полностью первой — главной таблицы + совпадающие по ключам соединения второй), количество строк больше или равно количеству в первой таблице (условие соединения может вызывать дубли, если в правой таблице поля соединения дублируются)
  • Правое соединение — это внутреннее соединение, результат которого выбранные поля обеих таблиц (полностью второй — главной таблицы + совпадающие по ключам соединения первой), количество строк больше или равно количеству во второй таблице (условие соединения может вызывать дубли, если в левой таблице поля соединения дублируются)
  • Полное соединение — это левое соединение + правое соединение, в результате которых, получается одна таблица, содержащая все выбранные колонки, число строк обычно равняется количеству совпадающих строк по ключам + все несовпадающие.
  • Внутреннее соединение — это соединение, результат которого выбранные поля обеих таблиц , которые смогли соединиться по заданному условию.

✔ Внутреннее соединение двух таблиц

&НаСервере
Процедура ВнутреннееСоединениеДвухТаблиц ()

Запрос = Новый Запрос ( «ВЫБРАТЬ
| Металлы.Наименование КАК НаименованиеИзТаблицы1,
| ПрайсЛист.Наименование КАК НаименованиеИзТаблицы2,
| ПрайсЛист.Цена КАК ЦенаИзТаблицы2
|ИЗ
| Справочник.Металлы КАК Металлы
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ
| Справочник.ПрайсЛист КАК ПрайсЛист
| ПО
| Металлы.Наименование = ПрайсЛист.Наименование» );

РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;

Источник

Запрос 1с типы соединений таблиц

1С 8.3 Соединение в запросе

  • Левое соединение — это внутреннее соединение, результат которого выбранные поля обеих таблиц (полностью первой — главной таблицы + совпадающие по ключам соединения второй), количество строк больше или равно количеству в первой таблице (условие соединения может вызывать дубли, если в правой таблице поля соединения дублируются)
  • Правое соединение — это внутреннее соединение, результат которого выбранные поля обеих таблиц (полностью второй — главной таблицы + совпадающие по ключам соединения первой), количество строк больше или равно количеству во второй таблице (условие соединения может вызывать дубли, если в левой таблице поля соединения дублируются)
  • Полное соединение — это левое соединение + правое соединение, в результате которых, получается одна таблица, содержащая все выбранные колонки, число строк обычно равняется количеству совпадающих строк по ключам + все несовпадающие.
  • Внутреннее соединение — это соединение, результат которого выбранные поля обеих таблиц , которые смогли соединиться по заданному условию.
Читайте также:  Причины начала Тридцатилетней войны

✔ Внутреннее соединение двух таблиц

&НаСервере
Процедура ВнутреннееСоединениеДвухТаблиц ()

Запрос = Новый Запрос ( «ВЫБРАТЬ
| Металлы.Наименование КАК НаименованиеИзТаблицы1,
| ПрайсЛист.Наименование КАК НаименованиеИзТаблицы2,
| ПрайсЛист.Цена КАК ЦенаИзТаблицы2
|ИЗ
| Справочник.Металлы КАК Металлы
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ
| Справочник.ПрайсЛист КАК ПрайсЛист
| ПО
| Металлы.Наименование = ПрайсЛист.Наименование» );

РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;

Источник

Профессия — 1С

Соединение таблиц в запросах 1С

рубрики: Запросы | Дата: 31 января, 2016

В предыдущей статье был рассмотрен вопрос чем отличается соединение таблиц от объединения. А сейчас рассмотрим подробнее соединение таблиц.

Напомню, что видов соединений в языке запросов 1С8 может быть несколько, а именно: ЛЕВОЕ СОЕДИНЕНИЕ, ПРАВОЕ СОЕДИНЕНИЕ, ВНУТРЕННЕЕ СОЕДИНЕНИЕ, ПОЛНОЕ СОЕДИНЕНИЕ. Рассмотрим каждое из них подробно.

ЛЕВОЕ СОЕДИНЕНИЕ

В случае левого соединения данные из одной таблицы выбираются полностью, а из таблицы, которая присоединяется справа, выбираются только те записи для которых выполняется одно или несколько условий по которым эти таблицы соединяются. Из этого предложения конечно же мало, что можно понять, поэтому разберем пример.
Есть таблица «Товары»:

КодТовара Наименование
001 Яблоки
002 Апельсины
003 Мандарины

Сформируем эту таблицу в консоли запросов 1С с помощью вот такого запроса:

А еще есть таблица «Страны» вот такого вида:

КодТовара Страна
001 Россия
002 Турция
003 Марокко

Также сконструируем ее запросом:

А теперь соединим эти две таблицы с помощью левого соединения, чтобы получить одну, в которой будет и код товара, и наименование, и страна. Для этого поместим наши таблицы во временные и в пакетном запросе выполним левое соединение.

Записи будем связывать конечно же по полям КодТовара

Можете скопировать этот код в консоль запросов и выполнив его получите вот такой результат:

КодТовара Наименование Страна
001 Яблоки Россия
002 Апельсины Турция
003 Мандарины Марокко

Здесь мы рассмотрели идеальную ситуацию, когда каждой записи в левой таблице соответствует одна запись в правой. Давайте немного усложним.

Допустим для нашего товара у нас есть еще цены. Причем они могут меняться в зависимости от даты:

КодТовара Дата Цена
001 01.01.2016 120
001 01.02.2016 150
002 01.01.2016 200
004 01.01.2016 350

Здесь мы видим, что для товара с кодом 001 (Яблоки) у нас 2 записи в таблице цен. Для мандаринов цена отсутствует. И кроме того в ценах есть код товара 004, которого нет в таблице с товарами. Давайте выполним левое соединение для товаров и цен с условием связи по полю код и посмотрим, что у нас получится.

Читайте также:  Динамика 5 ведущих регионов экспорта

После выполнения запроса видим вот такую картину:

КодТовара Наименование Цена Дата
001 Яблоки 120 01.01.2016
001 Яблоки 150 01.02.2016
002 Апельсины 200 01.01.2016
003 Мандарины NULL NULL

Проанализируем полученный результат. Из таблицы «Товары» были выбраны все записи, т.к. она у нас основная. Для мандаринов цена имеет значение NULL, т.к. записи с кодом 003 нет в таблице с ценами. А запись с кодом 004 из таблицы цен (а она у нас вспомогательная) была проигнорирована, т.к. для нее нет соответствия в таблице товаров. И как мы видим у нас появилось 2 записи с яблоками несмотря на то, что в таблице товаров запись с кодом 001 одна. В этом и заключается некоторое коварство соединений таблиц.

И на эти грабли наступают как начинающие, так и опытные программисты. Когда запись в основной таблице одна, а в присоединяемой несколько записей удовлетворяют условию соединения, то в итоговой таблице количество записей будет равно количеству записей во вспомогательной таблице. В нашем случае произошло задвоение записи с яблоками. Этот момент надо обязательно учитывать при написании запросов и проверять при тестировании.

    ПРАВОЕ СОЕДИНЕНИЕ

    Оно практически ничем не отличается от левого. В итоговую таблицу попадают все записи из правой таблицы, а из левой только те, для которых выполняется условие соединения. На практике правое соединение практически не используется и рассматривать его отдельно не будем. Есть даже небольшой забавный момент, связанный с правым соединением в конструкторе запросов 1С. Если при составлении запроса в конструкторе попытаться использовать правое соединение, то после нажатия кнопки ОК правое соединение будет автоматически преобразовано в левое.

    ВНУТРЕННЕЕ СОЕДИНЕНИЕ

    В случае внутреннего соединения в итоговую таблицу попадут только те записи как из левой, так и из правой таблицы, для которых выполняется условие соединения. Если в нашем последнем запросе мы заменим строку

    то в итоге получим:

    КодТовара Наименование Цена Дата
    001 Яблоки 120 01.01.2016
    001 Яблоки 150 01.02.2016
    002 Апельсины 200 01.01.2016

    То есть запись с мандаринами у нас исчезла, т.к. для нее не нашлось соответствия в таблице с ценами.

    ПОЛНОЕ СОЕДИНЕНИЕ

    В случае полного соединения в итоговую таблицу попадут все записи из обоих таблиц.
    В нашем случае при использовании строки соединения

    получим следующий результат

    КодТовара Наименование Цена Дата
    001 Яблоки 120 01.01.2016
    001 Яблоки 150 01.02.2016
    002 Апельсины 200 01.01.2016
    003 Мандарины NULL NULL
    NULL NULL 350 01.01.2016

    На практике полное соединение используется достаточно редко, но иногда бывает необходимо.

Для тех кто только начинает работать с запросами 1С8 советую посмотреть как разные виды соединений отображаются в конструкторе запросов на закладке «Связи».

Источник