1С. Запросы. Левое соединение работает как внутреннее – урезаются данные из левой таблицы.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *