Имя: Пароль:
1C
1С v8
Как понимать "Если Не"
, ,
0 Artemy55
 
24.04.15
15:27
Как понять конструкцию Если Не? Точнее как она работает? Если 1 то 2, но Если Не 1 то пропускаетМолча?или всёравно 2... где-то я недопонимаю.
В примере вроде и так ищет пустой реквизит, зачем НЕ ?

    // Пример: Проверить, что во всех документах ПриходнаяНакладная заполнен реквизит Склад.
    ПустаяСсылкаСклада = Справочники.Склады.ПустаяСсылка();
    Если Не Документы.ПриходнаяНакладная.НайтиПоРеквизиту(
    "Склад", ПустаяСсылкаСклада).Пустая() Тогда
    Сообщить("Есть документы, у которых не заполнен реквизит Склад");
    КонецЕсли;
1 boozin
 
24.04.15
15:28
Документы.ПриходнаяНакладная.НайтиПоРеквизиту(
    "Склад", ПустаяСсылкаСклада).Пустая() = ЛОЖЬ
2 Господин ПЖ
 
24.04.15
15:29
так пишут наркоманы
3 Stim
 
24.04.15
15:30
работает - не трожь!
4 del123
 
24.04.15
15:32
Посмотри что возвращает функция НайтиПоРеквизиту
5 Stim
 
24.04.15
15:34
(2) а ты можешь написать короче код по поиску документов с пустым складом?
6 Cyberhawk
 
24.04.15
15:37
А вдруг там Неопределено или Null?
7 Artemy55
 
24.04.15
15:38
Мне кажется там ошибка автора примера, "Не" там лишнее попросту или не к месту
8 boozin
 
24.04.15
15:39
Цитата из  СП:
Синтаксис:

Пустая()
Возвращаемое значение:

Тип: Булево.
Истина - ссылка не указывает ни на какой объект (пустая ссылка); Ложь - в противном случае.

Что непонятного......
9 del123
 
24.04.15
15:40
(7) все к месту
10 grate
 
24.04.15
15:40
(0) Если будет найден хотя бы один документ с пустым складом - метод НайтиПоРеквизиту вернёт ссылку на него, в свою очередь Пустая() вернет ЛОЖЬ. Поэтому и нужно НЕ.
11 del123
 
24.04.15
15:41
(10) Ну прям все разжевал, так же не интересно :)
12 D_E_S_131
 
24.04.15
15:44
(2) Чего это сразу "наркоман"?
13 Ненавижу 1С
 
гуру
24.04.15
15:45
(6) а?
14 vde69
 
24.04.15
15:45
у меня в программе склад составного типа Справочник/Пользователь/Контрагент если тип у реквизита неопределен - он твоим методом НЕ НАЙДЕТСЯ!!!!

более правильно искать запросом с условием
где таблица.склад.ссылка есть null
15 Stim
 
24.04.15
15:46
чтобы было понятнее:

ПустаяСсылкаСклада = Справочники.Склады.ПустаяСсылка();
ДокументСПустымСкладом = Документы.ПриходнаяНакладная.НайтиПоРеквизиту(
    "Склад", ПустаяСсылкаСклада);
    Если Не ДокументСПустымСкладом.Пустая() Тогда
    Сообщить("Есть документы, у которых не заполнен реквизит Склад");
    КонецЕсли;
16 fisher
 
24.04.15
15:47
(6) Потёр лампу? :)
17 Господин ПЖ
 
24.04.15
15:54
(12) твоих рук дело?
18 fisher
 
24.04.15
15:58
(17) Да ладно. В (0) - нормальный код. Проще комментарий воткнуть, чем плодить лишние строчки для повышения читабельности.
19 Сильф
 
24.04.15
15:58
(4) истину глаголит. А потом смотреть, что возвращает метод .Пустая(). Но да - код наркоманский.
20 Сильф
 
24.04.15
16:00
(18) документы с реквизитами составного типа сосут чупа-чупс вместе с разработчиком.
21 Анцеранана
 
24.04.15
16:02
(15) а так отработает?

ДокументСПустымСкладом = Документы.ПриходнаяНакладная.НайтиПоРеквизиту(
    "Склад", Справочники.Склады.ПустаяСсылка());
    Если ЗначениеЗаполнено(ДокументСПустымСкладом) Тогда
    Сообщить("Есть документы, у которых не заполнен реквизит Склад");
    КонецЕсли;
22 Kvant1C
 
24.04.15
16:02
(19) >>Но да - код наркоманский.
А можете показать как можно красиво написать такой код?
23 fisher
 
24.04.15
16:03
(20) Это ты к чему? Типа надо при кодинге закладываться на то, чтобы меньше рефакторить если вдруг в будущем тип реквизита сделают составным?
24 vde69
 
24.04.15
16:04
(20) во всех типовых есть куча документов с составными реквизитами...

у меня склад составной - очень удобно, видно что на складе, что у менеджеров, а что в тесте у клиентов. Реально удобно!
25 Бубка Гоп
 
24.04.15
16:05
(21) ито красивее выглядит
26 StanleyMarsh
 
24.04.15
16:10
(0) раз на то пошло для минимизации памяти под используемые переменные следовало бы написать:

Если Не Документы.ПриходнаяНакладная.НайтиПоРеквизиту(
    "Склад", Справочники.Склады.ПустаяСсылка()).Пустая() Тогда
    Сообщить("Есть документы, у которых не заполнен реквизит Склад");
    КонецЕсли;
27 StanleyMarsh
 
24.04.15
16:12
(7) не лишнее. Выражение перед НЕ возвращает Ложь, если документы с незаполненным складом есть. Без НЕ - не провалится в Если.
28 fisher
 
24.04.15
16:13
(21) Это, кстати да - очень хороший вариант.
29 Stim
 
24.04.15
16:15
а если нет реквизита Склад?
30 Сильф
 
24.04.15
16:16
(24) я не к тому, что такие реквизиты не нужны, а к тому, что написано в (23)

(23) да, и ещё по куче разных причин

(22) правильнее - запросом, но, может, с вашей точки зрения это не будет "красиво".
31 Дмитрий
 
24.04.15
16:17
Я всегда пишу
Если Не А=Б, потому-что мне влом переключаться, чтобы написать  
Если А<>Б
32 Бубка Гоп
 
24.04.15
16:18
(31) а зря, меньше НЕ - читабельнее код
33 fisher
 
24.04.15
16:20
(30) Ой, да ладно! Хоть сам всегда ЗначениеЗаполнено() юзаю (кроме примитивных типов), но "кучу разных причин" было бы интересно услышать.
34 Дмитрий
 
24.04.15
16:21
(32) я не даю его никому читать )), а лично мне без разницы
35 bolobol
 
24.04.15
16:24
(29) А если нет документа ПриходнаяНакладная...
36 Stim
 
24.04.15
16:27
(35) если нет документа - то не пройдет синтаксический контроль. а без реквизита склад - пройдет
37 bolobol
 
24.04.15
16:29
(36) Особенно КД чувствителен к синтаксическому контролю и строки для Выполнить, Вычислить.
38 Сильф
 
24.04.15
16:37
(33) ну основная - это то, что конфу пилил/пилишь/будешь пилить не ты один, и что там кто под названием "Склад" подразумевает - хз.
Или такой вопрос - а если это внешняя обработка? и заранее неизвестно, на какой конфе она будет запускаться?
39 fisher
 
24.04.15
16:42
(38) Слабенькие аргументы. Но я соглашусь, что это плохой стиль. Зачем использовать более узкоприменимый прием, если без всяких затрат можно использовать более универсальный? Такой код я в основном в старых конфах встречаю, когда ЗначениеЗаполнено() в платформу еще не воткнули. Пример, судя по всему, тоже еще с тех времен.
40 fisher
 
24.04.15
16:45
В старых типовых, помню, была аналогичная функция в общих модулях. Но и на пустую ссылку тоже встречалось нередко.
41 D_E_S_131
 
24.04.15
16:53
(17) Конкретно этот — нет. Но в чем симптомы наркомании хотелось бы знать. Вполне себе читабельный код. Бывает, что и не такое в одну строку напишут. А конструкция "Не... Пустая()" лучше понимается, чем ""...Пустая() = ЛОЖЬ" (ИМХО конечно).
Меня вот так больше коробит

Если НЕ ДокСсылка = Неопределено Тогда

чем

Если ДокСсылка <> Неопределено Тогда
42 la luna llena
 
24.04.15
16:54
Где-то читала, что нужно использовать НЕ вместо <> типа так быстрее(32)
43 D_E_S_131
 
24.04.15
17:23
Код №1 — 17.39 сек

Для н = 1 По 10000000 Цикл
    
        Если НЕ н = Неопределено Тогда
        
            
        
        КонецЕсли;
    
    КонецЦикла;

Код №2 — 16,81 сек

Для н = 1 По 10000000 Цикл
    
        Если н <> Неопределено Тогда
        
            
        
        КонецЕсли;
    
    КонецЦикла;