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

Запросы. Соединение таблиц

Оглавление (нажмите, чтобы раскрыть)

Внутреннее соединение

Пример внутреннего соединения в запросе 1С
//При внутреннем соединении выводятся 
//выводятся только записи, по которым
//найдено совпадение соответствующее
//условию отбора.
//Остальные записи обоих таблиц отбрасываются.

Запрос = Новый Запрос;
Запрос.Текст =
    "ВЫБРАТЬ
    |   Клиенты.Ссылка КАК Клиент,
    |   Контрагенты.Ссылка КАК Контрагент
    |ИЗ
    |   Справочник.Клиенты КАК Клиенты
    |       ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
    |       ПО Клиенты.Наименование = Контрагенты.Наименование";

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл
    Сообщить("" + Выборка.Клиент + ": " +
        Выборка.Контрагент);
КонецЦикла;

Замена null значением при левом соединении

Пример замены null значением в запросе 1С при левом соединении
//Если поле ПриходнаяНакладная.Склад не заполнено,
//тогда Склады.Ссылка = NULL
//заменяем значение NULL на "Основной" склад

Запрос = Новый Запрос;
Запрос.Текст =
    "ВЫБРАТЬ
    |   ПриходнаяНакладная.КаталожныйНомер,
    |   ЕСТЬNULL(Склады.Ссылка, ЗНАЧЕНИЕ(Справочник.Склады.Основной)) Склад
    |ИЗ
    |   Документ.ПриходнаяНакладная КАК ПриходнаяНакладная
    |       ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Склады КАК Склады
    |       ПО ПриходнаяНакладная.Склад = Склады.Ссылка";

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл
    Сообщить(Выборка.КаталожныйНомер + ": " +
        Выборка.Склад);
КонецЦикла;

Левое и правое соединение

Пример левого и правого соединения в запросе 1С
//При левом соединении из первой (главной) таблицы
//выбираются все записи,а из второй таблицы 
//только записи, соответствующие условию соединения.
//Если запись второй таблицы не найдена,
//ее поля заполняются значение NULL.
//При правом соединении главная - вторая таблица.

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

Выборка = Запрос.Выполнить().Выбрать();

//в данном примере поле "Ссылка" будет заполнено
//только если регитсратором является документ 
//ПриходнаяНакладная
//в остальных случаях "Ссылка" = NULL

Пока Выборка.Следующий() Цикл
    Сообщить("" + Выборка.Регистратор + ": " +
        Выборка.Ссылка);
КонецЦикла;

Полное соединение

Пример полного соединения в запросе 1С
//При полном соединении выводятся 
//все записи обоих таблиц.
//Если соответсвие не найдено
//поля как первой, так и второй таблиц
//могут содержать значение NULL

Запрос = Новый Запрос;
Запрос.Текст =
    "ВЫБРАТЬ
    |   Клиенты.Ссылка КАК Клиент,
    |   Контрагенты.Ссылка КАК Контрагент
    |ИЗ
    |   Справочник.Клиенты КАК Клиенты
    |       ПОЛНОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
    |       ПО Клиенты.Наименование = Контрагенты.Наименование";

Выборка = Запрос.Выполнить().Выбрать();

//В данном примере поле "Клиент"
//будет NULL если для контрагента не найден
//клиент с таким же наименованием.
//Поле "Контрагент" будет NULL
//если не найден контрагент

Пока Выборка.Следующий() Цикл
    Сообщить("" + Выборка.Клиент + ": " +
        Выборка.Контрагент);
КонецЦикла;
Ключи: |