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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Комментарии   

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

Комментарии

  • pavlo 18.09.2018 13:59
    У меня по второму варианту не получилось. При такой настройке появилась колонка построчно со словами названия колонки ресурса.

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

     
  • Altavista- 17.09.2018 20:51
    Не бесспорное решение: 1. В регистр логичнее добавить 2й ресурс ("вТрансфертныхЦенах"); 2. РС "Наценки"? Однозначно, нет. Это реквизит справочника; 3. Реквизита "Контрагент" в условии задачи тоже нет и ...

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

     
  • Андрей 02.08.2018 09:55
    Большое спасибо! По "Варианту 2": в выбранных полях группировки колонок (у меня их несколько) кроме поля самой колонки пришлось добавить и ресурс.

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