1С 8.3 Соединение в запросе
Данные > Примеры кода 1С > 1С 8.3 Запросы
Соединение в запросе 1С 8.3 - это соединение строк двух таблиц по определенному признаку. Используется, когда нужно собрать одну таблицу из нескольких. Соединения бывают 4 типов:
- Левое соединение - это внутреннее соединение, результат которого выбранные поля обеих таблиц (полностью первой - главной таблицы + совпадающие по ключам соединения второй), количество строк больше или равно количеству в первой таблице (условие соединения может вызывать дубли, если в правой таблице поля соединения дублируются)
- Правое соединение - это внутреннее соединение, результат которого выбранные поля обеих таблиц (полностью второй - главной таблицы + совпадающие по ключам соединения первой), количество строк больше или равно количеству во второй таблице (условие соединения может вызывать дубли, если в левой таблице поля соединения дублируются)
- Полное соединение - это левое соединение + правое соединение, в результате которых, получается одна таблица, содержащая все выбранные колонки, число строк обычно равняется количеству совпадающих строк по ключам + все несовпадающие.
- Внутреннее соединение - это соединение, результат которого выбранные поля обеих таблиц , которые смогли соединиться по заданному условию.
Поля таблиц, которые не удалось соединить, заполняются значениями NULL.
Стандарты 1С не рекомендуют делать соединения с вложенными запросами. Вместо них рекомендуется делать соединения с временными таблицами. С точки зрения СУБД оптимизатору сложно определить сколько записей во вложенном запросе (высока вероятность ошибки) и, соответственно, подобрать оптимальный план выполнения запроса.
Оглавление:
Внутреннее соединение двух таблиц в запросе 1С 8.3:
&НаСервере
Процедура ВнутреннееСоединениеДвухТаблиц()
Запрос = Новый Запрос("ВЫБРАТЬ
| Металлы.Наименование КАК НаименованиеИзТаблицы1,
| ПрайсЛист.Наименование КАК НаименованиеИзТаблицы2,
| ПрайсЛист.Цена КАК ЦенаИзТаблицы2
|ИЗ
| Справочник.Металлы КАК Металлы
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ
| Справочник.ПрайсЛист КАК ПрайсЛист
| ПО
| Металлы.Наименование = ПрайсЛист.Наименование");
РезультатЗапроса = Запрос.Выполнить(); Записи = РезультатЗапроса.Выбрать();
Пока Записи.Следующий() Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
КонецПроцедуры
Процедура ВнутреннееСоединениеДвухТаблиц()
Запрос = Новый Запрос("ВЫБРАТЬ
| Металлы.Наименование КАК НаименованиеИзТаблицы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,
| ПрайсЛист.Наименование КАК НаименованиеИзТаблицы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,
| ПрайсЛист.Наименование КАК НаименованиеИзТаблицы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,30NULL............................. Платина............................62,00NULL.............................. Родий................................568,27NULL.............................. Рутений.............................20,67
Полное соединение таблиц в запросе 1С 8.3:
&НаСервере
Процедура ПолноеСоединениеТаблиц()
Запрос = Новый Запрос("ВЫБРАТЬ
| Металлы.Наименование КАК НаименованиеИзТаблицы1,
| ПрайсЛист.Наименование КАК НаименованиеИзТаблицы2,
| ПрайсЛист.Цена КАК ЦенаИзТаблицы2
|ИЗ
| Справочник.Металлы КАК Металлы
| ПОЛНОЕ СОЕДИНЕНИЕ
| Справочник.ПрайсЛист КАК ПрайсЛист
| ПО
|Металлы.Наименование = ПрайсЛист.Наименование");
РезультатЗапроса = Запрос.Выполнить(); Записи = РезультатЗапроса.Выбрать();
Пока Записи.Следующий() Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
КонецПроцедуры
Процедура ПолноеСоединениеТаблиц()
Запрос = Новый Запрос("ВЫБРАТЬ
| Металлы.Наименование КАК НаименованиеИзТаблицы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.................................NULLNULL............................... Платина............................62,00NULL............................... Родий...............................568,27NULL............................... Рутений............................20,67
Перекрестное соединение таблиц в запросе 1С 8.3:
&НаСервере
Процедура ПерекрестноеСоединениеТаблиц()
Запрос = Новый Запрос("ВЫБРАТЬ
| Металлы.Наименование КАК НаименованиеИзТаблицы1,
| ПрайсЛист.Наименование КАК НаименованиеИзТаблицы2,
| ПрайсЛист.Цена КАК ЦенаИзТаблицы2
|ИЗ
| Справочник.Металлы КАК Металлы,
| Справочник.ПрайсЛист КАК ПрайсЛист");
РезультатЗапроса = Запрос.Выполнить(); Записи = РезультатЗапроса.Выбрать();
Пока Записи.Следующий() Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
КонецПроцедуры
Процедура ПерекрестноеСоединениеТаблиц()
Запрос = Новый Запрос("ВЫБРАТЬ
| Металлы.Наименование КАК НаименованиеИзТаблицы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
💡 Шаблоны (готовые модели) кода 1С 8.3 с тегом #Запросы:
0
комментарии
____________________
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник