Имя: Пароль:
1C
 
"Не" равно или "<>"?
0 Mary01
 
05.06.15
12:56
Подскажите, какой оператор предпочтительнее использовать для сравнения?
1) Не Переменная1 = Переменная2
ИЛИ
2) Переменная1 <> Переменная2
Когда-то слышала, что предпочтительнее (1), но почему - не помню, и сейчас не могу информацию найти на эту тему.
1 Волшебник
 
модератор
05.06.15
12:57
Без разницы.
2 kosts
 
05.06.15
12:57
(0) Предпочитаю "<>", по мне так легче воспринимается.
3 Cube
 
05.06.15
12:58
Без фотки разницы нет)
4 GROOVY
 
05.06.15
12:58
Тут нужно просто включить мозг.
НЕ А=А будет работать как оператор сравнения, который даст нам булево и мы будем его "Переворачивать" оператором Если.

А <> А даст нам тоже булево, но его будет просто проверять оператор Если.

А реально пофиг.
5 DirecTwiX
 
05.06.15
12:59
Есть подозрение, что на <> требуется одна операция, а на НЕ равно - две.
6 GROOVY
 
05.06.15
12:59
Самое правильное это

НЕ А<>А=Ложь
7 Fragster
 
гуру
05.06.15
12:59
(0) потому что тем, у кого не стоит спец. раскладки, приходится переключать язык. два раза.

от себя рекомендую http://1c.chistov.pro/2012/11/1.html от @{Groovy}
8 GROOVY
 
05.06.15
13:00
(7) Благодарю!
9 itlikbez
 
05.06.15
13:01
(0) В первом случае не надо переключать клавиатуру.
10 GROOVY
 
05.06.15
13:01
(7) Я, кстати, под мак сделал раскладку, жду выхода нативного клиента :)
11 kosts
 
05.06.15
13:02
(7) Открой для себя автозамену
бю      <>
б=      <=
ю=      >=
н       Неопределено
л       Ложь

и пр.
12 Mary01
 
05.06.15
13:03
(4) я тоже так думала, по логике так и есть, но вспомнила, что говорили, что лучше (1), вот и пытаюсь выяснить почему.
но вы меня убедили в обратном.
мне нет проблем переключить раскладку,  а вот код должен работать как можно быстрее. так что буду писать <>
13 GROOVY
 
05.06.15
13:03
14 Fragster
 
гуру
05.06.15
13:03
(10) добавь в раскладке альтэнтер
15 Fragster
 
гуру
05.06.15
13:04
для перевода строки + |
16 Волшебник
 
модератор
05.06.15
13:04
(12) Это не ускорит код
17 GROOVY
 
05.06.15
13:05
(12) Скорость современных процессоров сводит на нет вашу оптимизацию. Сейчас, на выяснение того как быстрее,  вы потратили времени больше, чем выиграйте за всю вашу жизнь используя <> вместо НЕ.
18 Fragster
 
гуру
05.06.15
13:05
(11) это те, которые по контрол-ку работают?
19 kosts
 
05.06.15
13:06
(12) Для прикладных программ главное свойство, это сопровождаемость, а скорость исполнения важна в отдельных узких местах.
20 Mary01
 
05.06.15
13:06
почему? тут одна операция, а там две. это конечно доли секунд, а если у меня несколько тысяч строк, да еще по 10 и более реквизитов в каждой, и все это надо проверить?
21 GROOVY
 
05.06.15
13:06
(14) Пришли почтой, боюсь забыть. мыло -> павел тварь chistov.pro
22 Mary01
 
05.06.15
13:06
(20) и к тому же это все надо не один раз в день проверять
23 D_E_S_131
 
05.06.15
13:08
(22) Поверьте, в конфигах есть +100500 мест, где действительно стоит задуматься над производительностью. А ваш вопрос совсем не тот случай.
24 kosts
 
05.06.15
13:09
(22) Лучше посмотри, как бы уменьшить нажатия клавиш и мишки у пользователей.
25 GROOVY
 
05.06.15
13:10
(20) Это не доли, это 10^-42 000 000 00 секунды умноженной на количество ядер проца.
26 Mary01
 
05.06.15
13:10
(23) я пока только начала сопровождать бвазы с большими объемами данных и с обменами, раньше над производительностью не задумывалась, а теперь нужно. так что пытаюсь оптимизировать везде где только можно
27 Mary01
 
05.06.15
13:11
(25) о_0
28 фобка
 
05.06.15
13:11
(0) тоже читал про такое, не могу вспомнить где и почему. <> использовать стал редко, только если конструкция тяжелая
29 Domovoi
 
05.06.15
13:11
Несколько лет назад, была такая же тема, и там решили что с НЕ будет быстрее, тем быстрее <>. Вообще с вопросами скорости и производительности на мисте часто ошибаются, спросить конечно полезно, но лучше всегда проверить самим.
30 GROOVY
 
05.06.15
13:11
(27) Запросы оптимизируйте. Смотрите планы запросов.
31 kosts
 
05.06.15
13:12
(26) Для этого есть замер производительности. Ускоряй там, где долго работает, а сравнение оставь.
32 Domovoi
 
05.06.15
13:12
+(29)*теперь быстрее <>
33 DirecTwiX
 
05.06.15
13:12
(25) Это да, но такие вещи всё равно лучше знать.
34 GROOVY
 
05.06.15
13:12
Сейчас, ктонить вспомнит, что операторы в одну строку быстрее чем в несколько...
35 kosts
 
05.06.15
13:12
(34) А потом, что только в отладчике
36 Волшебник
 
модератор
05.06.15
13:13
Пятнично...
37 Necessitudo
 
05.06.15
13:15
В курсе Гилева сказано, что "НЕ = " быстрее чем "<>" в случае сравнения составных типов. Я собственно поэтому никогда <> и не использую.
А никто не натыкался на неадекватное понимание компоновкой условий типа "Где Документ.Проведен"?
38 Mary01
 
05.06.15
13:22
(28) вот и я так же
39 Mary01
 
05.06.15
13:22
(29) не могу найти эту тему
40 Mary01
 
05.06.15
13:23
(30) и это тоже делаю (предыдущая тема)
41 dmpl
 
05.06.15
13:23
(0) Для 1-го варианта не надо раскладку переключать.
42 Mary01
 
05.06.15
13:24
(37) да, вот оно!!!
а почему именно при составном?
43 dmpl
 
05.06.15
13:25
(11) А если надо бю надбрать?
44 ЧеловекДуши
 
05.06.15
13:25
(0) Побоку.
45 dmpl
 
05.06.15
13:26
(12) Не хочу огорчать, но скорость - это не стихия 1С. Для скорости надо использовать компиляторы.
46 kosts
 
05.06.15
13:26
(43) Встречал где-то такое слово?
И можно после ввода нажать стрелку вправо
47 ДенисЧ
 
05.06.15
13:26
(46) бюрократия <> <>рократия ))
48 GROOVY
 
05.06.15
13:27
(43) После пробела срабатывает. (47) Не надо тут ляля :)
49 ЧеловекДуши
 
05.06.15
13:28
Для чистоты, нужно прикрутить голосовалку:

1. "Не Переменная1 = Переменная2"
2. Переменная1 <> Переменная2
3. ...а мне побоку...
4. Условие = Не Переменная1 = Переменная2;
   Если (Условие) Тогда
5. ...Работать раб...
50 ДенисЧ
 
05.06.15
13:28
(48) а что, по новым правилам ПБУ, бюрократия == <>рократия? __
51 ДенисЧ
 
05.06.15
13:28
Я поставил себе 1с:AutoDesigner и не парюсь
52 vde69
 
05.06.15
13:29
1. не (неопределено = ложь)
2. неопределено <> ложь

одинаково...

а теперь так
1. не (СоставнойРеквизит = ложь)
2. СоставнойРеквизит <> ложь

будет разница в скорости...
53 dmpl
 
05.06.15
13:30
(46) А чем это название переменной хуже других? ;)
54 GROOVY
 
05.06.15
13:30
(51) Так онож одни горячие кнопки эмулирует другими...
55 kosts
 
05.06.15
13:35
(53) Переменным надо давать говорящие имена (за исключением простых счетчиков или тривиальных случаев).
56 ДенисЧ
 
05.06.15
13:35
(54) альт и б == <
какие горячие кнопки?
57 kosts
 
05.06.15
13:36
(50) Пятнично )))
58 Necessitudo
 
05.06.15
13:38
(42) А вот фиг знает. Это давалось как аксиома)
59 kosts
 
05.06.15
13:38
Конфигуратор и так не богат возможностями, так народ еще и про автозамену не знает...
60 dmpl
 
05.06.15
13:44
(55) Типа ЗдесьЛежитСписокДокументовНаРеализациюКоторыйЯПолучилИзЗапросаВДругойПроцедуреПоУсловиямОтбораПользователяПупкинаИзложеннымВЗаявкеНомер12345?
61 фобка
 
05.06.15
13:46
(46) бюджет, бюллетень
62 kosts
 
05.06.15
13:46
(60) Когда через пол года будешь читать и разбирать свой же код. То имя переменной из (60) тебе уже не покажется смешным по сравнению с "бю"...
63 Зеленый пень
 
05.06.15
13:48
(62) +100
64 Fragster
 
гуру
05.06.15
13:50
(51) у него всё хорошо, кроме того, что когда он включен глючит множественное выделение с контролом, иногда альты залипают...
(54) зато там контрол-ку вызывает конструктор запроса в конфигураторе :)
65 Гёдза
 
05.06.15
13:51
(0) по стандартам 1с не рекомендуется вариант 1
66 фобка
 
05.06.15
13:53
(65) цитату, плиз
67 Бубка Гоп
 
05.06.15
13:55
(0) Имхо, чем меньше "Не", тем читабельнее код, нужно стремиться минимизировать их количество в коде, в разумных пределах, конечно же. А вообще, гулусувалку бы прикрутила, штоле.
68 dmpl
 
05.06.15
13:56
(62) А то - скроллить туда-сюда замучаешься ;)
69 Сияющий Асинхраль
 
05.06.15
13:57
Вариант:
Если Что-то = Ложь Тогда
Пишу:
Если НЕ Что-то Тогда
Во всех остальных случаях стараюсь писать:
Если Что-то1 <> Что-то2 Тогда

понимается лучше...
70 kosts
 
05.06.15
13:59
http://1c.chistov.pro/2013/09/83_15.html
Не все удобно. Вместо " Коллекции значений Всем известные ТЗ, СЗ и ХЗ."
По мне удобнее написать "новый" и из выпадающего списка уже выбрать: Соответствие, массив, ТаблицаЗначений и пр.
71 b_ru
 
05.06.15
13:59
Все-таки адинэсники - не программисты :)

Конструкцию <> исторически не применяют в ПО, связанном с базами данных, так как следующий код вернет 2:

if (null != null)
  cout << 1
else
  cout << 2;

В то время как
if !(null == null)
  cout << 1
else
  cout << 2;

вернет более логичную 1

Врочем в 1С на это наплевали и там null = null.
72 Бубка Гоп
 
05.06.15
14:00
(69) дайте ему печеньку, кто нибудь
73 DS
 
05.06.15
14:00
(65) По любым стандартам предпочтительнее максимальное упрощение выражения.
74 kosts
 
05.06.15
14:00
(70) + Вместо "ИначеЕсли" я набираю "ие" и т.д.
75 GROOVY
 
05.06.15
14:01
(70) Так я только рад критике, добавим, исправим... Пишите!
76 kosts
 
05.06.15
14:12
Вот мои находки (не претендую на истину или авторство). Из часто используемого

пд    '00010101'
фд    Формат(<?>, "ДФ=dd.MM.yyyy")
н     Неопределено
л     Ложь
Ис    Истина
зз    ЗначениеЗаполнено(<?>)
ззс   ЗаполнитьЗначенияСвойств(<?>,);
пр    ПериодРегистрации


оф

Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
    ДанныеСтроки = ОформлениеСтроки.ДанныеСтроки;
    <?>
КонецЦикла;


Дляч

Для ч = 1 По <?"Ограничение"> Цикл
    <?>
КонецЦикла;


Длят

Для каждого т Из <?"Коллекция"> Цикл
    <?>
КонецЦикла;


Новый

<?"Тип", ВыборВарианта, "Соответствие", "Новый Соответствие;", "Структура", "Новый Структура(<?>,)", "ТабличныйДокумент", "Новый ТабличныйДокумент", "СписокЗначений", "Новый СписокЗначений;", "ТаблицаЗначений", "Новый ТаблицаЗначений;", "Массив", "Новый Массив;"
"Шрифт", "Новый Шрифт(<?>, , , , , ); //    КОНСТРУКТОР Имя шрифта, Размер, Жирный, Наклонный, Подчеркнутый, Зачеркнутый">




Пользуйтесь кому лень )
77 kosts
 
05.06.15
14:14
(76) +


зуп

Запрос.УстановитьПараметр("<?"Параметр">", <?"Параметр">);
78 фобка
 
05.06.15
14:15
(71) логично
79 Timon1405
 
05.06.15
14:21
(76) чисто из любопытства, сокращая Истина, до Ис, куда вы тратите сэкономленные секунды?)
80 ЧеловекДуши
 
05.06.15
14:22
(79) Предполагаю для рассуждения смысла жизни :)
81 Mary01
 
05.06.15
14:23
(76) а где эту настройку сделать?
82 kosts
 
05.06.15
14:24
(79) Я набираю ис получается Истина. И даже шифт не надо нажимать.
83 kosts
 
05.06.15
14:26
(81) Нажми сочетание Ctrl+Shift+T в конфигураторе.
+ в параметрах надо включить автозамену.
84 Mary01
 
05.06.15
14:26
(82) хочу так же сделать ) а где это настроить?
85 Mary01
 
05.06.15
14:26
(83) спасибо!
86 cons74
 
05.06.15
14:27
(69) напоминаю, что
Если Что-то = Ложь Тогда
корректно отработает в случае Что-то=Неопределено,а вот
Если НЕ Что-то Тогда
вылетит с ошибкой.
87 kosts
 
05.06.15
14:28
(85) Скачай готовый шаблон. Потом уже подправишь если надо будет.
88 Drac0
 
05.06.15
14:29
Где-то читал, что в запросах "<>" может быть транслировано  в логическое "ИЛИ", а то уже может пролететь мимо индексов. За правдивость отвечать не берусь.
89 kosts
 
05.06.15
14:32
(87) + Можно отключить стандартный шаблон, а то путается под ногами, точнее руками...
90 GROOVY
 
05.06.15
14:35
(77) Есть "УП" = "УстановитьПараметр(");
91 dmpl
 
05.06.15
14:35
(79) На ругань когда приходится на неподготовленном месте работать :)
92 kosts
 
05.06.15
14:35
(90) Одно другому не помешает.
93 kosts
 
05.06.15
14:37
Я фикси мне проще.
94 Nirvana
 
05.06.15
23:20
1) Теоретически оператор равенства и директива (Не =) должны работать быстрее, чем оператор неравенства (<>), поскольку при проверке на равенство значений ситуация различия их типов уже означает, что равенство не выполнено, в то время как при проверке на неравенство ситуация различия типов требует преобразования типов к идентичному, чтобы проверить неравенство при наиболее возможной ситуации равенства. Однако на практике техническая реализация оператора неравенства может быть разной, то есть программа при проверке на неравенство может на самом деле выполнять формальную проверку на равенство и возвращать обратный полученному результат. Поэтому в каждом частном случае быстродействие лучше определять замерами.

2) В среде 1С неявное преобразование типов может приводить к глюкам, потому предпочтительнее не провоцировать ситуации, где произойдёт такое автоматическое преобразование типов, в том числе в условиях директив.

3) В других средах разработки (не 1С) компилятор может не воспринимать сочетание "<>" как оператор неравенства, а считать это сочетанием математических операторов сравнения, применимых лишь для числовых типов (и это как раз правильно с чисто формальной точки зрения), и если вы привыкли везде использовать "<>", то придётся переучиваться.
95 Wern
 
06.06.15
00:30
Как уже говорили если один из параметров NULL с <> можно попасть. например (NULL<>1) - тут ложь, НЕ (NULL=1) - а вот тут уже истина.
96 13Дима13
 
06.06.15
08:49
(95) каким образом (NULL<>1) может вернуть ложь?
97 b_ru
 
06.06.15
10:17
(96) Любое выражение с null в большинстве языков возвращает null, а null может быть неявно приведен к false.
98 Wern
 
06.06.15
10:25
(97) в 1совских запросах в общем то та же ситуация. Если ты делаешь к примеру в запросе условие "Регистратор.Контрагент<>&ВыбКонтрагент"
То ожидаешь что все регистраторы у которых контрагент не равен выбранному попадут в твою выборку. А не тут то было. регистраторы у которых вообще нет реквизита контрагент сюда не попадут. В то время как если сделать условие "НЕ Регистратор.Контрагент=&ВыбКонтрагент" это условие отработает уже корректно.
99 igork1966
 
06.06.15
11:19
(96) это написано в стандарте на SQL
https://ru.wikipedia.org/wiki/NULL_(SQL)
100 GROOVY
 
06.06.15
11:19
(98) Когда я вижу в запросах Регистратор.Чтото - мне хочется убить автора запроса.
101 Wern
 
06.06.15
11:31
(100) И чего ты будешь делать если тебе надо контрагента из всех регистраторов регистра?
102 GROOVY
 
06.06.15
11:34
(101) Критерий отбора сделаю, или журнал, или регистр под эту задачу. Но никогда не буду делать запрос порождающий овер 256 соединений.
103 Wern
 
06.06.15
11:44
(102) Пусть это обработка которая запускается раз в месяц и соответственно работает ли она 10 секунд или 10 минут никого не интересует. И пусть ограничение в 256 таблиц не актуально, например регистраторов всего 20-30. Даже при таких условиях ты будешь вносить кучу изменений в конфигурации из-за каких то своих принципов?
104 GROOVY
 
06.06.15
12:08
(103) Обращение к регистратору в регистрах есть признак плохого проектирования регистра.
105 Повелитель
 
06.06.15
12:18
Голосовалку прикрути ))
Я использую <>, так проще код читать.

Развели тему на 100 постов.
Вот обработку за 3 минуты сделал:

http://hostingkartinok.com/show-image.php?id=430ef0efeb0ed69a89e074a4fc7d7d3c

Цикл на 1 000 000 сравнивает "не" и "<>"
Если 1<>1 Тогда    - 0,000003 секунд
Если не 1=1 Тогда - 0,000002 секунд

Не быстрее, но на 1 миллион, это вообще никак.
106 Wern
 
06.06.15
12:20
(104) Далеко не факт. При проектировании регистра невозможно предусмотреть все будущие задачи.
107 GROOVY
 
06.06.15
12:21
(106) Я в курсе, именно по этому у 1с периодически выходят новые редакции типовых. Переосмысленные, так сказать.
108 Повелитель
 
06.06.15
12:22
(105)
Извините, в цикл не попал.
Вот:

http://hostingkartinok.com/show-image.php?id=e5310711cd6823b920b84c78ce77d2f7

Если 1<>1 Тогда    2,437339 секунд
Если не 1=1 Тогда 2,310229 секунд

Разница на миллион доли секнуд
109 Aleksandr N
 
06.06.15
12:43
(6) Согласен)
110 dmpl
 
06.06.15
16:31
(97) C/C++ явно к этим языкам не относится ;)
111 dmpl
 
06.06.15
16:32
(100) А почему не автора регистра?
112 loralu
 
06.06.15
17:51
обычно в коде есть куда более стоящие вещи, чтобы их оптимизировать:) чем НЕ= и <>
113 oslokot
 
06.06.15
18:08
(108) Тест неверный! Нужно мерить по очереди, а не в куче. Попробуй условия местами поменять, результат будет противоположный.

Итак, всем всем всем! Конструкция "<>" все же быстрее чем "НЕ"

Повторяя тест в (108), было проведено трехкратное измерение обоих условий, начиная со второго запуска цикла.
Получены следующие данные чистого времени выполнения конструкций:

Если НЕ 1=1 Тогда
0.748
0.755
0.757

Если 1<>1 Тогда
0.728
0.741
0.726

Итого, <> отрабатывает быстрее на несколько миллионных долей секунды.
Платформа 8.3.5, цикл выполнялся на стороне сервера.
114 lucifer
 
06.06.15
18:21
(0)  Не Переменная1 = Переменная2 - это вынос мозга, по рукам за такое
115 Vovan1975
 
06.06.15
19:29
(0) отличный вопрос! В системах двоичной логики - без разницы.
В системах троичной логики разница есть.
116 Vovan1975
 
06.06.15
19:34
(0) вы это слышали там где рассказывалось про SQL. Ибо среда SQL использует троичную логику. Там есть true, false и unknown. В случае сравнения NULL с NULL возвращается не true как можно было бы ожидать, а unknown.
117 Nirvana
 
06.06.15
22:20
(94)+ Помимо чисто технических соображений есть ещё и факторы восприятия, о которых тут уже говорили (хотя и весьма субъективно).

Воспринимать комбинацию "<>" как условие "не равно" человек может лишь при двух обстоятельствах:
1) он привык к тому, что в языке нет оператора "НЕ".
2) он не привык часто использовать операторы "больше" и "меньше" для сравнения числовых значений.

В других же случаях сочетание "Альфа<>Омега" первым делом вызывает впечатление, что сравниваются числа. Затем, если имена переменных имеют явно нечисловое смысловое наполнение ("Контрагент<>НашаФирма"), следует вывод, что "это не числа", после чего следует узнавание самой комбинации "<>" ("это неравенство"), после чего следует конечный вывод ("контрагент - не наша фирма").
А при условии "Не Контрагент=НашаФирма", следуют лишь две мыслительных операции: "не выполнено условие..." и "не наша фирма".

Когда такие условия встречаются редко, трудности восприятия конструкции "<>" могут быть совсем незаметны, ведь всё происходит за доли секунды. Но когда в модуле множество всевозможных условий, когда условие неравенства повторяется многократно, чередуясь с другими, более сложными условиями, тогда заминки при встрече "<>" становятся куда ощутимее.
Я, например, больше десяти лет всегда писала "<>", даже ещё года полтора назад писала "<>". Теперь же всегда ставлю "Не =", в том числе когда свои же старые модули встречаю, переделываю на "Не =", ибо реально легче воспринимается.
118 фобка
 
06.06.15
23:25
(113) теперь сделайте тест для поля составного типа и утритесь
119 la luna llena
 
06.06.15
23:42
В типовых используют Не
120 b_ru
 
07.06.15
06:55
(110) Ессно, в стандарте C++ нет NULL в смысле баз данных (null-pointer - это совсем другое). А что там в конкретной библиотечке нарисуют можно только гадать, поэтому только !(==)
121 oslokot
 
07.06.15
08:18
(118) В чем проблема? Ну сделай и выложи результат сюда, куле)
122 ILM
 
гуру
07.06.15
09:58
В институте на первой лекции по программированию на языке фортран-76 наш Преподаватель целых 45 минут объяснял ветвления IF и логические операторы, так про "<>" было объяснено,  что это три оператора "<" "ИЛИ" ">", а про "НЕ" "РАВНО" - это два оператора. И еще много такого, чем пользуюсь до сих пор...
Так что у меня "НЕ =".
123 ДенисЧ
 
07.06.15
10:01
По итогам ветки теперь буду писать Если НЕ (а = 1) ТОгда...

Блин... Я же сам себе потом руки вырву, когда через месяц буду код править....
124 hhhh
 
07.06.15
10:15
(12) в языке 1с не так тупо воспринимается. <> это один символ, а не сумма двух.
125 dmpl
 
07.06.15
11:37
(120) А в стандарте какого большинства языков он есть?
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший