Разработка и Конфигурация · 9 мин
Как записать условие «не равно» в 1С
Как записать условие «не равно» в 1С: оператор <> в языке запросов и встроенном языке, отличия от !=, работа с NULL, типовые ошибки и примеры кода.
Условие «не равно» — одна из самых частых проверок при работе с 1С: оно встречается в запросах к базе данных, в условиях встроенного языка, в отборах динамических списков и в настройках СКД. При этом у новичков регулярно возникают вопросы: какой знак использовать, почему != выдаёт ошибку и почему сравнение с пустой ссылкой иногда «не срабатывает».
В 1С для проверки неравенства используется оператор <> — и в языке запросов, и во встроенном языке. Привычные из других языков варианты != или NOT = в чистом виде не работают, и это первое, что нужно запомнить. Вторая тонкость — особое поведение значения NULL в запросах: сравнение с ним через <> никогда не возвращает истину.
Оператор «не равно» во встроенном языке 1С
Во встроенном языке 1С (модулях, процедурах, функциях) неравенство проверяется оператором <>. Синтаксис простой: слева и справа от оператора стоят сравниваемые значения, результат — булево значение Истина или Ложь.
Если Заказ.Статус <> Перечисления.СтатусыЗаказов.Отменен Тогда
// обрабатываем заказ
КонецЕсли;
Оператор применим к числам, строкам, датам, булевым значениям, ссылкам на объекты. При сравнении ссылок сравнивается именно идентичность ссылок, а не содержимое объектов. Сравнение значений разных типов (например, строки с числом) может привести к ошибке или к неочевидному результату, поэтому типы лучше приводить явно.
Допустимо и отрицание равенства через логическое «НЕ»: конструкция НЕ (А = Б) эквивалентна А <> Б. Прямая запись с <> читается проще и предпочтительнее.
«Не равно» в языке запросов 1С
В тексте запроса условие неравенства записывается тем же оператором <> в секции ГДЕ (WHERE), в условиях соединений и в конструкции ВЫБОР КОГДА.
ВЫБРАТЬ
Товары.Ссылка
ИЗ
Справочник.Номенклатура КАК Товары
ГДЕ
Товары.ВидНоменклатуры <> &ИсключаемыйВид
И НЕ Товары.ПометкаУдаления
Параметры в сравнении обозначаются символом &. Передавать параметр удобнее, чем подставлять значение конкатенацией строки запроса, — это и безопаснее, и позволяет платформе кэшировать план запроса.
Помимо <>, в запросах доступно сравнение через НЕ ... В (...) для исключения списка значений и НЕ ... ПОДОБНО для исключения по шаблону строки. Это расширяет возможности, когда «не равно» нужно применить сразу к нескольким вариантам.
Сравнение с 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, для нескольких исключений — НЕ В. Проверяйте результат на тестовых данных, особенно количество строк до и после применения условия.