Соединение таблиц с помощью запросов в системе 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

Как видим мы получили все данные из таблицы РеализацияТоваровУслуг и только, те данные, которые соответствуют условию для таблицы ПоступлениеТоваровУслуг.

ПОДПИСКА

8 ответы
  1. Михаил говорит:

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

  2. Softmaker говорит:

    Пожалуйста, Михаил! Будем стараться писать понятно и просто. И не только про соединения в запросах 1С.

  3. Ирина говорит:

    Полностью согласна с предыдущим комментарием. Большое пребольшое спасибо.

  4. Softmaker говорит:

    Спасибо, Ирина, за хороший отзыв!

  5. Виктор говорит:

    Отличное описание, но все таки столкнулся с проблемой в голове. Не могу заставить соединится ПОЛНЫМ соединением но с условиями в обеих таблицах. Т.е. в пример
    ВЫБРАТЬ
    *
    ИЗ
    Документ.ПоступлениеТоваровУслуг.Товары КАК ДокПриход
    ПОЛНОЕ СОЕДИНЕНИЕ
    Документ.РеализацияТоваровУслуг.Товары КАК ДокРасход
    ПО ДокПриход.Номенклатура = ДокРасход.Номенклатура

    добавить условия типа
    ДокРасход.Ссылка = &СсылкаРасход
    И ДокПриход.Ссылка = &СссылкаПриход

  6. Softmaker говорит:

    Виктор, вот пример:

    ВЫБРАТЬ
    ЕСТЬNULL(БДН.НомерСтроки, БОН.НомерСтроки) КАК НомерСтроки,
    ЕСТЬNULL(БОН.РезультатБаза, 0) + ЕСТЬNULL(БДН.РезультатБаза, 0) КАК База
    ИЗ
    РегистрРасчета.ДополнительныеНачисления.БазаДополнительныеНачисления(&Измерения, &Измерения, , ) КАК БДН
    ПОЛНОЕ СОЕДИНЕНИЕ РегистрРасчета.ДополнительныеНачисления.БазаОсновныеНачисления(&Измерения, &Измерения, , ) КАК БОН
    ПО БДН.НомерСтроки = БОН.НомерСтроки
    ГДЕ
    БДН.Регистратор = &Регистратор1
    И БОН.Регистратор = &Регистратор2

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

  7. myr4ik07 говорит:

    Да, с Вами сейчас стало более понятнее, спасибо )

Комментарии закрыты.