Имя: Пароль:
1C
1С v8
СКД. Изменение вида соединения в зависимости от парметров
0 pessok
 
28.10.11
16:34
Доброго времени суток. Очередной затык с СКД случился...
Надо в зависимости от заполненности параметров виртуальной таблицы изменять тип соединения таблиц следующим образом:
Если параметры не заполнены - левое соединение, если заполнены - полное.
Делается это для получения множества значений из двух выборок.

ВЫБРАТЬ
   ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа.Ссылка,
   ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа.Ссылка.ЦФО,
   ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа.Ссылка.СтатьяОборотов,
   ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа.Ссылка.Ответственный,
   ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа.Ссылка.ФизЛицо,
   ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа.СуммаПлатежа,
   ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа.ДоговорКонтрагента,
   ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа.ДоговорКонтрагента.Владелец,
   СостоянияСогласованияЗаявокСрезПоследних.Состояние,
   СостоянияСогласованияЗаявокСрезПоследних.Этап,
   СостоянияСогласованияЗаявокСрезПоследних.Комментарий,
   СостоянияСогласованияЗаявокСрезПоследних.Пользователь,
   ЕСТЬNULL(ДвиженияДенежныхСредствОбороты.СуммаОборот, 0) КАК Сумма,
   ВЫБОР
       КОГДА ЗаявкаНаРасходованиеСредствДатыРасхода.Дата = &СегодняшняяДата
           ТОГДА ЗаявкаНаРасходованиеСредствДатыРасхода.СуммаРасхода
       ИНАЧЕ 0
   КОНЕЦ КАК СуммаОплатыНаСегодня,
   ВЫБОР
       КОГДА (НЕ ДвиженияДенежныхСредствОбороты.Регистратор ЕСТЬ NULL )
           ТОГДА ДвиженияДенежныхСредствОбороты.Регистратор
       ИНАЧЕ NULL
   КОНЕЦ КАК ПлатежныйДокумент
ИЗ
   Документ.ЗаявкаНаРасходованиеСредств.РасшифровкаПлатежа КАК ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа
       ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.ДвиженияДенежныхСредств.Обороты({&ПериодОплатыНачало}, {&ПериодОплатыКонец}, Регистратор, ) КАК ДвиженияДенежныхСредствОбороты
       ПО ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа.Ссылка = ДвиженияДенежныхСредствОбороты.ДокументПланированияПлатежа
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СостоянияСогласованияЗаявок.СрезПоследних КАК СостоянияСогласованияЗаявокСрезПоследних
       ПО ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа.Ссылка = СостоянияСогласованияЗаявокСрезПоследних.Заявка
       ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаявкаНаРасходованиеСредств.ДатыРасхода КАК ЗаявкаНаРасходованиеСредствДатыРасхода
       ПО ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа.Ссылка = ЗаявкаНаРасходованиеСредствДатыРасхода.Ссылка
       
ГДЕ
   ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода
           И СостоянияСогласованияЗаявокСрезПоследних.Заявка.Проведен = &Проведен

УПОРЯДОЧИТЬ ПО
   ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа.Ссылка.Дата

Т.е. если ПериодОплатыНачало и ПериодОплатыКонец заполнены - то полное соединение, если не заполнены, то левое.
Скорее всего я делаю что-то не так, и все решается другим методом, если так - то ткните носом, пожалуйста. (только сильно не бейте) :) Идея простая:
Если не выбран период оплат по регистратору, то выводим все заявки, если выбран, то только те заявки, которые были оплачены за этот период и входят в период создания заявок. Мудреное описание получилось, но, надеюсь, понятное...
1 pessok
 
28.10.11
16:35
Ах да, УПП.
2 Axel2009
 
28.10.11
16:48
ГДЕ НЕ ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа.Ссылка ЕСТЬ NULL
3 pessok
 
28.10.11
17:04
(2) ничего не изменилось, после того как это условие добавил. да и к чему это?
объясню как происходит на данный момент.
Подмножество заявок отбирается, а вот подмножество оплат к нему не цепляется. Т.е. не получается общего подмножества. Если делать левое соединение - лезут все заявки, если делать полное, то даже без указанных параметров ПериодОплатыНачало и ПериодОплатыКонец отбираются только оплаченные заявки.
4 Axel2009
 
28.10.11
17:06
потому что из ГДЕ нужно переносить в соединение ПО
5 pessok
 
28.10.11
17:13
(4) эммм. не понял, что-то я туплю уже к вечеру... ладно, разберусь, идея ясна, спасибо
6 Axel2009
 
28.10.11
17:14
(5) в ГДЕ фильтр накладывается на результирующую таблицу. при полном соединении если нет данныех в левой таблице и есть в правой, то
ГДЕ
   ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода
отфильтрует эти записи, и в результат они не попадут.
7 pessok
 
31.10.11
09:17
блин. так я и не понял, куда надо приткнуть

ГДЕ НЕ ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа.Ссылка ЕСТЬ NULL

в соединение ставлю - синтаксическая ошибка, к левой таблице - "Ожидается имя таблицы". Где вообще можно почитать про условия в самих соединениях?
8 pessok
 
31.10.11
09:52
ап, чтоли...
9 pessok
 
31.10.11
10:46
еще ап.сейчас запрос имеет вид

ВЫБРАТЬ
   ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа.Ссылка,
   ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа.Ссылка.ЦФО,
   ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа.Ссылка.СтатьяОборотов,
   ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа.Ссылка.Ответственный,
   ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа.Ссылка.ФизЛицо,
   ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа.СуммаПлатежа,
   ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа.ДоговорКонтрагента,
   ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа.ДоговорКонтрагента.Владелец,
   СостоянияСогласованияЗаявокСрезПоследних.Состояние,
   СостоянияСогласованияЗаявокСрезПоследних.Этап,
   СостоянияСогласованияЗаявокСрезПоследних.Комментарий,
   СостоянияСогласованияЗаявокСрезПоследних.Пользователь,
   ЕСТЬNULL(ДвиженияДенежныхСредствОбороты.СуммаОборот, 0) КАК Сумма,
   ВЫБОР
       КОГДА ЗаявкаНаРасходованиеСредствДатыРасхода.Дата = &СегодняшняяДата
           ТОГДА ЗаявкаНаРасходованиеСредствДатыРасхода.СуммаРасхода
       ИНАЧЕ 0
   КОНЕЦ КАК СуммаОплатыНаСегодня,
   ВЫБОР
       КОГДА (НЕ ДвиженияДенежныхСредствОбороты.Регистратор ЕСТЬ NULL )
           ТОГДА ДвиженияДенежныхСредствОбороты.Регистратор
       ИНАЧЕ NULL
   КОНЕЦ КАК ПлатежныйДокумент
ИЗ
   РегистрНакопления.ДвиженияДенежныхСредств.Обороты(&ПериодОплатыНачало, &ПериодОплатыКонец, Регистратор, ) КАК ДвиженияДенежныхСредствОбороты
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЗаявкаНаРасходованиеСредств.РасшифровкаПлатежа КАК ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа
           ПОЛНОЕ СОЕДИНЕНИЕ РегистрСведений.СостоянияСогласованияЗаявок.СрезПоследних КАК СостоянияСогласованияЗаявокСрезПоследних
           ПО ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа.Ссылка = СостоянияСогласованияЗаявокСрезПоследних.Заявка
           ПОЛНОЕ СОЕДИНЕНИЕ Документ.ЗаявкаНаРасходованиеСредств.ДатыРасхода КАК ЗаявкаНаРасходованиеСредствДатыРасхода
           ПО ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа.Ссылка = ЗаявкаНаРасходованиеСредствДатыРасхода.Ссылка
       ПО ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа.Ссылка = ДвиженияДенежныхСредствОбороты.ДокументПланированияПлатежа
{ГДЕ
   ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода
   И СостоянияСогласованияЗаявокСрезПоследних.Заявка.Проведен = &Проведен}

УПОРЯДОЧИТЬ ПО
   ЗаявкаНаРасходованиеСредствРасшифровкаПлатежа.Ссылка.Дата

соответственно соединение идет только внутреннее. как же нужно установить условия, чтобы при незаполненных параметрах виртуальной таблицы соединение становилось полным(в данном случае)
10 pessok
 
31.10.11
13:26
ап... блин, неужели никто не может/не хочет объяснить/дать линк? %)
11 pessok
 
31.10.11
15:24
ап
12 Робинзон Крузо
 
31.10.11
15:31
Сделай два варианта отчета. Не трать полдня там, где можно сделать за 5 минут.
13 pessok
 
31.10.11
15:38
(12) топорно это. а вот как не топорно сделать - свой мозг не может дать решения. хотелось бы красиво сделать таки. А так - придется от заполненности параметров менять набор данных...
14 Axel2009
 
31.10.11
17:24
(13) т.е. просто выставив фигурные скобки, все автоматом становится полным соединением??
чтобы сделать полное соединение, нужно писать ПОЛНОЕ СОЕДИНЕНИЕ, но никак не внутреннее.