Имя: Пароль:
LIFE
Юмор
OFF: Ну очень понятный код
,
0 OpKc
 
27.09.12
07:38
Сейчас разбирал чужую обработку и нашёл такое условие:

Если НЕ НеФиксироватьВРегистре = Истина Тогда

Так и не смог понять, зачем...

Поделитесь перлами, которые встречали. Хоть настроение поднимется немного.
30 dmpl
 
27.09.12
08:26
(0) А если НеФиксироватьВРегистре  имеет не булевый тип?
31 ilou
 
27.09.12
08:27
(0) Ты сам то хоть умеешь кодить?
32 ilou
 
27.09.12
08:28
может у человека НеФиксироватьВРегистре  принимает значения Булево и например перечисление или еще какой-нибудь тип был ранее ты откуда знаешь или у него на будущее задел был.
33 vovus
 
27.09.12
08:32
(22) че тут разбираться? раз уж
Если НЕ НеФиксироватьВРегистре = Истина Тогда
не пытается привести переменную к типу булево, значит работает как
Если НЕ (НеФиксироватьВРегистре = Истина) Тогда
34 xReason
 
27.09.12
08:35
(27) Зачетно отжОг
35 Feint
 
27.09.12
08:37
(27) :-D
36 rs_trade
 
27.09.12
08:40
просто клюшечник писал. вот и все.
37 kosts
 
27.09.12
08:43
Я бы в случаях когда переменная может быть неопределенной явно бы и проверял.
Если НеФиксироватьВРегистре = неопределено и НЕ НеФиксироватьВРегистре Тогда
38 rs_trade
 
27.09.12
08:44
развели тут дебаты о тайном смысле. может он и есть, но так не надо все равно делать. не надо элементарные вещи прятать в неоднозначные конструкции.
39 dmpl
 
27.09.12
08:45
Кстати, еще в некоторых языках не допускаются конструкции типа


Если Истина Тогда


т.е. без явного оператора сравнения. А потому явное сравнение с Истина однозначно повышает читабельность кода и формирует у программиста унифицированные приемы написания кода на разных языках программирования.

(37) :) Ты в курсе, что если НеФиксироватьВРегистре будет не равно Неопределено (т.е. имеет тип Булево, например), то вторую часть выражения 1С даже анализировать не будет? Потому как условие И однозначно даст Ложь?
40 DrShad
 
27.09.12
08:59
короче ТС хотел поглумиться, а вышло что самого зачмырили :)))
41 kosts
 
27.09.12
09:00
(39) > Ты в курсе, что если НеФиксироватьВРегистре будет не равно Неопределено (т.е. имеет тип Булево, например), то вторую часть выражения 1С даже анализировать не будет? Потому как условие И однозначно даст Ложь?

Естественно в курсе, я же не переписывал фрагмент на аналогичный, а пример привел...
42 DJ Anthon
 
27.09.12
09:02
какие нафик скобки? оператор НЕ имеет наивысший приоритет во всех языках, чего тут читать? вон в шахматной ветке - вот там трудночитабельный код, а это фигня, камрады...
43 dmpl
 
27.09.12
09:05
(41) Ну и зачем тогда вторая часть? В ней нет никакого смысла. Ведь если НеФиксироватьВРегистре = неопределено, то вторая часть выдаст ошибку, ибо тип не Булево. И чем этот пример лучше (даже если = исправить на <>), чем в (0)? Ты использовал 1 явное сравнение и 1 неявное, тогда как в (0) - всего лишь 1 явное.
44 kosts
 
27.09.12
09:18
(43) В случаях когда переменная может быть неопределенной делаю явное сравнение и не полагаюсь не неявное преобразование.
Далее в зависимости от ситуации, смотря в каком случае нужно попасть в тело условия.

Если Переменная <> Неопределено и Переменная = Истина Тогда
Если Переменная = Неопределено или Переменная = Ложь Тогда
Если Переменная = Неопределено или Переменная = Истина Тогда

Выбирай на вкус.
45 OpKc
 
27.09.12
09:32
(19) это реквизит обработки с типом Булево
46 ХочуСказать
 
27.09.12
09:34
НеФиксироватьВРегистре = Неопределено;
Если НЕ НеФиксироватьВРегистре = Истина Тогда



автора на кол, как быдлокодера
47 dmpl
 
27.09.12
09:36
(42) Ну, например, в разных языках приоритеты операций сравнения и логических операций разные. Например, в Паскале логические операции имеют более высокий приоритет, чем операции сравнения, а в 1С - менее высокий. Скобки же позволяют однозначно прочитать выражение не зная таких подробностей о языке.

(44) Тогда уж надо


Если ТипЗнч(Переменная) = Тип("Булево") И Переменная = Истина Тогда


чтобы совсем по фен-шую.
48 Shurjk
 
27.09.12
09:37
(0) Вот  за что я больше всего не люблю программистов, это за непомерное желане всегда охаять то что сделали другие.
Мало ли как он это делал, сначала написал потом в процессе отладки вносил исправления и т.д. к тому же ничего особо криминального в этом коде не вижу, вот что реально доставляет это когда пишут запрос не представляя как они работают, вот такую хню точно запаришься отлаживать и искать там ошибки.
49 Maxus43
 
27.09.12
09:40
все перлы там http://govnokod.ru/1c
только чото сайт щас не доступен у меня
50 be-may
 
27.09.12
09:40
(0) 99 % , что писал переученный семерочник, начинающий в восьмерке "шарашить"  :)
51 Fish
 
27.09.12
09:41
(49) Наверное прикрыли за розжиг и оскорбление чувств быдлокодеров :)))
52 DJ Anthon
 
27.09.12
09:43
(47) да, это И ИЛИ и сравнение, согласен. но уж никак не НЕ! еще же есть и Complete boolean eval и вычисление справа налево.
53 kosts
 
27.09.12
09:46
(47) Нет универсального средства, то так, то так, то эдак...
54 Shurjk
 
27.09.12
09:46
(47) Если ТипЗнч(Переменная) = Тип("Булево") И Переменная = Истина Тогда - не рабочая конструкция. Если переменная не булево выдаст ошибку.
55 OpKc
 
27.09.12
09:47
(50) да, видимо. я с семёркой знаком плохо, не сообразил сразу.
56 dmpl
 
27.09.12
09:48
(52) В 1С операция сравнения (=) имеет более высокий приоритет, чем НЕ. Собственно, поэтому код из (0) и работает.

(54) Не выдаст. То, что после И, вообще не будет вычисляться, ибо итак уже известно, что будет Ложь.
57 ХочуСказать
 
27.09.12
09:50
кстати за зачем народ в запросах пишет

ВЫБРАТЬ

  Т.ССЫЛКА

ИЗ Т
ГДЕ  Т.Проведен = ИСТИНА И Т.ПометкаУдаления = Ложь


Зачем?
почем не прогд

ГДЕ Т.Проведен И НЕ Т.ПометкаУдаления

?
58 vde69
 
27.09.12
09:53
(52) выполни


   // -------------------------------------------------------
   а = Неопределено;
   
   Если не а = Истина Тогда
       Сообщить ("Без скобок 1");
   Иначе
       Сообщить ("Без скобок 2");
   КонецЕсли;
   
   
   // -------------------------------------------------------
   а = Неопределено;
   
   Если не (а = Истина) Тогда
       Сообщить ("Скобки 1");
   Иначе
       Сообщить ("Скобки 2");
   КонецЕсли;
   
   
   // -------------------------------------------------------
   а = Неопределено;
   
   Попытка
       Если (не а) = Истина Тогда
           Сообщить ("Скобки НЕ 1");
       Иначе
           Сообщить ("Скобки НЕ 2");
       КонецЕсли;
   Исключение
       Сообщить("Ошибка");
   КонецПопытки;
   





результат

Без скобок 1
Скобки 1
Ошибка


--------------------------------------
в 1с оператор НЕ имеет более низкий приоритет чем операторы сравнения!!!
59 Shurjk
 
27.09.12
09:54
(56) Будет - ты попробуй.
60 dmpl
 
27.09.12
09:57
(59) Пробовал - работает. И с Неопределено, и с числом, и с Булево.
61 OpKc
 
27.09.12
09:58
(0) Повторю (45), НеФиксироватьВРегистре - реквизит обработки типа Булево. Сразу не написал, моя оплошность.
62 OpKc
 
27.09.12
09:58
+(61) но ветку почитать интересно :)
63 Fish
 
27.09.12
10:01
(54) Вполне рабочая конструкция.
64 Кирпич
 
27.09.12
10:01
(0) Надо было так человеку написать, вот и написал. Не считай себя самым умным. Ты не самый умный.
65 ssh2006
 
27.09.12
10:03
(54) даже без проверки на тип значения оно не будет выдавать ошибку
66 Shurjk
 
27.09.12
10:09
(63) А ну да будет работать - но проверка но не от того что провекра на булево стоит просто само переменная = истина и без него работает.
67 Оболтус
 
27.09.12
10:14
(5)Но это вполне может дать прирост производительности.
Если документы создаются редко, о остаток нужно читать часто.
Чтение из справочника быстрее, чем расчет остатка из регистра.
68 NcSteel
 
27.09.12
10:20
Сборище графоманов с явно выраженными Grammar nazi склонностями.
69 tertva_1C
 
27.09.12
10:21
#9899: Обфускация тирьямпампацией
20 сентября 2012, 08:15
рейтинг: 1171
Когда у программистов бывает хорошее настроение, они творят. И часто это настроение находит своё непосредственное выражение в самом родном и близком — в программном коде.

Вот что я обнаружил в листинге своего одногруппника:

procedure TFamPapam.BamBamClick(Sender: TObject);
var pam,pam_,tararam,tiryam_pam_pam:real;
tryam:integer;
begin
GetParam;tryam:=0;tararam:=0.0001;
repeat
inc(tryam);
pam:=papam*Param(pum,pum_)+pum;
pam_:=-1*(papam_*Param_(pum,pum_)-pum_);
tiryam_pam_pam:=sqrt(sqr(pam-pum)+sqr(pam_-pum_));
pum:=pam;pum_:=pam_;
until tiryam_pam_pam<tararam;
end;

И оно работает.
70 dmpl
 
27.09.12
10:22
(66) Ну дык это был пример. Для данной ветки будет, соответственно,


Если ТипЗнч(НеФиксироватьВРегистре ) = Тип("Булево") И НЕ НеФиксироватьВРегистре = Истина Тогда
71 AlexITGround
 
27.09.12
10:25
(69) Я так люблю мисту именно из-за этого, спасибо тебе, добрый человек, все утро пытаюсь проснуться  и сделать чего-либо))
72 Ненавижу 1С
 
гуру
27.09.12
10:26
почему такой запрос корректен

ВЫБРАТЬ
   1 КАК Поле1
ГДЕ
   (НЕОПРЕДЕЛЕНО ЕСТЬ NULL)=ЛОЖЬ

а такой нет


ВЫБРАТЬ
   1 КАК Поле1
ГДЕ
   (НЕОПРЕДЕЛЕНО=NULL)=ЛОЖЬ

сразу скажу для крикунов: сравнивать с NULL синтаксически можно, просто результат отрицательный всегда
73 dmpl
 
27.09.12
10:29
(72) NULL - он один такой! Поэтому сравнение на равенство всегда дает отрицательный результат :)
74 ssh2006
 
27.09.12
10:31
(72) > просто результат отрицательный всегда

Так прописано в СП
75 Ненавижу 1С
 
гуру
27.09.12
10:32
я спрашиваю почему синтаксис не корректен во втором случае
76 Deon
 
27.09.12
10:33
(75) А похоже Null тут и ни при чем
Так тоже матерится:
ВЫБРАТЬ
  1 КАК Поле1
ГДЕ
  (1=2)=ложь
77 zaic
 
27.09.12
10:34
КЗК Альфа здорово подходит для защиты работающих текстов от критики, имхо.
78 Ненавижу 1С
 
гуру
27.09.12
10:35
(76) вот, а почему? почему операнд ЕСТЬ NULL допустим, а операнд = нет
79 Оболтус
 
27.09.12
10:35
(72)-(76)Извращенцы чертовы.
80 ssh2006
 
27.09.12
10:35
(76)

ЫБРАТЬ
  1 КАК Поле1
ГДЕ
  (Истина = истина) = истина
81 Classic
 
27.09.12
10:36
(76)
Похоже в скуле логические операции имеют не булевский тип :)
82 Deon
 
27.09.12
10:37
(80) А ведь тоже нифига не работает )
83 Ненавижу 1С
 
гуру
27.09.12
10:37
(81) скуль тут не причем, это проблемы парсера запроса 1С
84 Classic
 
27.09.12
10:37
(80)
:)
ЫБРАТЬ - срабатывает :)
85 Classic
 
27.09.12
10:37
(82)
Там не ВЫБРАТЬ, там ЫБРАТЬ
86 dmpl
 
27.09.12
10:38
(75) А с чего ты взял, что в скобках операция сравнения, а не присваивания? ;)
87 Deon
 
27.09.12
10:38
(85) А никак не сработает )
88 Shurjk
 
27.09.12
10:38
(77) А как же поддержка и все такое, тогда тебе последователи еще большее спасибо скажут.
89 Rovan
 
гуру
27.09.12
10:38
(17) я тоже так пишу как в (0) иногда

"...Если НеФиксироватьВРегистре = Ложь Тогда..."
а если НеФиксироватьВРегистре вдруг окажется = Неопределено или NULL или 0...
90 Deon
 
27.09.12
10:39
(86) кстати, а в запросах бывает присваивание?
91 VladZ
 
27.09.12
10:40
Если запрос.Выполнить(ТекстЗапроса) = 0 Тогда
сообщить("Увы!");
КонецЕсли;

Код понятен. Но автору код с удовольствием бы дал по башке...
92 VladZ
 
27.09.12
10:40
*Автору кода
93 Deon
 
27.09.12
10:40
Писать надо так:
ПеременнаяТипаБулевоХранящаяИстину = Истина;
Если НЕ НеФиксироватьВРегистре = ПеременнаяТипаБулевоХранящаяИстину Тогда ...
94 dmpl
 
27.09.12
10:40
(90) Ну вот поэтому и говорит "Мужик, ты чо? В запросах присваивания не бывает!" :)
95 Ненавижу 1С
 
гуру
27.09.12
10:41
(90) бывает, но не в этих ))
96 Ненавижу 1С
 
гуру
27.09.12
10:41
(94) какое присваивание, там везде сравнение
97 Deon
 
27.09.12
10:41
(95) Не в этих, это не в 1С-овских?
98 DrShad
 
27.09.12
10:42
(0) это весь понятный тебе код что ты нашел?
99 Deon
 
27.09.12
10:44
Кстати, скорее всего НеФиксироватьВРегистре это реквизит обработки и он жестко типизирован как булево, так что можно смело давать добро ТС на разбитие головы автору обработки.
100 Ненавижу 1С
 
гуру
27.09.12
10:45
сотко
101 Ненавижу 1С
 
гуру
27.09.12
10:45
(97) ага
102 Deon
 
27.09.12
10:45
Кстати, а почему так не фурычит:
ВЫБРАТЬ
   1 КАК Поле1
ГДЕ
   НЕ (NULL = НЕОПРЕДЕЛЕНО)
103 dmpl
 
27.09.12
10:46
(96) Вот он тебе и говорит, что нефиг присваивать ;) 1С ведь думает, что ты присвоить хочешь. Ведь нужное сравнение ты можешь вполне реализовать по-другому.
104 Chin
 
27.09.12
10:47
(12) Если оно НЕОПРЕДЕЛЕНО, то оно вообще работать не будет... Так что автор как минимум был уверен что оно не неопределено... А в общем соглашусь с (4)... Иногда помогает...
105 Ненавижу 1С
 
гуру
27.09.12
10:47
(102) фурычит, не ври
106 Deon
 
27.09.12
10:48
(105) Ошибку не выдаёт, но и строк не возвращает
107 ssh2006
 
27.09.12
10:48
(106) попробуй )

ВЫБРАТЬ
   1 КАК Поле1
ГДЕ
   NULL = NULL
108 Ненавижу 1С
 
гуру
27.09.12
10:49
(106) все логично, отвали))
109 Deon
 
27.09.12
10:50
(107) Ну тут вроде как понятно, почему не выдает ничего. Сравнение с null возвращает ложь. Или всё-таки возвращает null?
110 Kashemir
 
27.09.12
10:50
(0) Абсолютно правильный читабельный код, позволяющий отделить ИСТИНА от всех других значений.


(106)
Конфигуратор 1С:Предприятие 8

Правила сравнения значений

Важно! Любая операция сравнения двух значений, в которой участвует хотя бы одно значение NULL, дает результат, аналогичный значению ЛОЖЬ.
111 Deon
 
27.09.12
10:51
(110) Ну дык получается же тогда ГДЕ НЕ ЛОЖЬ. Или не получается?
112 GANR
 
27.09.12
10:52
Если НЕ НеФиксироватьВРегистре = Истина Тогда
    <исполняемый код>
КонецЕсли;

равносильно

Если НеФиксироватьВРегистре <> Истина Тогда
    <исполняемый код>
КонецЕсли;

но никак не

Если Не НеФиксироватьВРегистре Тогда
    <исполняемый код>
КонецЕсли;

или

Если НеФиксироватьВРегистре = Ложь Тогда
    <исполняемый код>
КонецЕсли;

Последние 2 фрагмента кода работают НЕ так, как (0), поскольку НеФиксироватьВРегистре может быть равно не только "Истина" и "Ложь", но и ещё чему-то. Скажем, "Неопределено". Предпоследний код в таком случае выдаст синтаксическую ошибку.
113 ssh2006
 
27.09.12
10:53
(111) НЕ (NULL = НЕОПРЕДЕЛЕНО) --> NULL <> НЕОПРЕДЕЛЕНО ---> ложь
114 Deon
 
27.09.12
10:56
(113) Ужасть какая.
115 dmpl
 
27.09.12
10:59
(111) Аналогичный, но не ЛОЖЬ.
116 Deon
 
27.09.12
10:59
Мнения разделились )
117 dmpl
 
27.09.12
11:06
(116) А тут как с 4-м айФоном - сравнивать надо правильно ;)
118 dmpl
 
27.09.12
11:08
Анекдот в тему (72):
- доктор, когда я делаю вот так - мне вот тут больно.
- не делайте так.
119 stonewolf
 
27.09.12
11:08
Творчество одного из крупнейших производителей пива в России:

Для Сч = 0 По (ТаблицаТоваров.Количество() - 1) Цикл
НовСтр1 = ТаблицаТоваров.Получить(Сч);

Для Сч = 0 По (Докум.Товары.Количество() - 1) Цикл

Количество = СтрЗаменить(Формат(Количество, "ЧРГ ='$' "), "$", "");
Количество = СтрЗаменить(Количество, ",", ".");

Тысячи их...
Явно недопереученный клюшечник делал.
120 aka MIK
 
27.09.12
11:28
(0) Из типовой:

i=1;
Для Инд=1 по 1000 Цикл
   i=i+1;
КонецЦикла

Мамой клянусь! До сих пор этот код живет!
121 Kashemir
 
27.09.12
11:30
(120) Это зачем ? Типа убогая пауза без учета производительности компа ?
122 lucifer
 
27.09.12
11:31
это обфускация )
123 rsv
 
27.09.12
11:40
(0) "Если НЕ НеФиксироватьВРегистре = Истина "

     Если НЕ НеФиксироватьВРегистре = 1 . Так надежнее.
124 McNamara
 
27.09.12
11:48
(0) Автор хотел показаться умным, а выяснилось что его род занятий из профайла соответствует действительности.
125 jump if overflow
 
27.09.12
11:50
(120) вероятно переменная i нужна дальше по коду
126 Kashemir
 
27.09.12
11:58
(125) Со значением 1001 ? А нельзя было просто присвоить ?
127 ssh2006
 
27.09.12
11:59
(125) вероятно, i = 1001 не взлетело
128 Надсмотрщик
 
27.09.12
12:07
(0) Ты забыл указать про Снеговика.
А для клюшек - нормуль    ;-)
129 Мигрень
 
27.09.12
12:07
Строгая типизация спасет отцов русской демократии. Учитесь не пихать в одну переменную разные типы. Будьте мужиками блиать!
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn