Соединение таблиц с помощью запросов в системе 1С:Предприятие 8

Применение соединения запросов в 1С8

Здравствуйте, уважаемые читатели блога SoftMaker.kz. Сегодня мы детально рассмотрим соединение запросов в 1С. Для соединения используется предложение СОЕДИНЕНИЕ…ПО / JOIN…ON.

Применение соединения запросов в 1С8

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


Таблица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С» от Сотникова Анатолия. Этот опытный преподаватель наглядно покажет вам, как строить запросы в 1С. Вот некоторые вопросы, которые будут обсуждаться:
  • Что такое запросы?
  • Для чего нужны параметры запроса?
  • Какие есть параметры у виртуальной таблицы?
  • Как писать условия в запросах?
  • Что такое псевдонимы?
  • Как сделать запрос к справочнику?
  • Как работать с результатом запроса во встроенном языке 1С?
  • Далее увидите сами...
Материал подобран весьма великолепный! Поэтому не стоит тратить время на его поиски во всемирной сети! Не теряйте драгоценное время! Все подробности о том, что есть в бесплатных видеоуроках на странице автора.

Вот один из уроков о консоле запросов:


Этот блог читают уже более 3000 человек
- читай и ТЫ!

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

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

    Ответить
  2. Softmaker
    Softmaker says:

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

    Ответить
  3. Ирина says:

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

    Ответить
  4. Виктор says:

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

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

    Ответить
  5. Softmaker
    Softmaker says:

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

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

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

    Ответить

Ответить

Want to join the discussion?
Feel free to contribute!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *