Имя: Пароль:
1C
 
Использование литерала NULL
0 Zhuravlik
 
08.05.16
16:27
Добрый день. Вот интересно стало - у кого какое отношение к использованию Null как литерала, т.е. в коде? На ИТС вроде не встречал каких-то ограничивающих моментов. Но сам считаю - что поняте Null - это исключительно для работы в запросе, причем обрабатывать Null поля нужно сразу при их возникновении.
Само наличие Null как литерала считаю неким атавизмом, редко применяемым и существующем "на всякий случай" - как метки например.
Неоднократно сталкивался с его (на мой взгляд) глупым (мягко говоря) применением - может я чего не понимаю?
1 Zhuravlik
 
08.05.16
16:35
Вот случаи, с которыми сталкивался:
1) Получается таблица значений из СКД (т.е. формируется в коллекцию), дальше следует такое условие:
Если тз.Количество() = 0 ИЛИ (тз[0].Ресурс1 = NULL И тз[0].Ресурс2 = NULL И ..... тз[0].Ресурс16 = NULL) Тогда Возврат КонецЕсли;

2) Чел делает план-фактный отчет. Как делаю такие вещи я: две ВТ (набор измерений и ресурсов - одинаковый) - одна план, другая - факт. Объединяем, сворачиваем, смотрим отклонения. Но он сделал через полное соединение, а потом через "ЕСТЬ NULL" определял где план, где факт, и от этого как-то плясал. Ладно бы только это. В выходных полях пишет:
Если <Какое-то условие> ТОГДА 0 ИНАЧЕ NULL КОНЕЦ
, а потом идут свертки таблиц.

Все это примеры нереально нечитабельного кода и запроса - на мой взгляд. Но  может я чего не понимаю? Вот опять столкнулся с применением Null в коде - пихают в структуру. Зачем это извращение, если есть неопределено?
2 Чайник Рассела
 
08.05.16
16:43
(0) NULL это не значение. Логичней конечно бы было запретить такие сравнения во встроенном языке, а вместо этого ввести использование функции Есть null, как в языке запросов. Использование подобных конструкций, как в типовых конфигурациях, так и в документации остается на совести разработчиков, которые как и мы действуют по принципу "все, что не запрещено, то разрешено".
3 Zhuravlik
 
08.05.16
17:07
(0) А реально есть в типовых такое?..
4 Zhuravlik
 
08.05.16
17:07
(3) -> (2)
5 ДенисЧ
 
08.05.16
17:08
Так, два кота уже есть.
Ждём ещё.
6 Чайник Рассела
 
08.05.16
17:10
(5) он забанен Ненавижу 1С
7 Чайник Рассела
 
08.05.16
17:14
(3) вот поиск по типовой бухне http://screencast.com/t/6ZswvjR3yxor
8 Zhuravlik
 
08.05.16
17:26
ппц, как-то даже и не думал поиском по типовой пройтись, казалось настолько своеобразный момент, что...

Хотя вот с таким использованием я бы согласился:

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    МАКСИМУМ(Замеры.ДатаЗаписи) КАК ДатаЗамера
    |ИЗ
    |    РегистрСведений.ЗамерыВремени КАК Замеры";
    Выборка = Запрос.Выполнить().Выбрать();
    Если Выборка.Следующий() И Выборка.ДатаЗамера <> Null Тогда
        ВерхняяГраньДатыЗамеров = Выборка.ДатаЗамера;
    Иначе
        Возврат;    
    КонецЕсли;
9 palsergeich
 
08.05.16
17:47
(8) странный код, то есть если в выборке есть хоть одна незаполненная дата то ничего не делаем...
Надо помнить одно существенное различие - в запросе сравнение с NULL всегда дает ложь, даже с литералом NULL, именно для этого ввели функцию Is Null.
А в коде сравнивай сколько влезет, но ИМХО Null не должен из запроса проваливаться в код, обычно на месте Null ставят пустое значение типа колонки или НЕОПРЕДЕЛЕНО, если тип составной.
10 Zhuravlik
 
08.05.16
18:03
(9) в (8) - в выборке в результате всегда будет только одна запись, даже если РС пустой. Это особенности агрегирующих функций - запись будет всегда. Потому-то я и согласен - тут либо в запросе вводить вложенный запрос, и сравнивать выходные поля, либо обрабатывать результат. В последнем случае меньше писанины и выше читабельность.
"Null не должен из запроса проваливаться в код, обычно на месте Null ставят пустое значение типа колонки или НЕОПРЕДЕЛЕНО, если тип составной." - как по мне, это вообще должно быть в ИТС-е вписано. Но нет там ничего подобного(
Просто если тыкать кого-то носом - то опираясь на некий регламент. А тут - субъектив какой-то получается. Особенно жалко людей которые пришли практически нулевыми, и УЧАТСЯ на вот таком вот коде - который в (2) приведен.
11 Zhuravlik
 
08.05.16
18:05
* Особенно жалко людей которые пришли практически нулевыми, и УЧАТСЯ на вот таком вот коде - который в (1) приведен.
12 Wern
 
08.05.16
20:25
Например, запрос с внутренним соединением, стоит задача в случае если левая часть соединяемых таблиц есть, правой нет, выводить сообщение об ошибке пользователю, меняем соединение на левое, делаем в коде условие на NULL с сообщением об ошибке.
Другая задача, тз с колонкой счет и колонками - субконто, субконто для конкретного счета может быть незаполнено, а может вообще отсутствовать, используем для незаполненых субконто неопределено, для отсутствующих NULL. Можно конечно использовать типизированные пустые значения и неопределено, но субконто могут быть составными + у типизированных пустых значений проблема с отборами, проблематично отобрать все пустые субконто, если у них разные типы.