Имя: Пароль:
1C
1С v8
СКД, необязательные таблицы и отбор
0 Fragster
 
гуру
25.10.11
18:31
Есть запрос в СКД (болванка)

ВЫБРАТЬ
   ВЫРАЗИТЬ(&Контрагент КАК Справочник.Контрагенты) КАК Контрагент,
   ВЫРАЗИТЬ(&Договор КАК Справочник.ДоговорыКонтрагентов) КАК Договор,
   ВЫРАЗИТЬ(&СуммаДокумента КАК ЧИСЛО(15, 2)) КАК СуммаДокумента
ПОМЕСТИТЬ ДанныеШапки
{ГДЕ
   (ВЫРАЗИТЬ(&Контрагент КАК Справочник.Контрагенты)).* КАК Контрагент,
   (ВЫРАЗИТЬ(&Договор КАК Справочник.ДоговорыКонтрагентов)).* КАК Договор,
   (ВЫРАЗИТЬ(&СуммаДокумента КАК ЧИСЛО(15, 2))) КАК СуммаДокумента}
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ ПЕРВЫЕ 1
   1 КАК Присутствует
{ВЫБРАТЬ
   Присутствует}
ИЗ
   ДанныеШапки КАК ДанныеШапки
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
           ЦеновыеГруппы.Объект КАК Объект
       ИЗ
           РегистрСведений.ЦеновыеГруппы КАК ЦеновыеГруппы
       ГДЕ
           ЦеновыеГруппы.ВключаяОбъект
       {ГДЕ
           ЦеновыеГруппы.ЦеноваяГруппа.* КАК ЦеноваяГруппаКонтрагента}) КАК ВложенныйЗапрос
       ПО ДанныеШапки.Контрагент = ВложенныйЗапрос.Объект


Нужно сделать так, чтобы если отбор по ЦеноваяГруппаКонтрагента не установлен - он даже не пытался подсоединить таблицу. Если указать таблицу как необязательную - то он ее не присоединяет, даже если условие указано, если как обязательную - то присоединяет в обоих случаях.

Пока вижу вариант в обходе отбора и если есть отбор по ЦеноваяГруппаКонтрагента, то добавление в выбранные поля поля Объект, но это ведет к говнокоду. есть ли способ проще?
1 acsent
 
25.10.11
18:43
Таблицы присоединяются не по условиям, а по выбранным полям
2 acsent
 
25.10.11
18:44
А вообще зачем такой изврат?
3 Fragster
 
гуру
25.10.11
18:49
(2) это таблица-фильтр (там внутреннее соединение). чтобы прилепляла её только когда отбор установлен, и не тормозила запрос, когда не установлен
4 also
 
25.10.11
18:51
Сделать вторым набором данных?
5 acsent
 
25.10.11
18:51
А не прще ли так:
       ВЫБРАТЬ
           1
       ИЗ
           РегистрСведений.ЦеновыеГруппы КАК ЦеновыеГруппы
       ГДЕ
           ЦеновыеГруппы.ВключаяОбъект = &Контрагент
       {ГДЕ
           ЦеновыеГруппы.ЦеноваяГруппа.* КАК ЦеноваяГруппаКонтрагента
6 Fragster
 
гуру
25.10.11
18:53
(5) а если нет отбора по ценовым группам, но есть отбор по договор.видДоговора? или контрагент не входит ни в одну группу?
7 Fragster
 
гуру
25.10.11
18:54
это извращенная фантазия маркетоидов - сделать так, чтобы у маркетинговых акций можно было б указывать относительно произвольные условия.
8 also
 
25.10.11
18:55
реально извращенцы
9 acsent
 
25.10.11
18:55
ВЫБРАТЬ
           1
       ИЗ
           РегистрСведений.ЦеновыеГруппы КАК ЦеновыеГруппы
       ГДЕ
           ЦеновыеГруппы.ВключаяОбъект = &Контрагент
       {ГДЕ
           ЦеновыеГруппы.ЦеноваяГруппа.* КАК ЦеноваяГруппаКонтрагента
           (ВЫРАЗИТЬ(&Договор КАК Справочник.ДоговорыКонтрагентов)).* КАК Договор,
           (ВЫРАЗИТЬ(&СуммаДокумента КАК ЧИСЛО(15, 2))) КАК СуммаДокумента}
10 Fragster
 
гуру
25.10.11
18:57
(9) не решает проблему, если контрагент не входит ни в одну группу
11 acsent
 
25.10.11
18:59
(10) результат запроса будет абсолютно такой же. У тебя ведь ВНУТРЕННЕЕ соединение
12 Fragster
 
гуру
25.10.11
19:00
(11) в том то и дело, хочу, чтобы если не установлен отбор - то не соединять...
13 acsent
 
25.10.11
19:02
через объединение делай
14 Fragster
 
гуру
25.10.11
19:04
(13) тогда отбор по группе работать и не будет ;)

ларчик просто открывался, нужно добавить условие еще и во внешнюю таблицу, тогда присоединяется только если отбор есть:

ВЫБРАТЬ
   ВЫРАЗИТЬ(&Контрагент КАК Справочник.Контрагенты) КАК Контрагент,
   ВЫРАЗИТЬ(&Договор КАК Справочник.ДоговорыКонтрагентов) КАК Договор,
   ВЫРАЗИТЬ(&СуммаДокумента КАК ЧИСЛО(15, 2)) КАК СуммаДокумента
ПОМЕСТИТЬ ДанныеШапки
{ГДЕ
   (ВЫРАЗИТЬ(&Контрагент КАК Справочник.Контрагенты)).* КАК Контрагент,
   (ВЫРАЗИТЬ(&Договор КАК Справочник.ДоговорыКонтрагентов)).* КАК Договор,
   (ВЫРАЗИТЬ(&СуммаДокумента КАК ЧИСЛО(15, 2))) КАК СуммаДокумента}
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ ПЕРВЫЕ 1
   1 КАК Присутствует
{ВЫБРАТЬ
   Присутствует}
ИЗ
   ДанныеШапки КАК ДанныеШапки
       {ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
           ЦеновыеГруппы.Объект КАК Объект,
           ЦеновыеГруппы.ЦеноваяГруппа КАК ЦеноваяГруппа
       ИЗ
           РегистрСведений.ЦеновыеГруппы КАК ЦеновыеГруппы
       ГДЕ
           ЦеновыеГруппы.ВключаяОбъект
       {ГДЕ
           ЦеновыеГруппы.ЦеноваяГруппа.* КАК ЦеноваяГруппаКонтрагента}) КАК ВложенныйЗапрос
       ПО ДанныеШапки.Контрагент = ВложенныйЗапрос.Объект}
{ГДЕ
   ВложенныйЗапрос.ЦеноваяГруппа.* КАК ЦеноваяГруппаКонтрагента}
Ошибка? Это не ошибка, это системная функция.