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