Имя: Пароль:
1C
1С v8
про НЕОПРЕДЕЛЕНО в запросе
,
0 ДядяМитяй
 
29.11.21
17:20
Объясните мне необъяснимое.
Суть вкратце в том, что надо получить дату из регистра сведений. Но если записи в регистре с нужным отбором нет вообще, то дату берем из справочника. И вот пишем

ВЫБРАТЬ
    Машины.Ссылка КАК Машина
    ВЫБОР
        КОГДА СостоянияМашинСрезПоследних.Регистратор = НЕОПРЕДЕЛЕНО
            ТОГДА   Машины.ДатаНачалаЭксплуатации    
        ИНАЧЕ СостоянияМашинСрезПоследних.Регистратор.ДатаКон
    КОНЕЦ КАК ДатаД
ИЗ
    Справочник.Машины КАК Машины
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СостоянияМашин.СрезПоследних(&дата) КАК СостоянияМашинСрезПоследних
        ПО (СостоянияМашинСрезПоследних.Машина = Машины.Ссылка)
ГДЕ
    Машины.Ссылка = &Машина

На Машине, не имеющей записей в регистре не работает, то есть из справочника дату не берет.
НО! Если написать

ВЫБРАТЬ
    Машины.Ссылка КАК Машина
    ВЫБОР
        КОГДА СостоянияМашинСрезПоследних.Регистратор <> НЕОПРЕДЕЛЕНО
            ТОГДА   СостоянияМашинСрезПоследних.Регистратор.ДатаКон
        ИНАЧЕ Машины.ДатаНачалаЭксплуатации    
    КОНЕЦ КАК ДатаД
ИЗ
    Справочник.Машины КАК Машины
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СостоянияМашин.СрезПоследних(&дата) КАК СостоянияМашинСрезПоследних //, Машина = &Машина
        ПО (СостоянияМашинСрезПоследних.Машина = Машины.Ссылка)
ГДЕ
    Машины.Ссылка = &Машина

Тогда все отрабатывает как задумано. Что это значит?
1 pechkin
 
29.11.21
17:21
познай разницу NULL и Неопределено
2 PuhUfa
 
29.11.21
17:23
(0) а при чем тут неопределено?
3 mikecool
 
29.11.21
17:25
(2) +1
4 ДядяМитяй
 
29.11.21
17:26
(2) потому что левое соединение. там в консоли пустая строчка, в регистраторе значение Неопределено
5 Dmitrii
 
гуру
29.11.21
17:28
Замени строку с ВЫБОР <бла...бла> на строку ЕСТЬNULL(СостоянияМашинСрезПоследних.Регистратор.ДатаКон, Машины.ДатаНачалаЭксплуатации).
И кстати вариант два не может работать как задумано, т.к. условие СостоянияМашинСрезПоследних.Регистратор <> НЕОПРЕДЕЛЕНО выполнится для любой строки, где есть нормальный Регистратор.
6 ДядяМитяй
 
29.11.21
17:28
(1) Пробовал там где ВЫБОР заменить на ЕСТЬNULL - не работает. Собственно, с этого и начинал. Потом в консоли увидел, что там НЕОПРЕДЕЛНО
7 RomanYS
 
29.11.21
17:30
(6) если регистр подчинен регистратору, то неопределенно там быть НЕ МОЖЕТ.
Точнее может, но это точно косяк в данных.
8 ДядяМитяй
 
29.11.21
17:31
(5) в этом и смысл. Если есть регистратор, значит есть запись регистра, если есть запись регистра, значит дату берем из регистратора
9 PuhUfa
 
29.11.21
17:32
(4) ну давай покажи нам чисто срез последних по твоей машине
10 ДядяМитяй
 
29.11.21
17:37
(7) (9) чисто срез последних - ничего нет, то есть null, если удастся к этому обратиться. А в случае соединения со спрвочником - неопределено
11 PuhUfa
 
29.11.21
17:38
(4) это "потому что" https://its.1c.ru/db/pubqlang/content/45/hdoc
12 ДядяМитяй
 
29.11.21
17:41
Вопрос-то не в том, а почему при Неопределено сравнение на равенство работает, а на неравенство - нет.
13 ДядяМитяй
 
29.11.21
17:42
(12) ну то есть наоборот. на неравенство работает
14 pechkin
 
29.11.21
17:43
сравнение с NULL всегда ложь
15 ДядяМитяй
 
29.11.21
17:44
(14) это к чему? там нигде нет NULL. Там Неопределено и пустая дата
16 PuhUfa
 
29.11.21
17:49
(15) если у тебя там неопределено и пустая дата - значит у тебя есть какой то срез. если у тебя среза нет то тогда там null. ну или ты там просто чего то не договаривашь.
17 fisher
 
29.11.21
17:54
(15) Нету там Неопределено. Не может быть записи РС подчиненного регистратору с Неопределено в регистраторе. А если нет записи по условию соединения, то там Null будет.
18 Kassern
 
29.11.21
18:01
(0) Самый простой пример. Решили вы изменить структуру справочника/регистра и добавили реквизит с типом булево. Для некоторых новых объектов вы даже его заполнили и потом бац и решили сделать простенький запрос: ВашОбъект.РеквизитБулево=Ложь в надежде, что все строки, где нет галочки у вас отберутся (ведь у булево всего же 2 значения...). На этом моменте вы познаете, что "Не Истина" не всегда равно "Ложь"))
По вашему топику, в запросах используйте ЕстьNull(Таблица.НужноеПоле,ЗначениеЕслиНул). В этом случае у вас выбор будет работать корректно.
19 Жан Пердежон
 
29.11.21
18:02
запрос всё-равно попахивает, эта дата в регистре должна быть
20 Жан Пердежон
 
29.11.21
18:18
(15) почитай что такое NULL и откуда оно в запросах берется