1С 8.3 Соединение в запросе - Программист 1С Минск. Автоматизация бизнеса.

Перейти к контенту

1С 8.3 Соединение в запросе

Данные > Примеры кода 1С > 1С 8.3 Запросы
Соединение в запросе 1С 8.3 - это соединение строк двух таблиц по определенному признаку. Используется, когда нужно собрать одну таблицу из нескольких. Соединения бывают 4 типов:
  • Левое соединение - это внутреннее соединение, результат которого выбранные поля обеих таблиц (полностью первой - главной таблицы + совпадающие по ключам соединения второй), количество строк больше или равно количеству в первой таблице (условие соединения может вызывать дубли, если в правой таблице поля соединения дублируются)
  • Правое соединение - это внутреннее соединение, результат которого выбранные поля обеих таблиц (полностью второй - главной таблицы + совпадающие по ключам соединения первой), количество строк больше или равно количеству во второй таблице (условие соединения может вызывать дубли, если в левой таблице поля соединения дублируются)
  • Полное соединение - это  левое соединение + правое соединение, в результате которых, получается одна таблица, содержащая все выбранные колонки, число строк обычно равняется количеству совпадающих строк по ключам + все несовпадающие.
  • Внутреннее соединение - это соединение, результат которого выбранные поля обеих таблиц , которые смогли соединиться по заданному условию.
       
Поля таблиц, которые не удалось соединить, заполняются значениями NULL.
Стандарты 1С не рекомендуют делать соединения с вложенными запросами. Вместо них рекомендуется делать соединения с временными таблицами. С точки зрения СУБД оптимизатору сложно определить сколько записей во вложенном запросе (высока вероятность ошибки) и, соответственно,  подобрать оптимальный план выполнения запроса.
Внутреннее соединение двух таблиц в запросе 1С 8.3:
&НаСервере
Процедура ВнутреннееСоединениеДвухТаблиц()

   
Запрос = Новый Запрос("ВЫБРАТЬ
    |   Металлы.Наименование КАК НаименованиеИзТаблицы1,
    |   ПрайсЛист.Наименование КАК НаименованиеИзТаблицы2,
    |   ПрайсЛист.Цена КАК ЦенаИзТаблицы2
    |ИЗ
    |   Справочник.Металлы КАК Металлы
    |      ВНУТРЕННЕЕ СОЕДИНЕНИЕ
    |   Справочник.ПрайсЛист КАК ПрайсЛист
    |      ПО
    |   Металлы.Наименование = ПрайсЛист.Наименование"
);

   
РезультатЗапроса = Запрос.Выполнить(); Записи = РезультатЗапроса.Выбрать();
    Пока
Записи.Следующий() Цикл
       
// Обход результата запроса по каждой записи в полученной выборке
   
КонецЦикла;

КонецПроцедуры
// Исходная таблицы для примера соединений в запросе 1С 8.3:
Таблица 1: "Металлы"        Таблица 2: "ПрайсЛист"
Название                             Название.......Цена (гр./бел.руб)
Золото..............................   Золото..........127,29         
Серебро...........................   Серебро........1,30
Иридий.............................   Платина.........62,00
Осмий..............................   Родий............568,27     
........................................   Рутений.........20,67
// Результат внутреннего соединения по имени в запросе 1С 8.3:
НазваниеИзТаблицы1          НазваниеИзТаблицы2.......ЦенаИзТаблицы2
Золото..............................   Золото..............................127,29         
Серебро...........................   Серебро............................1,30
Левое соединение таблиц в запросе 1С 8.3:
&НаСервере
Процедура ЛевоеСоединениеТаблиц()

   
Запрос = Новый Запрос("ВЫБРАТЬ
    |   Металлы.Наименование КАК НаименованиеИзТаблицы1,
    |   ПрайсЛист.Наименование КАК НаименованиеИзТаблицы2,
    |   ПрайсЛист.Цена КАК ЦенаИзТаблицы2
    |ИЗ
    |   Справочник.Металлы КАК Металлы
    |      ЛЕВОЕ СОЕДИНЕНИЕ
    |   Справочник.ПрайсЛист КАК ПрайсЛист
    |      ПО
    |   Металлы.Наименование = ПрайсЛист.Наименование"
);

   
РезультатЗапроса = Запрос.Выполнить(); Записи = РезультатЗапроса.Выбрать();
    Пока
Записи.Следующий() Цикл
       
// Обход результата запроса по каждой записи в полученной выборке
   
КонецЦикла;

КонецПроцедуры
// Исходная таблицы для примера соединений в запросе 1С 8.3:
Таблица 1: "Металлы"        Таблица 2: "ПрайсЛист"
Название                             Название.......Цена (гр./бел.руб)
Золото..............................   Золото..........127,29         
Серебро...........................   Серебро........1,30
Иридий.............................   Платина.........62,00
Осмий..............................   Родий............568,27     
........................................   Рутений.........20,67
// Результат левого соединения таблиц в запросе 1С 8.3:
НазваниеИзТаблицы1          НазваниеИзТаблицы2.......ЦенаИзТаблицы2
Золото..............................   Золото..............................127,29         
Серебро...........................   Серебро............................1,30
Иридий.............................   NULL.................................NULL
Осмий..............................   NULL.................................NULL
Правое соединение таблиц в запросе 1С 8.3:
&НаСервере
Процедура ПравоеСоединениеТаблиц()

   
Запрос = Новый Запрос("ВЫБРАТЬ
    |   Металлы.Наименование КАК НаименованиеИзТаблицы1,
    |   ПрайсЛист.Наименование КАК НаименованиеИзТаблицы2,
    |   ПрайсЛист.Цена КАК ЦенаИзТаблицы2
    |ИЗ
    |   Справочник.Металлы КАК Металлы
    |      ПРАВОЕ СОЕДИНЕНИЕ
    |   Справочник.ПрайсЛист КАК ПрайсЛист
    |      ПО
    |   Металлы.Наименование = ПрайсЛист.Наименование"
);

   
РезультатЗапроса = Запрос.Выполнить(); Записи = РезультатЗапроса.Выбрать();
    Пока
Записи.Следующий() Цикл
       
// Обход результата запроса по каждой записи в полученной выборке
   
КонецЦикла;

КонецПроцедуры
// Исходная таблицы для примера соединений в запросе 1С 8.3:
Таблица 1: "Металлы"        Таблица 2: "ПрайсЛист"
Название                             Название.......Цена (гр./бел.руб)
Золото..............................   Золото..........127,29         
Серебро...........................   Серебро........1,30
Иридий.............................   Платина.........62,00
Осмий..............................   Родий............568,27     
........................................   Рутений.........20,67
// Результат правого соединения таблиц в запросе 1С 8.3:
НазваниеИзТаблицы1          НазваниеИзТаблицы2.......ЦенаИзТаблицы2
Золото..............................   Золото..............................127,29         
Серебро...........................   Серебро............................1,30
NULL.............................      Платина............................62,00
NULL..............................     Родий................................568,27
NULL..............................     Рутений.............................20,67
Полное соединение таблиц в запросе 1С 8.3:
&НаСервере
Процедура ПолноеСоединениеТаблиц()

   
Запрос = Новый Запрос("ВЫБРАТЬ
    |   Металлы.Наименование КАК НаименованиеИзТаблицы1,
    |   ПрайсЛист.Наименование КАК НаименованиеИзТаблицы2,
    |   ПрайсЛист.Цена КАК ЦенаИзТаблицы2
    |ИЗ
    |   Справочник.Металлы КАК Металлы
    |      ПОЛНОЕ СОЕДИНЕНИЕ
    |   Справочник.ПрайсЛист КАК ПрайсЛист
    |      ПО
    |Металлы.Наименование = ПрайсЛист.Наименование"
);

   
РезультатЗапроса = Запрос.Выполнить(); Записи = РезультатЗапроса.Выбрать();
    Пока
Записи.Следующий() Цикл
       
// Обход результата запроса по каждой записи в полученной выборке
   
КонецЦикла;

КонецПроцедуры
// Исходная таблицы для примера соединений в запросе 1С 8.3:
Таблица 1: "Металлы"        Таблица 2: "ПрайсЛист"
Название                             Название.......Цена (гр./бел.руб)
Золото..............................   Золото..........127,29         
Серебро...........................   Серебро........1,30
Иридий.............................   Платина.........62,00
Осмий..............................   Родий............568,27     
........................................   Рутений.........20,67
// Результат полного соединения таблиц в запросе 1С 8.3:
НазваниеИзТаблицы1          НазваниеИзТаблицы2.......ЦенаИзТаблицы2
Золото..............................   Золото..............................127,29
Серебро...........................   Серебро............................1,30
Иридий............................    NULL.................................NULL
Осмий..............................   NULL.................................NULL
NULL...............................    Платина............................62,00
NULL...............................    Родий...............................568,27
NULL...............................    Рутений............................20,67
Перекрестное соединение таблиц в запросе 1С 8.3:
&НаСервере
Процедура ПерекрестноеСоединениеТаблиц()

   
Запрос = Новый Запрос("ВЫБРАТЬ
    |   Металлы.Наименование КАК НаименованиеИзТаблицы1,
    |   ПрайсЛист.Наименование КАК НаименованиеИзТаблицы2,
    |   ПрайсЛист.Цена КАК ЦенаИзТаблицы2
    |ИЗ
    |   Справочник.Металлы КАК Металлы,
    |   Справочник.ПрайсЛист КАК ПрайсЛист"
);

   
РезультатЗапроса = Запрос.Выполнить(); Записи = РезультатЗапроса.Выбрать();
    Пока
Записи.Следующий() Цикл
       
// Обход результата запроса по каждой записи в полученной выборке
   
КонецЦикла;

КонецПроцедуры
// Исходная таблицы для примера соединений в запросе 1С 8.3:
Таблица 1: "Металлы"        Таблица 2: "ПрайсЛист"
Название                             Название.......Цена (гр./бел.руб)
Золото..............................   Золото..........127,29         
Серебро...........................   Серебро........1,30
Иридий.............................   Платина.........62,00
Осмий..............................   Родий............568,27     
........................................   Рутений.........20,67
// Справочно: Результат перекрестного соединения таблиц в запросе 1С 8.3:
НазваниеИзТаблицы1          НазваниеИзТаблицы2.......ЦенаИзТаблицы2
Золото..............................   Золото..............................127,29
Золото..............................   Серебро............................1,30
Золото..............................   Платина............................62,00
Золото..............................   Родий...............................568,27
Золото..............................   Рутений............................20,67
Серебро...........................   Золото..............................127,29
Серебро...........................   Серебро............................1,30
Серебро...........................   Платина............................62,00
Серебро...........................   Родий...............................568,27
Серебро...........................   Рутений............................20,67
Иридий.............................  Золото..............................127,29
Иридий.............................  Серебро............................1,30
Иридий.............................  Платина............................62,00
Иридий.............................  Родий...............................568,27
Иридий.............................  Рутений............................20,67
Осмий..............................  Золото..............................127,29
Осмий..............................  Серебро............................1,30
Осмий..............................  Платина............................62,00
Осмий..............................  Родий................................568,27
Осмий..............................  Рутений.............................20,67
0
комментарии
____________________
Copyright©, «Программист 1С в г.Минске», 14.06.2020
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник
Яндекс.Метрика
Защищенное соединение ssl
visa
mastercard
Maestro
Яндекс деньги
Назад к содержимому