Запросы в 1С
Сегодня мы детально рассмотрим соединение запросов в 1С. Для соединения используется предложение СОЕДИНЕНИЕ…ПО / JOIN…ON.
В отличие от объединении запросов при соединении таблиц происходит «горизонтальное склеивание» полей, то есть сначала идут столбцы результата первого запроса, затем второго. Это выглядит примерно так:
Таблица1
|
Таблица2
|
Поле1
|
Поле2
|
Поле1
|
Поле2
|
|
|
|
|
При соединении таблиц необходимо условие, по которому и происходит соединение. При работе с пакетными запросами используется соединение. Существует четыре типа соединений: ВНУТРЕННЕЕ, ПОЛНОЕ, ЛЕВОЕ и ПРАВОЕ. В чем разница?
ВНУТРЕННЕЕ СОЕДИНЕНИЕ возьмет только, те данные, которые отвечают условию и в одной и в другой таблице. Например:
ВЫБРАТЬ
*
ИЗ
Документ.ПоступлениеТоваровУслуг.Товары КАК ДокПриход
СОЕДИНЕНИЕ
Документ.РеализацияТоваровУслуг.Товары КАК ДокРасход
ПО ДокПриход.Номенклатура = ДокРасход.Номенклатура
Результат:
Ссылка
|
Номенклатура
|
Количество
|
Цена
|
Сумма
|
Ссылка1
|
Номенклатура1
|
Количество1
|
Цена1
|
Сумма1
|
Поступление ТМЗ и услуг 00000000083 от 31.05.2008 12:00:01
|
Бензин Аи-92
|
70,000
|
92,86
|
6 500,00
|
Реализация ТМЗ и услуг 00000000008 от 31.08.2008 12:00:06
|
Бензин Аи-92
|
15,950
|
105,42
|
1 681,45
|
Поступление ТМЗ и услуг 00000000083 от 31.05.2008 12:00:01
|
Бензин Аи-92
|
70,000
|
92,86
|
6 500,00
|
Реализация ТМЗ и услуг 00000000014 от 31.08.2008 12:00:19
|
Бензин Аи-92
|
1,146
|
105,42
|
120,81
|
Данные, которые не отвечали условию соединения были отброшены.
ПОЛНОЕ [ВНЕШНЕЕ] СОЕДИНЕНИЕ включает записи из обеих таблиц независимо от того, есть ли данные в другой.
Например:
ВЫБРАТЬ
*
ИЗ
Документ.ПоступлениеТоваровУслуг.Товары КАК ДокПриход
ПОЛНОЕ СОЕДИНЕНИЕ
Документ.РеализацияТоваровУслуг.Товары КАК ДокРасход
ПО ДокПриход.Номенклатура = ДокРасход.Номенклатура
Результат:
Ссылка
|
Номенклатура
|
Количество
|
Цена
|
Сумма
|
Ссылка1
|
Номенклатура1
|
Количество1
|
Цена1
|
Сумма1
|
Поступление ТМЗ и услуг 00000000083 от 31.05.2008 12:00:01
|
Бензин Аи-92
|
70,000
|
92,86
|
6 500,00
|
Реализация ТМЗ и услуг 00000000008 от 31.08.2008 12:00:06
|
Бензин Аи-92
|
15,950
|
105,42
|
1 681,45
|
Поступление ТМЗ и услуг 00000000083 от 31.05.2008 12:00:01
|
Бензин Аи-92
|
70,000
|
92,86
|
6 500,00
|
Реализация ТМЗ и услуг 00000000014 от 31.08.2008 12:00:19
|
Бензин Аи-92
|
1,146
|
105,42
|
120,81
|
Поступление ТМЗ и услуг 00000000121 от 09.06.2008 12:00:02
|
Скоросшиватель пластиковый
|
50,000
|
67,00
|
3 350,00
|
<NULL>
|
<NULL>
|
<NULL>
|
<NULL>
|
<NULL>
|
<NULL>
|
<NULL>
|
<NULL>
|
<NULL>
|
<NULL>
|
Реализация ТМЗ и услуг 00000000016 от 27.11.2008 12:22:03
|
Модем ADSL ZyXEL
|
1,000
|
7 790,00
|
7 790,00
|
Соединение полное, данные из обеих таблиц попали все.
ЛЕВОЕ или ПРАВОЕ [ВНЕШНЕЕ] СОЕДИНЕНИЕ выведет данные, которые есть либо только в левой, либо в правой таблицах, в зависимости от типа соединения. Таблица считается левой/правой если в тексте запроса оно стоит слева/справа от словаСОЕДИНЕНИЕ.
Рассмотрим левое соединение:
ВЫБРАТЬ
*
ИЗ
Документ.ПоступлениеТоваровУслуг.Товары КАК ДокПриход
ЛЕВОЕ СОЕДИНЕНИЕ
Документ.РеализацияТоваровУслуг.Товары КАК ДокРасход
ПО ДокПриход.Номенклатура = ДокРасход.Номенклатура
Результат левого соединения:
Ссылка
|
Номенклатура
|
Количество
|
Цена
|
Сумма
|
Ссылка1
|
Номенклатура1
|
Количество1
|
Цена1
|
Сумма1
|
Поступление ТМЗ и услуг 00000000083 от 31.05.2008 12:00:01
|
Бензин Аи-92
|
70,000
|
92,86
|
6 500,00
|
Реализация ТМЗ и услуг 00000000008 от 31.08.2008 12:00:06
|
Бензин Аи-92
|
15,950
|
105,42
|
1 681,45
|
Поступление ТМЗ и услуг 00000000083 от 31.05.2008 12:00:01
|
Бензин Аи-92
|
70,000
|
92,86
|
6 500,00
|
Реализация ТМЗ и услуг 00000000014 от 31.08.2008 12:00:19
|
Бензин Аи-92
|
1,146
|
105,42
|
120,81
|
Поступление ТМЗ и услуг 00000000121 от 09.06.2008 12:00:02
|
Скоросшиватель пластиковый
|
50,000
|
67,00
|
3 350,00
|
<NULL>
|
<NULL>
|
<NULL>
|
<NULL>
|
<NULL>
|
Как видим мы получили все данные из основной таблицы, т. е. ПоступлениеТоваровУслуг и только, те данные,
которые соответствуют условию для таблицы РеализацияТоваровУслуг.
Рассмотрим правое соединение:
ВЫБРАТЬ
*
ИЗ
Документ.ПоступлениеТоваровУслуг.Товары КАК ДокПриход
ПРАВОЕ СОЕДИНЕНИЕ
Документ.РеализацияТоваровУслуг.Товары КАК ДокРасход
ПО ДокПриход.Номенклатура = ДокРасход.Номенклатура
Результат правого соединения:
Ссылка
|
Номенклатура
|
Количество
|
Цена
|
Сумма
|
Ссылка1
|
Номенклатура1
|
Количество1
|
Цена1
|
Сумма1
|
Поступление ТМЗ и услуг 00000000083 от 31.05.2008 12:00:01
|
Бензин Аи-92
|
70,000
|
92,86
|
6 500,00
|
Реализация ТМЗ и услуг 00000000008 от 31.08.2008 12:00:06
|
Бензин Аи-92
|
15,950
|
105,42
|
1 681,45
|
Поступление ТМЗ и услуг 00000000083 от 31.05.2008 12:00:01
|
Бензин Аи-92
|
70,000
|
92,86
|
6 500,00
|
Реализация ТМЗ и услуг 00000000014 от 31.08.2008 12:00:19
|
Бензин Аи-92
|
1,146
|
105,42
|
120,81
|
<NULL>
|
<NULL>
|
<NULL>
|
<NULL>
|
<NULL>
|
Реализация ТМЗ и услуг 00000000016 от 27.11.2008 12:22:03
|
Модем ADSL ZyXEL
|
1,000
|
7 790,00
|
7 790,00
|
Как видим мы получили все данные из таблицы РеализацияТоваровУслуг и только, те данные,
которые соответствуют условию для таблицы ПоступлениеТоваровУслуг.
|