Соединение таблиц с помощью запросов в системе 1С:Предприятие 8
Здравствуйте, уважаемые читатели блога SoftMaker.kz. Сегодня мы детально рассмотрим соединение запросов в 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 |
Как видим мы получили все данные из таблицы РеализацияТоваровУслуг и только, те данные, которые соответствуют условию для таблицы ПоступлениеТоваровУслуг.
Вот спасибо. Первое нормальное объяснение про виды соединений. Только тут смог понять, как это использовать. Все четко и доходчиво объяснено. А то в тех объяснениях, что выдал гугл по поиску, толком не понятно. Вроде после них понимание есть, но принцип использования ускользает.
Пожалуйста, Михаил! Будем стараться писать понятно и просто. И не только про соединения в запросах 1С.
Полностью согласна с предыдущим комментарием. Большое пребольшое спасибо.
Спасибо, Ирина, за хороший отзыв!
Отличное описание, но все таки столкнулся с проблемой в голове. Не могу заставить соединится ПОЛНЫМ соединением но с условиями в обеих таблицах. Т.е. в пример
ВЫБРАТЬ
*
ИЗ
Документ.ПоступлениеТоваровУслуг.Товары КАК ДокПриход
ПОЛНОЕ СОЕДИНЕНИЕ
Документ.РеализацияТоваровУслуг.Товары КАК ДокРасход
ПО ДокПриход.Номенклатура = ДокРасход.Номенклатура
добавить условия типа
ДокРасход.Ссылка = &СсылкаРасход
И ДокПриход.Ссылка = &СссылкаПриход
Виктор, вот пример:
ВЫБРАТЬ
ЕСТЬNULL(БДН.НомерСтроки, БОН.НомерСтроки) КАК НомерСтроки,
ЕСТЬNULL(БОН.РезультатБаза, 0) + ЕСТЬNULL(БДН.РезультатБаза, 0) КАК База
ИЗ
РегистрРасчета.ДополнительныеНачисления.БазаДополнительныеНачисления(&Измерения, &Измерения, , ) КАК БДН
ПОЛНОЕ СОЕДИНЕНИЕ РегистрРасчета.ДополнительныеНачисления.БазаОсновныеНачисления(&Измерения, &Измерения, , ) КАК БОН
ПО БДН.НомерСтроки = БОН.НомерСтроки
ГДЕ
БДН.Регистратор = &Регистратор1
И БОН.Регистратор = &Регистратор2
Конечно, если это виртуальная таблица, как здесь, то лучше указывать условия в параметрах виртуальной таблицы.
Да, с Вами сейчас стало более понятнее, спасибо )
Рад стараться, myr4ik07!