К статье
Практический материал

Разработка и Конфигурация · 9 мин

Как записать условие «не равно» в 1С

Как записать условие «не равно» в 1С: оператор <> в языке запросов и встроенном языке, отличия от !=, работа с NULL, типовые ошибки и примеры кода.

Условие «не равно» — одна из самых частых проверок при работе с 1С: оно встречается в запросах к базе данных, в условиях встроенного языка, в отборах динамических списков и в настройках СКД. При этом у новичков регулярно возникают вопросы: какой знак использовать, почему != выдаёт ошибку и почему сравнение с пустой ссылкой иногда «не срабатывает».

В 1С для проверки неравенства используется оператор <> — и в языке запросов, и во встроенном языке. Привычные из других языков варианты != или NOT = в чистом виде не работают, и это первое, что нужно запомнить. Вторая тонкость — особое поведение значения NULL в запросах: сравнение с ним через <> никогда не возвращает истину.

Оператор «не равно» во встроенном языке 1С

Во встроенном языке 1С (модулях, процедурах, функциях) неравенство проверяется оператором <>. Синтаксис простой: слева и справа от оператора стоят сравниваемые значения, результат — булево значение Истина или Ложь.

Если Заказ.Статус <> Перечисления.СтатусыЗаказов.Отменен Тогда

// обрабатываем заказ

КонецЕсли;

Оператор применим к числам, строкам, датам, булевым значениям, ссылкам на объекты. При сравнении ссылок сравнивается именно идентичность ссылок, а не содержимое объектов. Сравнение значений разных типов (например, строки с числом) может привести к ошибке или к неочевидному результату, поэтому типы лучше приводить явно.

Допустимо и отрицание равенства через логическое «НЕ»: конструкция НЕ (А = Б) эквивалентна А <> Б. Прямая запись с <> читается проще и предпочтительнее.

Типичные ошибки
01
Использование != по привычке из C#, Java или JavaScript — компилятор 1С выдаст синтаксическую ошибку
02
Сравнение строки с числом без приведения типов — результат непредсказуем
03
Сравнение ссылок по представлению (строке наименования) вместо сравнения самих ссылок

«Не равно» в языке запросов 1С

В тексте запроса условие неравенства записывается тем же оператором <> в секции ГДЕ (WHERE), в условиях соединений и в конструкции ВЫБОР КОГДА.

ВЫБРАТЬ

Товары.Ссылка

ИЗ

Справочник.Номенклатура КАК Товары

ГДЕ

Товары.ВидНоменклатуры <> &ИсключаемыйВид

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

Параметры в сравнении обозначаются символом &. Передавать параметр удобнее, чем подставлять значение конкатенацией строки запроса, — это и безопаснее, и позволяет платформе кэшировать план запроса.

Помимо <>, в запросах доступно сравнение через НЕ ... В (...) для исключения списка значений и НЕ ... ПОДОБНО для исключения по шаблону строки. Это расширяет возможности, когда «не равно» нужно применить сразу к нескольким вариантам.

Сравнение с NULL и пустыми значениями

Главный подводный камень: в языке запросов NULL не равен ничему, включая сам себя. Условие Поле <> NULL никогда не будет истинным, и строки с NULL просто выпадут из выборки. Для проверки используются специальные конструкции.

ГДЕ

Таблица.Поле ЕСТЬ NULL // поле содержит NULL

// или

НЕ Таблица.Поле ЕСТЬ NULL // поле заполнено (не NULL)

NULL чаще всего появляется при левых соединениях, когда в присоединённой таблице не нашлось пары. Если нужно исключить такие строки, правильное условие — НЕ Поле ЕСТЬ NULL, а не Поле <> NULL.

Для пустых ссылок, пустых строк и незаполненных дат сравнение через <> работает нормально: пустая ссылка — это обычное значение, а не NULL. Проверка выглядит так: Товары.Категория <> ЗНАЧЕНИЕ(Справочник.Категории.ПустаяСсылка).

«Не равно» в СКД и отборах динамических списков

В системе компоновки данных и в отборах динамических списков неравенство задаётся не текстом, а выбором вида сравнения. В настройках отбора для поля выбирается вид сравнения «Не равно», «Не в списке», «Не содержит» и т.д. Платформа сама преобразует это в условие запроса.

При программной установке отбора вид сравнения задаётся через ВидСравненияКомпоновкиДанных.НеРавно:

ЭлементОтбора = Отчет.КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(

Тип("ЭлементОтбораКомпоновкиДанных"));

ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Статус");

ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно;

ЭлементОтбора.ПравоеЗначение = Перечисления.Статусы.Черновик;

ЭлементОтбора.Использование = Истина;

Для динамических списков форм аналогично используется ВидСравненияКомпоновкиДанных.НеРавно при добавлении элемента в Список.Отбор. Учтите, что отбор «Не равно» по полю, которое может быть NULL в источнике данных списка, подчиняется тем же правилам, что и в запросах.

Исключение нескольких значений: НЕ В и составные условия

Когда нужно исключить не одно значение, а несколько, цепочка условий Поле <> А И Поле <> Б работает, но плохо читается. Компактнее использовать конструкцию «НЕ В»:

ГДЕ

НЕ Документ.Статус В (&СписокИсключаемыхСтатусов)

Параметром можно передать массив или список значений. Альтернатива — соединение с временной таблицей исключений, что удобно при большом числе значений или когда список исключений берётся из базы.

Обратите внимание на логику: при исключении нескольких значений условия объединяются через И, а не через ИЛИ. Запись Поле <> А ИЛИ Поле <> Б будет истинна почти всегда — это одна из самых коварных логических ошибок.

Маршрут решения

Как выбрать действие

Нужно исключить одно значение в запросе или кодеИспользуйте оператор <>
Нужно исключить несколько значенийИспользуйте НЕ ... В (...) с параметром-массивом
Проверяете поле, которое может содержать NULLИспользуйте НЕ Поле ЕСТЬ NULL вместо сравнения
Настраиваете отбор в отчёте или списке без кодаВыберите вид сравнения «Не равно» или «Не в списке» в настройках отбора

Проверка результата и отладка условий

Убедиться, что условие «не равно» работает как задумано, помогают простые приёмы. Во-первых, выполните запрос в консоли запросов на тестовой копии базы и сравните количество строк с условием и без него — разница должна соответствовать числу исключаемых записей.

Во-вторых, проверьте граничные случаи: пустая ссылка, пустая строка, NULL из соединения, значение с другим регистром букв (для строк сравнение в запросах обычно не зависит от регистра, но зависит от настроек базы данных). В-третьих, при подозрении на NULL временно замените условие на Поле ЕСТЬ NULL — так вы увидите, сколько строк теряется именно из-за NULL.

Во встроенном языке для отладки удобно вывести сравниваемые значения через Сообщить() или использовать отладчик с точкой останова на строке условия и просмотром значений в табло.

Контрольные точки

Как проверить результат

Количество строк в выборке
Норма

Уменьшилось ровно на число исключаемых записей

Тревожный признак

Строк пропало больше — вероятно, в сравнении участвует NULL

Текст запроса
Норма

Используется <> или НЕ ... В

Тревожный признак

Встречается != или сравнение с NULL через <>

Логика составного условия
Норма

Исключения объединены через И

Тревожный признак

Использовано ИЛИ — условие почти всегда истинно

Частые вопросы

Почему != не работает в 1С?

Встроенный язык и язык запросов 1С поддерживают только оператор <> для неравенства. Синтаксис != заимствован из C-подобных языков и в 1С не реализован — попытка его использовать приведёт к ошибке компиляции модуля или разбора текста запроса.

Как исключить пустую ссылку в запросе?

Используйте условие вида: Поле <> ЗНАЧЕНИЕ(Справочник.ИмяСправочника.ПустаяСсылка). Для документов и перечислений синтаксис аналогичный. Пустая ссылка — обычное значение, поэтому сравнение через <> работает корректно.

Почему условие Поле <> &Параметр отсекает лишние строки?

Скорее всего, в части записей поле содержит NULL — например, из-за левого соединения без совпадений. Сравнение NULL с любым значением даёт не Истину и не Ложь, а неопределённость, и такие строки исключаются. Добавьте условие ИЛИ Поле ЕСТЬ NULL, если эти строки нужны.

Как сравнить строки «не равно» без учёта регистра?

В запросах сравнение строк обычно регистронезависимо (зависит от настроек СУБД). Во встроенном языке оператор <> для строк учитывает регистр, поэтому для сравнения без регистра приведите обе строки через ВРег() или НРег() перед сравнением.

Можно ли использовать «не равно» в условии ВЫБОР КОГДА?

Да, оператор <> допустим внутри конструкции ВЫБОР КОГДА ... ТОГДА ... ИНАЧЕ ... КОНЕЦ. Например: ВЫБОР КОГДА Заказ.Статус <> &Статус ТОГДА "Активен" ИНАЧЕ "Завершён" КОНЕЦ. Правила работы с NULL сохраняются и здесь.

Чем «Не в списке» отличается от нескольких условий «не равно»?

По результату они эквивалентны, если условия объединены через И. «Не в списке» (НЕ В) компактнее, легче поддерживается и позволяет передать список одним параметром-массивом, поэтому при исключении трёх и более значений предпочтительнее.

Итог

Что важно запомнить

Неравенство в 1С — это оператор <> в коде и в запросах, вид сравнения «Не равно» в отборах и СКД. Синтаксис != не поддерживается. Для NULL используйте ЕСТЬ NULL / НЕ ЕСТЬ NULL, для нескольких исключений — НЕ В. Проверяйте результат на тестовых данных, особенно количество строк до и после применения условия.