При изучении чужого кода или типовых конфигураций «1С:Предприятие» разработчики часто сталкиваются с конструкцией НЕ Переменная = Значение вместо привычного оператора <>. На первый взгляд это кажется избыточным, но за этим стилем кодирования стоят конкретные причины — от эргономики рабочего места до особенностей работы интерпретатора. В этой статье мы подробно разберем, какой вариант лучше использовать, какие риски несет каждый из них и как оптимизировать процесс написания условий в 1С.
Одной из главных причин появления конструкции НЕ ... = является специфика русской раскладки клавиатуры. Разберем эту ситуацию подробнее. Для написания стандартного оператора неравенства <> программисту необходимо:
<).>).В то же время служебное слово НЕ и оператор = доступны непосредственно в русской раскладке (равно пишется без Shift, а НЕ — это просто русские буквы). Многие разработчики выбирают путь наименьшего сопротивления, чтобы не «дергать» раскладку клавиатуры туда-сюда ради двух символов. Однако это решение имеет свои последствия для качества кода.
Чтобы не жертвовать качеством кода ради удобства набора, профессиональное сообщество выработало альтернативные решения. Рассмотрим наиболее популярное из них — использование специальной программной раскладки (например, раскладки Чистова). Проанализируем, как это работает:
Специализированная раскладка позволяет вводить спецсимволы [ ] { } < > / \ | без переключения на английский язык. Это достигается путем назначения этих символов на «пустые» зоны клавиатуры или через использование клавиши AltGr (правый Alt). Если вы настроите такую раскладку, необходимость писать НЕ ... = ради экономии времени отпадет сама собой, так как <> будет набираться парой нажатий в русской раскладке.
Разберем критически важный нюанс, который часто упускают приверженцы конструкции НЕ. Во встроенном языке 1С оператор логического отрицания НЕ имеет более высокий приоритет, чем оператор сравнения =. Посмотрим на примере, к чему это может привести:
// Опасный код:
Если НЕ Статус = Справочники.Статусы.Активен Тогда
// Логика
КонецЕсли;
В данном случае интерпретатор сначала попытается применить НЕ к переменной Статус. Если в переменной число или строка, программа выдаст ошибку времени выполнения. Если же там значение типа Булево, результат будет логически неверным. Чтобы конструкция работала правильно и заменяла оператор <>, необходимо обязательно использовать скобки:
// Корректный вариант:
Если НЕ (Статус = Справочники.Статусы.Активен) Тогда
// Логика
КонецЕсли;
Таким образом, аргумент об «удобстве набора» разбивается об необходимость нажимать дополнительные клавиши для открытия и закрытия скобок. Использование <> исключает подобные ошибки приоритетов в принципе. Для автоматического выявления подобных ошибок и дефектов в модулях подойдёт статический анализатор кода конфигураций 1С.
Выясним причину, по которой оператор неравенства считается более эффективным с точки зрения платформы. С точки зрения виртуальной машины 1С:
<> — это одна элементарная операция (одна инструкция байт-кода).НЕ (... = ...) — это как минимум две операции: сначала сравнение на равенство, а затем инверсия полученного результата.Хотя на одном условии разница в скорости будет исчисляться наносекундами, в высоконагруженных циклах (например, при обработке сотен тысяч строк в памяти) использование <> даст объективное преимущество. Мнение о том, что НЕ ... = работает быстрее, является мифом и не подтверждается техническими тестами платформы.
Проанализируем ситуацию с точки зрения «чистого кода». Большинство автоматизированных систем проверки качества кода (таких как BSL Language Server) помечают конструкцию НЕ (... = ...) как «запах кода» (code smell) или избыточность. Основные аргументы:
<> как «не равно», чем разбирать цепочку из отрицания и равенства.<> является стандартным для SQL и Pascal, на которых базируется логика 1С. Его использование делает код более привычным для широкого круга разработчиков.Важно помнить, что в языке запросов 1С ситуация обстоит аналогично. Несмотря на то, что СУБД (SQL Server, PostgreSQL) умеют оптимизировать выражения, использование ГДЕ НЕ Реквизит = &Значение может усложнить работу оптимизатора в очень сложных запросах с множеством соединений. Стандартный оператор <> в тексте запроса более прозрачен для планировщика задач СУБД. Однако стоит помнить, что любое отрицание (будь то <> или НЕ =) обычно делает невозможным использование индексов (Index Seek), приводя к сканированию (Index Scan).
Если вы хотите писать качественный код с использованием <>, но не хотите использовать альтернативные раскладки, разберем другие способы автоматизации:
<>.!= (привычного для C-style языков) на <> прямо в процессе набора.Подводя итог нашему анализу, можно сделать вывод: использование НЕ ... = вместо <> чаще всего является вредной привычкой, вызванной неудобством переключения раскладки. С технической точки зрения оператор <>:
Мы рекомендуем один раз настроить удобный инструмент для ввода спецсимволов и придерживаться использования классического оператора неравенства. Это сделает ваш код профессиональным, надежным и легким для поддержки коллегами. Для ускорения написания корректного кода можно применять шаблоны для стандартов и методик разработки 1С.