Имя: Пароль:
1C
1С v8
Составить соединение в запросе, если соединяемое поле может принимать NULL
0 Vladal
 
24.10.12
14:55
Есть два регистра с похожей аналитикой - 4 совпадающих измерения "Организация, Контрагент, ДоговорКонтрагента и Сделка".

В старых документах местами не была указана аналитика, в новых указывается всё, с этим проблем при соединении нет. Организация указана у всех, а контрагенты/договоры не всегда.

Но мне надо связать данные из регистров по совпадающим полям. Т.е. если контрагент в одной таблице есть, а в другой - NULL, тогда соединяем по организации. Или: организация и контрагент указаны, но в записи одного регистра договор указан, а в другом - нет.

Если просто написать соединение, то попадают не все записи, если указать только организацию - то много лишней инфы. Я в соединении написал выбор - если контрагент где-то отсутствует, тогда соединяем. Вот кусок запроса:

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

Он все равно пропускает все записи. Что бы еще подправить? Написать ЕстьНУЛЛ?
1 shuhard
 
24.10.12
14:57
(0) [КОГДА ДДС.Контрагент = NULL]
и чё - работает ?
2 Vladal
 
24.10.12
14:57
(1) неа. поцчему-то не работает (( как напейсать правильно?
3 Vladal
 
24.10.12
14:58
ЕстьНулл?
4 Kashemir
 
24.10.12
14:58
Есть NULL
5 Feanorko
 
24.10.12
14:58
(2) познаешь 8-ку? :)
6 Vladal
 
24.10.12
15:01
(5) ага. возвращаюсь к напечатанному. долго не тренировался в восьмерке.
7 Feanorko
 
24.10.12
15:04
(6) А в чем трудность заполнить аналитику, если она нужна? Полагаю, запросом нормально не сделаешь свою задачу: будешь соединять без учета одного поля и получишь тучу лишних записей в итоге.
8 Vladal
 
24.10.12
15:05
(7) в закрытых периодах и аналитику вели несколькими документами. Потом одним. Притом давно.
9 1Страх
 
24.10.12
15:06
там не может быть NULL с точки зрения 1С
10 Reset
 
24.10.12
15:06
(ВзаиморасчетыСКонтрагентамиОстатки.Контрагент ЕСТЬ NULL
ИЛИ
ДДС.Контрагент = ВзаиморасчетыСКонтрагентамиОстатки.Контрагент)


ДДС.Контрагент на null проверять не надо, я так понимаю
11 Feanorko
 
24.10.12
15:07
(8) если не хочешь трогать закрытый период, то на начало открытого корректировкой обнули кривые данные и заполни правильными
12 1Страх
 
24.10.12
15:07
(8) вот он вред от неопеределено!
13 Reset
 
24.10.12
15:08
(10) Написал фигню, не вдумываясь
14 Reset
 
24.10.12
15:09
Верно в (9)
15 Vladal
 
24.10.12
15:13
(9) Ну если бы выгружал в ТЗ или выборке - то да, неопределено. А в запросе НУЛЛ
16 Vladal
 
24.10.12
15:14
(10) Надо оба олперанда проверять, левый и правый. Я накреативил
   |            И (ВЫБОР
   |                КОГДА (ДДС.Контрагент ЕСТЬ NULL
   |                        ИЛИ ВзаиморасчетыСКонтрагентамиОстатки.Контрагент ЕСТЬ NULL)
   |                    ТОГДА ИСТИНА
   |                ИНАЧЕ ДДС.Контрагент = ВзаиморасчетыСКонтрагентамиОстатки.Контрагент
   |            КОНЕЦ)
   |            И (ВЫБОР
   |                КОГДА (ДДС.ДоговорКонтрагента ЕСТЬ NULL
   |                        ИЛИ ВзаиморасчетыСКонтрагентамиОстатки.ДоговорКонтрагента ЕСТЬ NULL)
   |                    ТОГДА ИСТИНА
   |                ИНАЧЕ ДДС.ДоговорКонтрагента = ВзаиморасчетыСКонтрагентамиОстатки.ДоговорКонтрагента
   |            КОНЕЦ)
   |            И (ВЫБОР
   |                КОГДА (ДДС.Сделка ЕСТЬ NULL
   |                        ИЛИ ВзаиморасчетыСКонтрагентамиОстатки.Сделка ЕСТЬ NULL)
   |                    ТОГДА ИСТИНА
   |                ИНАЧЕ ДДС.Сделка = ВзаиморасчетыСКонтрагентамиОстатки.Сделка
   |            КОНЕЦ)
17 Vladal
 
24.10.12
15:14
И все равно нихт...
18 Feanorko
 
24.10.12
15:16
(17) внимательно прочитай то, что в (7) после двоеточия, хорошенько подумай :)
19 Vladal
 
24.10.12
15:19
(18) вопрос о конкретной связи в конкретной выборке за конкретный период. В новом периоде всё есть, в старом нет.
20 Reset
 
24.10.12
15:19
Вероятно, нужно проверять на
ДДС.Контрагент=Значение(Справочник.Контрагенты.ПустаяСсылка)
21 Feanorko
 
24.10.12
15:22
(19) плохо ты прочитал, ничего не понял, видимо :) бейся дальше и пытайся решить нерешаемую задачу :)
22 Vladal
 
24.10.12
15:44
(21) Повторю: до определенной даты аналитика не учитывалась и велась "по желанию" и разными документами
После августа 11 года данные велись в одном документе, с указанием аналитики.
23 Feanorko
 
24.10.12
15:45
(22) Пилите, Шура, пилите, они золотые :)
24 Vladal
 
24.10.12
16:17
(23) Уже выпилили.
25 Sedoy
 
24.10.12
16:28
Я конечно в 8-ке еще дилетант, только начал осваивать, но почему выбор не сделать не по условию , где какая аналитика, а просто разделить запрос по временным периодам, с учетом различного заполнения аналитики и эти периоды объединить?
26 Vladal
 
24.10.12
16:48
(25) Хорошая идея. Но уже пилим аналитику в документы, как говорил достопочтенный Feanorko
27 Vladal
 
24.10.12
16:57
Вопрос решён. // где-то тут должен быть этот флажок
OFF: Состояние темы в заголовке [не было 'Не решено', и не будет, и не надо!]