Имя: Пароль:
1C
1С v8
Соединение в запросе и условие
0 salvator
 
15.12.20
16:49
Доброго дня!
Скажите, можно ли в запросе как-то указать с какой таблицей делать левое соединение, в зависимости от условий?
Пример такой:
К справочнику левым соединением присоединяется виртуальная таблица регистра сведений.
Затем еще одним левым соединением другая виртуальная таблица другого регистра сведений (РС-1)
Стоит задача переписать запрос: в зависимости от условия выбирать либо данные из РС-1, либо РС-2  (так же левым соединением, РС-2 пока в запросе не фигурирует).
Как лучше сделать: добавить еще одно левое соединение (к РС-2) и получать из него данные по условию (через выбор-когда или в постобработке), либо сделать два разных текста запроса в зависимости от условия и не делать дополнительное соединение? Условие на соединение же никак не прописать, насколько я знаю?
1 asady
 
15.12.20
17:01
(0) текст запроса формируй программно.
2 salvator
 
15.12.20
17:02
(1) Вариант, конечно, но хотелось бы иметь текст запроса, способный открываться в дальнейшем в конструкторе.
3 lEvGl
 
гуру
15.12.20
17:03
выбор когда это же и есть условие
4 mkalimulin
 
15.12.20
17:05
(0) Что значит: не прописать условие на соединение? То, что стоит после ПО и есть нужное тебе условие
5 Dmitrii
 
гуру
15.12.20
17:06
(0) Можно как-нибудь так.


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



А вообще вариантов может быть несколько, включая программное формирование текста запроса.
6 acht
 
15.12.20
17:07
(0) > словие на соединение же никак не прописать
выбрать
выбор когда &флаг1 тогда таблица1.поле иначе таблица2.поле конец
из таблица0
левое соединение таблица1 по &флаг1 и (...)
левое соединение таблица2 по не &флаг1 и (...)
7 salvator
 
15.12.20
17:12
(5) Если СоединятьСПервымРегистром = Истина, то фактически в базе данных соединения с "РегистрСведений.МойВторойРС" не будет, я правильно понимаю?
8 Dmitrii
 
гуру
15.12.20
17:13
Или еще так.

Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ
| МойСправочник.Код КАК Код,
| МойСправочник.Наименование КАК Наименование,
| МойРС.РеквизитРегистра
| КОНЕЦ КАК РеквизитРегистра
|ИЗ
| Справочник.МойСправочник КАК МойСправочник
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МойРС КАК МойРС
|   ПО &СоединятьСПервымРегистром И МойСправочник.Ссылка = МойРС.Ключ";
Если МоёУсловие Тогда
СтрЗаменить(Запрос.Текст, "РегистрСведений.МойРС", "РегистрСведенй.МойВторойРС");
КонецЕсли;
9 Dmitrii
 
гуру
15.12.20
17:15
(7) Да. При значении параметра СоединятьСПервымРегистром = Истина условие соединения с таблицей МойВторойРС всегда будет ЛОЖЬ, а это значит, что из таблицы МойВторойРС ни одна запись в результат не попадёт.
10 salvator
 
15.12.20
17:19
(9) Не совсем понял, а само соединение, физически, строится или нет? Такая конструкция влияет на производительность?
11 Dmitrii
 
гуру
15.12.20
17:26
(10) >> Такая конструкция влияет на производительность?

Для достоверности лучше бы конечно проверить, но предположу, что не влияет. Оптимизаторы СУБД достаточно умные, чтобы учесть тот факт, что условие соединения всегда ЛОЖЬ.
Я бы заморачивался с этим вопросом только когда соединяемые таблицы реально огромны. При относительно небольшом количестве записей (сотни тысяч) разница вряд ли будет ощутима.
12 salvator
 
15.12.20
17:32
Спасибо большоей!
13 youalex
 
15.12.20
17:32
(10) в ms sql было, насколько помню, если условие через переменную, то строится, если через литералы (1=0), то нет.
Как 1С строит запрос в этом случае - надо смотреть.
14 salvator
 
15.12.20
17:36
(13) Понятно, спасибо за информацию.
15 Малыш Джон
 
15.12.20
17:41
(14) Можно через сделать вариант запроса с соединением с одним РС, а по условию - СтрЗаменить(ТекстЗапроса, КусокЗапросаСоСтарымРС, КусокЗапросаСНовымРС).

И в конструкторе открываться будет,и не будет заморочек с производительностью
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.