У книги есть цена 250, у ручки цены нет. Левое соединение сохраняет оба товара, внутреннее оставляет только книгу.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
В учебной обработке или общем модуле выполните каждый фрагмент отдельно на сервере. Все запросы используют только свои числа и параметры, без справочников, документов и регистров рабочей базы.
СхемаЗапроса редактирует структуру и формирует текст, а Запрос выполняет этот текст. Родительская схема должна оставаться в переменной, пока используются её дочерние объекты.
Не переносите полученные дочерние объекты между разными схемами и не обращайтесь к элементу после его удаления. Упражнения удаления работают только со своей структурой в памяти.
Схема = Новый СхемаЗапроса;
Схема.УстановитьТекстЗапроса("ВЫБРАТЬ 3 КАК Количество, 250 КАК Цена");
Если Схема.ПакетЗапросов.Количество() <> 1 Тогда
ВызватьИсключение "Ожидался один собственный запрос";
КонецЕсли;
Выбор = Схема.ПакетЗапросов.Получить(0);
Если ТипЗнч(Выбор) <> Тип("ЗапросВыбораСхемыЗапроса") Тогда
ВызватьИсключение "Первый собственный запрос не является выборкой";
КонецЕсли;
Если Выбор.Операторы.Количество() <> 1 Тогда
ВызватьИсключение "Ожидался один собственный оператор ВЫБРАТЬ";
КонецЕсли;
Оператор = Выбор.Операторы.Получить(0);
Источники = Оператор.Источники;
ТоварыИсточник = Источники.Добавить(Тип("ВложенныйЗапросСхемыЗапроса"), "Товары");
ЦеныИсточник = Источники.Добавить(Тип("ВложенныйЗапросСхемыЗапроса"), "Цены");
ТоварыИсточник.Источник.Запрос.УстановитьТекстЗапроса("ВЫБРАТЬ ""Книга"" КАК Наименование, 3 КАК Количество ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ""Ручка"", 1");
ЦеныИсточник.Источник.Запрос.УстановитьТекстЗапроса("ВЫБРАТЬ ""Книга"" КАК Наименование, 250 КАК Цена");
Поля = Оператор.ВыбираемыеПоля;
Поля.Очистить();
ПолеИмя = Поля.Добавить("Товары.Наименование");
ПолеКоличество = Поля.Добавить("Товары.Количество");
ПолеЦена = Поля.Добавить("ЕСТЬNULL(Цены.Цена, 0)");
КолонкаИмя = Выбор.Колонки.Найти(ПолеИмя);
КолонкаКоличество = Выбор.Колонки.Найти(ПолеКоличество);
КолонкаЦена = Выбор.Колонки.Найти(ПолеЦена);
Если КолонкаИмя = Неопределено Или КолонкаКоличество = Неопределено Или КолонкаЦена = Неопределено Тогда
ВызватьИсключение "Нет колонок собственных товаров и цен";
КонецЕсли;
КолонкаИмя.Псевдоним = "Наименование";
КолонкаКоличество.Псевдоним = "Количество";
КолонкаЦена.Псевдоним = "Цена";
Соединения = ТоварыИсточник.Соединения;
Связь = Соединения.Добавить(ЦеныИсточник, "Товары.Наименование = Цены.Наименование");
Связь.ТипСоединения = ТипСоединенияСхемыЗапроса.ЛевоеВнешнее;
Запрос = Новый Запрос(Схема.ПолучитьТекстЗапроса());
Левые = Запрос.Выполнить().Выгрузить();
Если Левые.Количество() <> 2 Тогда
ВызватьИсключение "Неожиданное число собственных строк соединения";
КонецЕсли;
Книга = Левые.Найти("Книга", "Наименование");
Ручка = Левые.Найти("Ручка", "Наименование");
Если Книга = Неопределено Или Ручка = Неопределено Тогда
ВызватьИсключение "Левое соединение потеряло собственный товар";
КонецЕсли;
Сообщить(Книга.Количество * Книга.Цена = 750);
Сообщить(Ручка.Количество = 1 И Ручка.Цена = 0);
Связь.ТипСоединения = ТипСоединенияСхемыЗапроса.Внутреннее;
Запрос = Новый Запрос(Схема.ПолучитьТекстЗапроса());
Внутренние = Запрос.Выполнить().Выгрузить();
Если Внутренние.Количество() <> 1 Тогда
ВызватьИсключение "Неожиданное число собственных строк соединения";
КонецЕсли;
Сообщить(Внутренние[0].Наименование = "Книга" И Внутренние[0].Цена = 250);
Сообщить(Связь.Источник = ЦеныИсточник);Разбор по шагам
Два вложенных источника содержат только собственные константы, не рабочие справочники.
Внешние поля пересозданы по псевдонимам; имя результата каждого поля задано после проверки найденной колонки.
Добавить соединяет Товары с Цены по равенству наименований. ТипСоединения явно установлен, значение по умолчанию не предполагается.
ЕСТЬNULL превращает отсутствующую цену ручки в 0. Это учебное правило, не утверждение, что товар действительно бесплатный.
Меняем только тип связи, повторно получаем текст и выполняем запрос: внутреннее соединение исключило ручку.
Как проверить результат
Четыре сообщения Истина.
При левом соединении 2 строки, при внутреннем 1. Книга: 3 × 250 = 750.
Ожидаемый результат
Результат показывает разницу соединений на одних и тех же данных.
На что обратить внимание
Цена 0 для отсутствующего совпадения — выбранное правило примера, а не фактическая цена.
Поиск строк идёт по имени: случайный порядок результата без УПОРЯДОЧИТЬ не предполагается.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.