#0
by crabzzy
Здравствуйте, столкнулся с кодом, вроде бы код хорошего программиста, но смутили секции в запросе вида ГДЕ ПометкаУдаления = ЛОЖЬ Не пойму, это для индексирования, или для понимания сотрудников, следующих программистов. Почему нельзя было сделать ГДЕ НЕ ПометкаУдаления? Для повышения читабельности так сделали? Спасибо!
#0
by crabzzy
Здравствуйте, столкнулся с кодом, вроде бы код хорошего программиста, но смутили секции в запросе вида ГДЕ ПометкаУдаления = ЛОЖЬ Не пойму, это для индексирования, или для понимания сотрудников, следующих программистов. Почему нельзя было сделать ГДЕ НЕ ПометкаУдаления? Для повышения читабельности так сделали? Спасибо!
#3
by SeraFim
не только короче, но и быстрее в первом случае - выполняется операция сравнения, и затем уже отбор Во втором - сразу отбор
#4
by Cube
Думаю, что прав. Не в делении на хороших и плохих, а в определении "правильности". Считаю, что если переменная уже типа "Булево", то сравнивать её с чем-либо не надо, т.к. это уже лишнее. Ну, вот смотри (пример): Ты стоишь около автомата по приему мелочи. Автомат принимает только монеты номиналом 1 копейка (самая маленькая монета). Ты держишь в руках какую-нибудь монету и надо определить, это копейка или нет. Вариант 1: Берем нашу монету, ложим её рядом с эталонной монетой (копейкой) и сравниваем. Если монеты одинаковые, то бросаем нашу монету в автомат. Вариант 2: берем нашу монету и пытаемся скормить её автомату. Если автомат её захавал - то это была копейка. Согласись, второй вариант проще. Ведь зачем нам сравнивать монету?
#6
by korableg
Здрастии Серафим, всё это не так булевская переменная имеет значнение ИСТИНА и при сравнении компилятор берет так и сравнивает ГДЕ ПометкаУдаления = Истина - 1 операция сравнения ГДЕ НЕ ПометкаУдаления = Истина - 2 операции сравнения ГДЕ ПометкаУдаления = ЛОЖЬ - 1 операция Учите матлогику.
#8
by golden-pack
запрос 1с транслируется в SQL. И сколько будет операций сравнения в SQL для ГДЕ НЕ ПометкаУдаления
#9
by Cube
А может всё-таки так: 1). ГДЕ ПометкаУдаления = Истина - 2 операции сравнения 2). ГДЕ НЕ ПометкаУдаления = Истина - 3 операции сравнения 3). ГДЕ ПометкаУдаления = ЛОЖЬ - 2 операции сравнения 4). ГДЕ ПометкаУдаления - 1 операция сравнения 5). ГДЕ НЕ ПометкаУдаления - 1 операция сравнения ???
#11
by korableg
ничего не так, а в скл по любому 1 операция потому что частичка НЕ возвращает ту же переменную только с обратным значением в нашем случае ЛОЖЬ, а передает ее 1с в язык скл уже в готовом виде. где пометкаудаления=истина - 1 операция так как где пометкаудаления и пометкаудаления=истина - одно и тоже
#13
by korableg
для компилятора да, так как перед истина стоит еще оператор где, он вынужден его сравнивать в любом случае
#14
by korableg
он ведь берет переменную и в зависимости от ее значения ответвляет алгоритм, поэтому если даже чисто логически подумать ему приходится сравнивать
#15
by Cube
А то что "Истина = Истина" это уже операция сама по себе, это ничего да? По этой логике "1 = 1" и "1 = 2 + 3 - 4" одно и тоже и телодвижений в обоих случаях 1...
#17
by korableg
конечно это операция, операция сравнения, тоесть ты хочешь сказать что если не писать = истина, то компилятор тупо не сравнивает? если не сравнивает как машина будет производить дальнейшие действия по условию?
#18
by Cube
В случае "ГДЕ ПометкаУдаления" компилятор сравнивает переменную со значением ИСТИНА - 1 операция. В случае "ГДЕ ПометкаУдаления = ИСТИНА" компилятор сравнивает результат операции (которую тоже нужно вычислять) со значением ИСТИНА - 2 операции. P.S. Что, так сложно писать номер поста, на который отвечаешь?
#19
by korableg
Прости Куб, я просто незнаю где ставить это чтоб помечалось. Так какой операции? Присваивания тут нет, такое же сравнение. Это просто для удобочитаемости сделано.
#20
by D_Pavel
Никакой разницы нет как писать, оба варианта хорошие. Первый вариант нравится семеркоманам, второй семеркофобам. Зачем из мухи слона раздувать? Ничего плохого нет в том что программист так написал, просто ему так нравится. Некоторые бывает пробелы не ставят вокруг арифметических знаков и скобок, их же за это никто не осуждает.
#21
by D_Pavel
Да, тут форум самопальный, видно даже по дизайну, и нет кнопки ответа на конкретное сообщение, надо руками писать скобки и число.
#24
by sda553
пометкаудаления может null быть в случае если запрос так построен. Я не помню что будет если ГДЕ NULL. Может программист таким образом хотел сказать, что "левоприсоединяемый элемент справочника для данной строки и существует и не помечен на удаление"
#26
by Starhan
:) что бы дальше при написании кода автодополнение работало как у справочника Склады. :)
#28
by H A D G E H O G s
Программиста из - расстрэлять! - назначить начальником святой инквизиции долбодятлов!
#30
by H A D G E H O G s
Не тупите. Программер из - молодец. Ибо кот вида Если УМашиПлющкиЕсть Тогда КонецЕсли; при небулевой переменной УМашиПлющкиЕсть в первом случае выпадет в осадок, а во втором случае - нормально не отработает.
#31
by ДенисЧ
А почему никто не сказал ещё, что ПометкаУдаления может быть ещё и NULL? Что тогда выдаст НЕ NULL?
#41
by Агент Инфостарта
Смотрю на тему и на свой запрос |ГДЕ | (НЕ ЗаданиеТорговомуПредставителю.ПометкаУдаления) Бежать исправлять?
#49
by H A D G E H O G s
orly? А че делает тип bit? Если забыть, что 1С на него положила и юзает binary (наверное хранит чето кроме 2-х значений)
#51
by Sammo
Емнип, "Не" может покорежить план скулевского запроса. А если еще делать join по условие "Не в" может получиться вообще некрасивость
#53
by Агент Инфостарта
Где взял не помню, но пользуюсь часто. #Если НЕ (Клиент Или Сервер Или ВнешнееСоединение) Тогда
#54
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
можно выделить область и закоментировать пачкой строк. имхо все таки для того что бы дальше когда пишешь код автодополение и контекстные подсказки работали с правильным типом переменной. По крайне мере я сама так делаю :). Пишу в начале метода. А после напиания удаляю такую строку.
#72
by Cube
Нужно проводить по 10 замеров для каждой ситуации, причем, первый замер в каждой ситуации не учитывать.
#83
by Axel2009
я думаю за счет того, что при сравнении ПеременнаяБулево = ЛОЖЬ может быть Неопределено и ниче не вывалится, 1с делает доп преобразование переменной
#84
by Reset
Может, изза того, что в первом случае 2 "выражения" и одна лог операция, а во втором - 1 "выражение" и одна операция
#91
by Chin
А вдруг пометка удаления NULL, а логика запроса требует наличия именно "ЛОЖЬ"? Всякое бывает. Понимаю, что запрос нужно строить, чтобы избегать таких ситуаций, но тем не менее все возможно...
#94
by Chin
Это понятно, но подобное условие может быть поставленно машинально, когда программист видит, что возможен NULL... Если у вас запрос на мильёны строк, и пара секунд критично, то да - жесть наверное. А так это все необоснованные придирки...
#95
by Reset
Если возможен null, интерпретацию стоит явно предусматривать с помощь известной функции, а не полагаться на сравнение
#96
by Cube
ПеременнаяБулево = ЛОЖЬ : 11,815 сек. НЕ ПеременнаяБулево : 11,185 сек. НЕ ПеременнаяБулево : 11,185 сек. НЕ ПеременнаяБулево : 11,2 сек. НЕ ПеременнаяБулево : 11,201 сек. НЕ ПеременнаяБулево : 11,201 сек. Код:
#98
by Фокусник
10 проверок, запуск на более быстром компе (сервер 16 ядер, но там народ есть): в результате: Был включен замер производительности: т.е. в результате этого замера код "ПеременнаяБулево = ЛОЖЬ" медленнее на 10% чем код "НЕ ПеременнаяБулево" :) Поэтому, с учетом частоты вызываемого кода, разница не принципиальная, лучше в других (более проблемных) местах оптимизацией заниматься, чем в сравнении булева с булевом :)
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям
Похожие вопросы 1С
В этой группе 1С
- 1с БГУ, почему при выборе 242 кэка блокируется субконто ?
- есть файл протокола хмл, нужно проверить на корректность файл выгрузки
- УФ. ДанныеФормыДерево как добавлять строки на первый уровень дерева
- zlib распаковка СТРОК
- Как активировать определённую ячейку в табличной части документа 1с 8.2?
- Ошибка СУБД
- ПРИМ 07К - как подключить?
- УПП 1.3.31.1(ЗиУП 2.5.57) Анализ начисленных налогов и взносов рассыпается
- Убрать список выбора у элемента формы, программно
- Подписка на событие ОбработкаПолученияФормы
- Нет соединения на FTP. HELP!!! Что открыть на сервере?
- v7: Итоговая сумма в форме М-11
- Как из 1С отправлять письма через "The Bat!"?
- УПП РАУЗ Расчет себестоимости
- Отваливаются локальные ресурсы
- ЗУП: Отражение в бухучете компенсации за задержку ЗП
- Отбор динамического списка в веб-клиенте
- как добавить поле в универсальный отчет
- Файлообменник на 5 гигов
- Налоговые разницы при УСН