ГДЕ ПометкаУдаления = ЛОЖЬ #635804


#0 by crabzzy
Здравствуйте, столкнулся с кодом, вроде бы код хорошего программиста, но смутили секции в запросе вида ГДЕ ПометкаУдаления = ЛОЖЬ Не пойму, это для индексирования, или для понимания сотрудников, следующих программистов. Почему нельзя было сделать ГДЕ НЕ ПометкаУдаления? Для повышения читабельности так сделали? Спасибо!
#0 by crabzzy
Здравствуйте, столкнулся с кодом, вроде бы код хорошего программиста, но смутили секции в запросе вида ГДЕ ПометкаУдаления = ЛОЖЬ Не пойму, это для индексирования, или для понимания сотрудников, следующих программистов. Почему нельзя было сделать ГДЕ НЕ ПометкаУдаления? Для повышения читабельности так сделали? Спасибо!
#1 by golden-pack
Все просто:
#2 by snegovik
Каков критерий? Ведь первый вариант нагляднее. Только из-за того, что второй короче?
#3 by SeraFim
не только короче, но и быстрее в первом случае - выполняется операция сравнения, и затем уже отбор Во втором - сразу отбор
#4 by Cube
Думаю, что прав. Не в делении на хороших и плохих, а в определении "правильности". Считаю, что если переменная уже типа "Булево", то сравнивать её с чем-либо не надо, т.к. это уже лишнее. Ну, вот смотри (пример): Ты стоишь около автомата по приему мелочи. Автомат принимает только монеты номиналом 1 копейка (самая маленькая монета). Ты держишь в руках какую-нибудь монету и надо определить, это копейка или нет. Вариант 1: Берем нашу монету, ложим её рядом с эталонной монетой (копейкой) и сравниваем. Если монеты одинаковые, то бросаем нашу монету в автомат. Вариант 2: берем нашу монету и пытаемся скормить её автомату. Если автомат её захавал - то это была копейка. Согласись, второй вариант проще. Ведь зачем нам сравнивать монету?
#5 by golden-pack
???
#6 by korableg
Здрастии Серафим, всё это не так булевская переменная имеет значнение ИСТИНА и при сравнении компилятор берет так и сравнивает ГДЕ ПометкаУдаления = Истина - 1 операция сравнения ГДЕ НЕ ПометкаУдаления = Истина - 2 операции сравнения ГДЕ ПометкаУдаления = ЛОЖЬ - 1 операция Учите матлогику.
#7 by korableg
НЕ ПометкаУдаления читабельнее и смотрится красивей
#8 by golden-pack
запрос 1с транслируется в SQL. И сколько будет операций сравнения в SQL для ГДЕ НЕ ПометкаУдаления
#9 by Cube
А может всё-таки так: 1). ГДЕ ПометкаУдаления = Истина - 2 операции сравнения 2). ГДЕ НЕ ПометкаУдаления = Истина - 3 операции сравнения 3). ГДЕ ПометкаУдаления = ЛОЖЬ - 2 операции сравнения 4). ГДЕ ПометкаУдаления - 1 операция сравнения 5). ГДЕ НЕ ПометкаУдаления - 1 операция сравнения ???
#10 by Cube
+ Ошибся, во 2-ом пункте тоже две операции сравнения...
#11 by korableg
ничего не так, а в скл по любому 1 операция потому что частичка НЕ возвращает ту же переменную только с обратным значением в нашем случае ЛОЖЬ, а передает ее 1с в язык скл уже в готовом виде. где пометкаудаления=истина - 1 операция так как где пометкаудаления и пометкаудаления=истина  - одно и тоже
#12 by Cube
Значит, ты утверждаешь, что "Истина" и "Истина = Истина" - это одно и то же?
#13 by korableg
для компилятора да, так как перед истина стоит еще оператор где, он вынужден его сравнивать в любом случае
#14 by korableg
он ведь берет переменную и в зависимости от ее значения ответвляет алгоритм, поэтому если даже чисто логически подумать ему приходится сравнивать
#15 by Cube
А то что "Истина = Истина" это уже операция сама по себе, это ничего да? По этой логике "1 = 1" и "1 = 2 + 3 - 4" одно и тоже и телодвижений в обоих случаях 1...
#16 by golden-pack
Запрос sql показывайте уже
#17 by korableg
конечно это операция, операция сравнения, тоесть ты хочешь сказать что если не писать = истина, то компилятор тупо не сравнивает? если не сравнивает как машина будет производить дальнейшие действия по условию?
#18 by Cube
В случае "ГДЕ ПометкаУдаления" компилятор сравнивает переменную со значением ИСТИНА - 1 операция. В случае "ГДЕ ПометкаУдаления = ИСТИНА" компилятор сравнивает результат операции (которую тоже нужно вычислять) со значением ИСТИНА - 2 операции. P.S. Что, так сложно писать номер поста, на который отвечаешь?
#19 by korableg
Прости Куб, я просто незнаю где ставить это чтоб помечалось. Так какой операции? Присваивания тут нет, такое же сравнение. Это просто для удобочитаемости сделано.
#20 by D_Pavel
Никакой разницы нет как писать, оба варианта хорошие. Первый вариант нравится семеркоманам, второй семеркофобам. Зачем из мухи слона раздувать? Ничего плохого нет в том что программист так написал, просто ему так нравится. Некоторые бывает пробелы не ставят вокруг арифметических знаков и скобок, их же за это никто не осуждает.
#21 by D_Pavel
Да, тут форум самопальный, видно даже по дизайну, и нет кнопки ответа на конкретное сообщение, надо руками писать скобки и число.
#22 by Рэйв
Однохренственно. Ты еще такты проца посчитай.
#23 by Ranger_83
Норм.код-читабельный
#24 by sda553
пометкаудаления может null быть в случае если запрос так построен. Я не помню что будет если ГДЕ NULL. Может программист таким образом хотел сказать, что "левоприсоединяемый элемент справочника для данной строки и существует и не помечен на удаление"
#25 by sda553
А вообще я встречал следующие штуки Вопрос на сообразительность, что это и зачем?
#26 by Starhan
:) что бы дальше при написании кода автодополнение работало как у справочника Склады. :)
#27 by H A D G E H O G s
Бугага. Хорошая, годная ветка
#28 by H A D G E H O G s
Программиста из - расстрэлять! - назначить начальником святой инквизиции долбодятлов!
#29 by DJ Anthon
чтобы создать переменную?
#30 by H A D G E H O G s
Не тупите. Программер из - молодец. Ибо кот вида Если УМашиПлющкиЕсть Тогда КонецЕсли; при небулевой переменной УМашиПлющкиЕсть в первом случае выпадет в осадок, а во втором случае - нормально не отработает.
#31 by ДенисЧ
А почему никто не сказал ещё, что ПометкаУдаления может быть ещё и NULL? Что тогда выдаст НЕ NULL?
#32 by H A D G E H O G s
Тот же стандарт он автоматом скорее всего применил в запросе.
#33 by ДенисЧ
тшорт.. Опоздал :-)
#34 by H A D G E H O G s
Я сказал - ты не успел!
#35 by H A D G E H O G s
Ну всетаки я в Москве - байты быстрее ползут до Германии.
#36 by Starhan
смотри :) и в и ты сам себе противоречишь :)
#37 by 1Сергей
а почему бы не посмотреть на саму монету и определить номинал визуально? :)
#38 by Нууф-Нууф
НЕ в условиях запроса использовать не рекомендуется
#39 by 1Сергей
сам придумал?
#40 by Нууф-Нууф
узнал когда готовился к эксперту
#41 by Агент Инфостарта
Смотрю на тему и на свой запрос    |ГДЕ    |    (НЕ ЗаданиеТорговомуПредставителю.ПометкаУдаления) Бежать исправлять?
#42 by rbcvg
"ложим" - что делаем?
#43 by Нууф-Нууф
имхо сразу заявление на увольнение
#44 by Starhan
более того валить вину на других. А так же сменить ник на мисте.
#45 by Нууф-Нууф
+ и пол
#46 by 1Сергей
ОБС?
#47 by mikecool
и никто не вспомнил, что типа булево в мс скл нету...
#48 by zlnk
>>"ложим" - что делаем? кладём!
#49 by H A D G E H O G s
orly? А че делает тип bit? Если забыть, что 1С на него положила и юзает binary (наверное хранит чето кроме 2-х значений)
#50 by Нууф-Нууф
да. есть еще третье значение булево - ХЗ
#51 by Sammo
Емнип, "Не" может покорежить план скулевского запроса. А если еще делать join по условие "Не в" может получиться вообще некрасивость
#52 by kosts
Лучше так
#53 by Агент Инфостарта
Где взял не помню, но пользуюсь часто. #Если НЕ (Клиент Или Сервер Или ВнешнееСоединение) Тогда
#54 by НЕА123
из-за особенности построения мозгов, как результат юзания разговорного языка. отрицание может быть как отрицанием, так и усилением отрицания. т.е. ответ "нет" на вопрос "Ты не работаешь?" в русском, как правило, означает "нет, не работаю". в английском же "нет, работаю". вроде так...
#55 by 1Страх
а все потому что придумали хранить в базе Неопределено, придурки!
#56 by mikecool
вызываешь дух Ненавижу1С?
#57 by НЕА123
в личной карточке это он и есть.
#58 by mikecool
ыыы, я лошпек )))
#59 by Нууф-Нууф
ыыы, да ты лошпек )))
#60 by mikecool
ты не отвлекайся ,пости больше голых девок )
#61 by Axel2009
пятницы не дождались..
#62 by НЕА123
де факто в Татарстане пятница. завтра праздник.
#63 by Axel2009
select top 1000 * from dbo._AccRg24762 where not _Active = 1 Argument: OBJECT:([onyx_upp_sam].[dbo].[_AccRg24762].[_AccRg24762_ByPeriod_TRN]), WHERE:(CONVERT_IMPLICIT(int,[onyx_upp_sam].[dbo].[_AccRg24762].[_Active],0)<>) EstimateIO: 192,5735 EstimateCPU: 8,972452 TotalSubtreeCost: 0,02843862 !!! select top 1000 * from dbo._AccRg24762 where _Active = 0 Argument: OBJECT:([onyx_upp_sam].[dbo].[_AccRg24762].[_AccRg24762_ByPeriod_TRN]), WHERE:(CONVERT_IMPLICIT(int,[onyx_upp_sam].[dbo].[_AccRg24762].[_Active],0)=) EstimateIO: 192,5735 EstimateCPU: 8,972452 TotalSubtreeCost: 0,05277556 !!!
#64 by Axel2009
+ ошибся =) для обоих запросов TotalSubtreeCost: 5,181245 надо было сравнивать с 0x01 и 0x00 =) так что считайте дальше количество операций сравнения.
#65 by Песец
В одинэсике нет аналога /* много строк */ поэтому чтобы иметь возможность быстро включать/отключать кусок кода приходится писать
#66 by Starhan
можно выделить область и закоментировать пачкой строк. имхо все таки для того что бы дальше когда пишешь код автодополение и контекстные подсказки работали с правильным типом переменной. По крайне мере я сама так делаю :). Пишу в начале метода. А после напиания удаляю такую строку.
#67 by Starhan
сам* написания*
#68 by Фокусник
Замер показывает, что код 1 быстрее :) Выдает:
#69 by Фокусник
Чтобы к "Склад" через "." в конфигураторе обращаться ;) (регулярно это использую)
#70 by Reset
ПеременнаяБулево = ЛОЖЬ: 11 сек. НЕ ПеременнаяБулево: 10 сек.
#71 by Reset
Из любопытства.
#72 by Cube
Нужно проводить по 10 замеров для каждой ситуации, причем, первый замер в каждой ситуации не учитывать.
#73 by Axel2009
у меня выполнилось по 10 секунд этот код... ты на 3 пне сидишь чтоли?
#74 by Фокусник
Интересно, раз в 10 увеличь счетчик
#75 by Фокусник
Не, трехлетний ноутбук :) Ща на сервере попробую
#76 by Reset
имхо оно должно сравнимые результаты давать
#77 by Axel2009
ПеременнаяБулево = ЛОЖЬ: 101 сек. НЕ ПеременнаяБулево: 92 сек.
#78 by Фокусник
Вот сейчас 10 раз и проверим - на разных компах/платформах, при разных условиях :)
#79 by Reset
ПеременнаяБулево = ЛОЖЬ: 110 сек. НЕ ПеременнаяБулево: 102 сек.
#80 by Reset
чорт у меня утюг :(
#81 by Axel2009
ПеременнаяБулево = ЛОЖЬ: 101 сек. НЕ ПеременнаяБулево: 93 сек.
#82 by Starhan
поменяйте местами и еще раз замертье )
#83 by Axel2009
я думаю за счет того, что при сравнении ПеременнаяБулево = ЛОЖЬ может быть Неопределено и ниче не вывалится, 1с делает доп преобразование переменной
#84 by Reset
Может, изза того, что в первом случае 2 "выражения" и одна лог операция, а во втором - 1 "выражение" и одна операция
#85 by Reset
написал циклы в 2 строку ПеременнаяБулево = ЛОЖЬ: 52 сек. НЕ ПеременнаяБулево: 47 сек.
#86 by ДенисЧ
ПеременнаяБулево = ЛОЖЬ: 57 сек. НЕ ПеременнаяБулево: 60 сек. Так что...
#87 by Reset
**в 1 строку :)
#88 by Reset
2:2 :D
#89 by Axel2009
поменял НЕ ПеременнаяБулево: 96 сек. ПеременнаяБулево = ЛОЖЬ: 99 сек.
#90 by Starhan
НЕ ПеременнаяБулево: 41 сек. ПеременнаяБулево = ЛОЖЬ: 42 сек.
#91 by Chin
А вдруг пометка удаления NULL, а логика запроса требует наличия именно "ЛОЖЬ"? Всякое бывает. Понимаю, что запрос нужно строить, чтобы избегать таких ситуаций, но тем не менее все возможно...
#92 by Axel2009
если пометка удаления NULL, то монопенисуально какое условие, оно вернет ЛОЖЬ и все
#93 by Starhan
ыы ПеременнаяБулево <> ИСТИНА: 42 сек. ПеременнаяБулево = ЛОЖЬ: 41 сек.
#94 by Chin
Это понятно, но подобное условие может быть поставленно машинально, когда программист видит, что возможен NULL... Если у вас запрос на мильёны строк, и пара секунд критично, то да - жесть наверное. А так это все необоснованные придирки...
#95 by Reset
Если возможен null, интерпретацию стоит явно предусматривать с помощь известной функции, а не полагаться на сравнение
#96 by Cube
ПеременнаяБулево = ЛОЖЬ : 11,815 сек. НЕ ПеременнаяБулево : 11,185 сек. НЕ ПеременнаяБулево : 11,185 сек. НЕ ПеременнаяБулево : 11,2 сек. НЕ ПеременнаяБулево : 11,201 сек. НЕ ПеременнаяБулево : 11,201 сек. Код:
#97 by 1Страх
я не понял, в запрос, а народ язык 1с исследует
#98 by Фокусник
10 проверок, запуск на более быстром компе (сервер 16 ядер, но там народ есть): в результате: Был включен замер производительности: т.е. в результате этого замера код "ПеременнаяБулево = ЛОЖЬ" медленнее на 10% чем код "НЕ ПеременнаяБулево" :) Поэтому, с учетом частоты вызываемого кода, разница не принципиальная, лучше в других (более проблемных) местах оптимизацией заниматься, чем в сравнении булева с булевом :)
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С