Разработка и Конфигурация · 8 мин
Как написать «не равно» в 1С
Как записать условие «не равно» в 1С: оператор <>, знак неравенства в запросах, проверка заполненности, типичные ошибки при сравнении значений.
Во встроенном языке 1С для проверки неравенства двух значений используется оператор <>. Этот же знак применяется в языке запросов, в параметрах компоновки данных и в отборах динамических списков. Символ «≠» из математики платформа не понимает — попытка вставить его в модуль приведёт к синтаксической ошибке.
Неравенство проверяется одинаково для чисел, строк, дат, булевых значений и ссылок на объекты. Однако у сравнения есть нюансы: различие типов, значение NULL в запросах, незаполненные реквизиты. Ниже разобраны все рабочие варианты с примерами кода, типичными ошибками и способами проверки результата.
Оператор <> во встроенном языке
Базовый синтаксис условия с неравенством выглядит так:
Если Количество <> 0 Тогда
Цена = Сумма / Количество;
КонецЕсли;
Оператор возвращает булево значение: Истина, если операнды различны, и Ложь, если они равны. Его можно использовать не только в конструкции Если, но и везде, где допустимо логическое выражение — в циклах Пока, при присваивании, в тернарной логике через ?(Условие, Значение1, Значение2).
Пример с присваиванием результата сравнения переменной:
ЕстьРасхождения = СуммаДокумента <> СуммаПоТабличнойЧасти;
Если ЕстьРасхождения Тогда
Сообщить("Суммы не совпадают, проверьте документ");
КонецЕсли;
Операнды можно менять местами — А <> Б и Б <> А эквивалентны. Пробелы вокруг знака не обязательны, но их принято ставить для читаемости кода.
Неравенство в запросах 1С
В тексте запроса оператор «не равно» записывается тем же знаком <> в предложении ГДЕ, в соединениях таблиц и в условиях ВЫБОР КОГДА:
ВЫБРАТЬ
Номенклатура.Ссылка КАК Товар
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.ВидНоменклатуры <> &ВидУслуги
И НЕ Номенклатура.ПометкаУдаления
Параметр запроса задаётся через Запрос.УстановитьПараметр("ВидУслуги", Значение). Сравнение с параметром работает так же, как сравнение с литералом, но тип параметра должен соответствовать типу поля — иначе можно получить пустой результат без видимой ошибки.
Для строк в запросах иногда удобнее сравнение через ПОДОБНО с отрицанием: НЕ Наименование ПОДОБНО "%тест%". Это проверка не точного неравенства, а отсутствия вхождения подстроки.
Особый случай: сравнение с NULL и пустыми значениями
Главная ловушка неравенства в запросах — значение NULL. Оно появляется, например, при левом соединении, когда в присоединяемой таблице нет подходящей строки. Любое сравнение с NULL, включая <> NULL, даёт не Истина и не Ложь, а неопределённый результат, и строка отфильтровывается. Поэтому условие Остаток <> NULL не вернёт ни одной записи.
Правильный способ проверить, что значение не пустое в смысле NULL:
ГДЕ
Остатки.КоличествоОстаток ЕСТЬ НЕ NULL
Отдельно от NULL существуют пустые значения: пустая ссылка, пустая строка, ноль. Для проверки «ссылка не заполнена» используется сравнение с пустой ссылкой через функцию ЗНАЧЕНИЕ() или параметр, а во встроенном языке — функция ЗначениеЗаполнено():
Если ЗначениеЗаполнено(Документ.Договор) Тогда
// реквизит не равен пустой ссылке
КонецЕсли;
Неравенство в отборах и настройках СКД
В динамических списках, отборах форм и настройках отчётов на СКД неравенство задаётся через вид сравнения «Не равно». Программно это устанавливается так:
ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Организация");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно;
ЭлементОтбора.ПравоеЗначение = ТекущаяОрганизация;
ЭлементОтбора.Использование = Истина;
Кроме «Не равно» в компоновке доступны родственные виды сравнения: «Не в списке», «Не содержит», «Не заполнено». Для строковых полей вариант «Не содержит» часто практичнее точного неравенства, потому что пользователи редко знают точное значение наименования.
В пользовательском режиме отчёта на СКД тот же отбор добавляется через кнопку настройки отборов: выбирается поле, в колонке вида сравнения — «Не равно», затем значение. Если поле недоступно для отбора, причина обычно в настройках схемы компоновки, а не в синтаксисе.
Варианты проверки неравенства
Точное неравенство двух значений в коде и запросах. Не работает с NULL.
Проверка заполненности поля в запросе при соединениях таблиц.
Проверка пустой ссылки, строки или числа во встроенном языке.
Отбор в динамических списках и отчётах СКД без изменения кода.
Типичные ошибки при записи «не равно»
Первая ошибка — попытка использовать символы из других языков: != (как в C, JavaScript, Python) или ≠. Компилятор 1С выдаст синтаксическую ошибку ещё при сохранении модуля, поэтому такая опечатка обнаруживается быстро.
Вторая ошибка — сравнение значений разных типов без приведения. Например, строка "10" не равна числу 10, и условие КодСтрокой <> 10 будет истинным, даже если визуально значения совпадают. Перед сравнением приводите типы явно: Число(СтрокаКода) <> 10.
Третья группа ошибок связана со строками: лишние пробелы, неразрывные пробелы, разный регистр. Сравнение строк в 1С нечувствительно к регистру, но чувствительно к пробелам. Если данные приходят из внешних источников, перед сравнением применяйте СокрЛП().
Как проверить, что условие работает правильно
Самый быстрый способ отладки условия — вывести значения обеих сторон сравнения в сообщение или посмотреть их в отладчике через точку останова. В отладчике видно и значение, и тип переменной, что сразу показывает несовпадение типов.
Для запросов проверку удобно выполнять в консоли запросов: сначала уберите условие неравенства и убедитесь, что данные вообще выбираются, затем добавьте условие и сравните количество строк. Резкое обнуление результата — признак проблемы с типом параметра или с NULL.
Как проверить результат
Типы совпадают или приведены явно
Строка сравнивается с числом или ссылкой
Строки отбираются по ожидаемому правилу
Пустой результат при наличии подходящих данных
Значения соответствуют ожиданиям
NULL, лишние пробелы, неожиданный тип
Частые вопросы
Можно ли написать «не равно» через оператор НЕ?
Да, конструкция НЕ (А = Б) эквивалентна А <> Б. Вариант с <> короче и читается легче, поэтому в практике используется чаще. Оператор НЕ удобен для отрицания сложных условий целиком.
Почему условие «не равно» с датой не срабатывает?
Даты в 1С хранятся с точностью до секунды. Если сравнивается дата документа с датой без времени, неявное время 00:00:00 может отличаться от фактического. Отсекайте время через НачалоДня() или сравнивайте границы периода.
Как исключить несколько значений сразу?
В запросе используйте НЕ Поле В (&СписокЗначений), где параметр — массив или список значений. В отборах СКД для этого есть вид сравнения «Не в списке». Цепочка условий через И с несколькими <> тоже работает, но хуже читается.
Работает ли <> с булевыми значениями?
Да, например Если Флаг <> Истина Тогда. Но для булевых переменных читаемее вариант Если НЕ Флаг Тогда — он выражает ту же проверку без лишнего сравнения.
Как проверить, что строка не пустая?
Во встроенном языке — НЕ ПустаяСтрока(Значение) или ЗначениеЗаполнено(Значение). В запросе — Поле <> "", но надёжнее проверять через ВЫРАЗИТЬ и длину, если тип поля составной.
Отличается ли синтаксис в тонком клиенте и на сервере?
Нет, оператор <> одинаков во всех контекстах исполнения: на сервере, в тонком и веб-клиенте, во внешних соединениях. Различия касаются только доступности функций, а не синтаксиса сравнения.
Что важно запомнить
«Не равно» в 1С — это оператор <>, единый для встроенного языка и запросов. Для NULL в запросах используйте ЕСТЬ НЕ NULL, для пустых реквизитов — ЗначениеЗаполнено(), в отборах СКД — вид сравнения «Не равно». Перед сравнением проверяйте типы и очищайте строки от лишних пробелов.