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

Например, мы хотим выбрать все документы "Заказ клиента" за какой-то период и соединить каждый из них со своим значением дополнительного сведения "Вип заказ", которое имеет тип "Булево" и хранится в регистре сведений "Дополнительные сведения".

Нужно помнить, что в указанном регистре сведений находятся не все документы "Заказ клиента", а только те, у которых значение дополнительного сведения "Вип заказ" установлено в "Да".

Итак, пишем запрос:

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
|	ЗаказыКлиентов.Ссылка КАК ЗаказКлиента,
|	ДополнительныеСведения.Значение КАК ЭтоВипЗаказ
|ИЗ
|	Документ.ЗаказКлиента КАК ЗаказыКлиентов
|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеСведения КАК ДополнительныеСведения
|		ПО (ЗаказыКлиентов.Ссылка = ДополнительныеСведения.Объект)
|ГДЕ
|	ДополнительныеСведения.Свойство = &СвойствоДопСведения";

Запрос.УстановитьПараметр("СвойствоДопСведения", ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Вип заказ (Список заказов клиентов)");
Запрос.Выполнить();

В выборке этого запроса мы увидим результат не "Левого соединения", которое мы указали в тексте запроса, а "Внутреннего соединения". В выборке окажутся только те документы "Заказ клиента", которые присутствуют в правой таблице – "ДополнительныеСведения".

Чтобы избежать такую ситуацию, нужно использовать временную таблицу или вложенный запрос.

Решение с использованием временной таблицы:

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

Запрос.УстановитьПараметр("СвойствоДопСведения", ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Вип заказ (Список заказов клиентов)");
Запрос.Выполнить();

Решение с использованием вложенного запроса:

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
|	ЗаказыКлиентов.Ссылка КАК ЗаказКлиента,
|	ДополнительныеСведения.ЭтоВипЗаказ КАК ЭтоВипЗаказ
|ИЗ
|	Документ.ЗаказКлиента КАК ЗаказыКлиентов
|		ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
|			ДополнительныеСведения.Объект КАК ЗаказКлиента,
|			ДополнительныеСведения.Значение КАК ЭтоВипЗаказ
|		ИЗ
|			РегистрСведений.ДополнительныеСведения КАК ДополнительныеСведения
|		ГДЕ
|			ДополнительныеСведения.Свойство = &СвойствоДопСведения) КАК ДополнительныеСведения
|		ПО (ЗаказыКлиентов.Ссылка = ДополнительныеСведения.ЗаказКлиента)";

Запрос.УстановитьПараметр("СвойствоДопСведения", ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Вип заказ (Список заказов клиентов)");
Запрос.Выполнить();

Оба эти варианты запросов дадут в итоге настоящее "Левое соединение": в выборку попадут все документы "Заказ клиента" из левой таблицы и значения дополнительного сведения из правой таблицы для тех документов, у которых это сведение задано.

Комментарии   

0 #1 Прохожий 27.05.2017 19:47
В условии задания не указано четко, что регистр сведений может содержать значения различных свойств (разных типов).
Если хранится свойство одного типа, то условие "ГДЕ" не требуется. Левое соединение сработает без проблем.
Если типов в регистре более одного, без вложенного запроса или временной таблицы не обойтись, поскольку соединение необходимо делать не со всей таблицей, а только с записями выбранного типа.
Цитировать

Комментарии

  • Гринёв 20.12.2017 09:45
    Только надо иметь ввиду, что СтандартнаяОбработка = Ложь в процедуре ПриКомпоновкеРезультата отключает стандартную расшифровку полей отчёта.

    Подробнее...

     
  • proekt 06.12.2017 10:03
    Привет. Обработка проведения РасходнойНакладной запрос от проведения ПланаПродаж необходимо подправить запрос для Расходной. Такой вопрос при проведении Расходной накладной почему сразу в запросе не ...

    Подробнее...

     
  • Ivan 01.11.2017 14:14
    Неверно. Так мы узнаем DNS сервер по умолчанию, но он не обязательно совпадает с контроллером домена. Нужно так > set logon В ответе получим имя сервера, на котором мы залогинились.

    Подробнее...