При попытке соединения в запросе двух таблиц в режиме «Левое соединение» иногда возникает ситуация, когда данные из левой таблицы выбираются не все, как должно быть, а только те, которые есть в правой таблице. То есть, получается «Внутреннее соединение».
Например, мы хотим выбрать все документы «Заказ клиента» за какой-то период и соединить каждый из них со своим значением дополнительного сведения «Вип заказ», которое имеет тип «Булево» и хранится в регистре сведений «Дополнительные сведения».
Нужно помнить, что в указанном регистре сведений находятся не все документы «Заказ клиента», а только те, у которых значение дополнительного сведения «Вип заказ» установлено в «Да».
Итак, пишем запрос:
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЗаказыКлиентов.Ссылка КАК ЗаказКлиента, | ДополнительныеСведения.Значение КАК ЭтоВипЗаказ |ИЗ | Документ.ЗаказКлиента КАК ЗаказыКлиентов | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеСведения КАК ДополнительныеСведения | ПО (ЗаказыКлиентов.Ссылка = ДополнительныеСведения.Объект) |ГДЕ | ДополнительныеСведения.Свойство = &СвойствоДопСведения"; Запрос.УстановитьПараметр("СвойствоДопСведения", ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Вип заказ (Список заказов клиентов)"); Запрос.Выполнить();
В выборке этого запроса мы увидим результат не «Левого соединения», которое мы указали в тексте запроса, а «Внутреннего соединения». В выборке окажутся только те документы «Заказ клиента», которые присутствуют в правой таблице – «ДополнительныеСведения».
Чтобы избежать такую ситуацию, нужно использовать временную таблицу или вложенный запрос.
Решение с использованием временной таблицы:
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ДополнительныеСведения.Объект КАК ЗаказКлиента, | ДополнительныеСведения.Значение КАК ЭтоВипЗаказ |ПОМЕСТИТЬ ДополнительныеСведения |ИЗ | РегистрСведений.ДополнительныеСведения КАК ДополнительныеСведения |ГДЕ | ДополнительныеСведения.Свойство = &СвойствоДопСведения |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ЗаказыКлиентов.Ссылка КАК ЗаказКлиента, | ДополнительныеСведения.ЭтоВипЗаказ КАК ЭтоВипЗаказ |ИЗ | Документ.ЗаказКлиента КАК ЗаказыКлиентов | ЛЕВОЕ СОЕДИНЕНИЕ ДополнительныеСведения КАК ДополнительныеСведения | ПО ЗаказыКлиентов.Ссылка = ДополнительныеСведения.ЗаказКлиента"; Запрос.УстановитьПараметр("СвойствоДопСведения", ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Вип заказ (Список заказов клиентов)"); Запрос.Выполнить();
Решение с использованием вложенного запроса:
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЗаказыКлиентов.Ссылка КАК ЗаказКлиента, | ДополнительныеСведения.ЭтоВипЗаказ КАК ЭтоВипЗаказ |ИЗ | Документ.ЗаказКлиента КАК ЗаказыКлиентов | ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ | ДополнительныеСведения.Объект КАК ЗаказКлиента, | ДополнительныеСведения.Значение КАК ЭтоВипЗаказ | ИЗ | РегистрСведений.ДополнительныеСведения КАК ДополнительныеСведения | ГДЕ | ДополнительныеСведения.Свойство = &СвойствоДопСведения) КАК ДополнительныеСведения | ПО (ЗаказыКлиентов.Ссылка = ДополнительныеСведения.ЗаказКлиента)"; Запрос.УстановитьПараметр("СвойствоДопСведения", ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Вип заказ (Список заказов клиентов)"); Запрос.Выполнить();
Оба эти варианты запросов дадут в итоге настоящее «Левое соединение»: в выборку попадут все документы «Заказ клиента» из левой таблицы и значения дополнительного сведения из правой таблицы для тех документов, у которых это сведение задано.
Добавить комментарий