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

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

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

Как записать условие «не равно» в 1С: оператор <>, знак неравенства в запросах, проверка заполненности, типичные ошибки при сравнении значений.

Во встроенном языке 1С для проверки неравенства двух значений используется оператор <>. Этот же знак применяется в языке запросов, в параметрах компоновки данных и в отборах динамических списков. Символ «≠» из математики платформа не понимает — попытка вставить его в модуль приведёт к синтаксической ошибке.

Неравенство проверяется одинаково для чисел, строк, дат, булевых значений и ссылок на объекты. Однако у сравнения есть нюансы: различие типов, значение NULL в запросах, незаполненные реквизиты. Ниже разобраны все рабочие варианты с примерами кода, типичными ошибками и способами проверки результата.

Оператор <> во встроенном языке

Базовый синтаксис условия с неравенством выглядит так:

Если Количество <> 0 Тогда

Цена = Сумма / Количество;

КонецЕсли;

Оператор возвращает булево значение: Истина, если операнды различны, и Ложь, если они равны. Его можно использовать не только в конструкции Если, но и везде, где допустимо логическое выражение — в циклах Пока, при присваивании, в тернарной логике через ?(Условие, Значение1, Значение2).

Пример с присваиванием результата сравнения переменной:

ЕстьРасхождения = СуммаДокумента <> СуммаПоТабличнойЧасти;

Если ЕстьРасхождения Тогда

Сообщить("Суммы не совпадают, проверьте документ");

КонецЕсли;

Операнды можно менять местами — А <> Б и Б <> А эквивалентны. Пробелы вокруг знака не обязательны, но их принято ставить для читаемости кода.

Неравенство в запросах 1С

В тексте запроса оператор «не равно» записывается тем же знаком <> в предложении ГДЕ, в соединениях таблиц и в условиях ВЫБОР КОГДА:

ВЫБРАТЬ

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

ИЗ

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

ГДЕ

Номенклатура.ВидНоменклатуры <> &ВидУслуги

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

Параметр запроса задаётся через Запрос.УстановитьПараметр("ВидУслуги", Значение). Сравнение с параметром работает так же, как сравнение с литералом, но тип параметра должен соответствовать типу поля — иначе можно получить пустой результат без видимой ошибки.

Для строк в запросах иногда удобнее сравнение через ПОДОБНО с отрицанием: НЕ Наименование ПОДОБНО "%тест%". Это проверка не точного неравенства, а отсутствия вхождения подстроки.

Особый случай: сравнение с NULL и пустыми значениями

Главная ловушка неравенства в запросах — значение NULL. Оно появляется, например, при левом соединении, когда в присоединяемой таблице нет подходящей строки. Любое сравнение с NULL, включая <> NULL, даёт не Истина и не Ложь, а неопределённый результат, и строка отфильтровывается. Поэтому условие Остаток <> NULL не вернёт ни одной записи.

Правильный способ проверить, что значение не пустое в смысле NULL:

ГДЕ

Остатки.КоличествоОстаток ЕСТЬ НЕ NULL

Отдельно от NULL существуют пустые значения: пустая ссылка, пустая строка, ноль. Для проверки «ссылка не заполнена» используется сравнение с пустой ссылкой через функцию ЗНАЧЕНИЕ() или параметр, а во встроенном языке — функция ЗначениеЗаполнено():

Если ЗначениеЗаполнено(Документ.Договор) Тогда

// реквизит не равен пустой ссылке

КонецЕсли;

Неравенство в отборах и настройках СКД

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

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

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

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

ЭлементОтбора.ПравоеЗначение = ТекущаяОрганизация;

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

Кроме «Не равно» в компоновке доступны родственные виды сравнения: «Не в списке», «Не содержит», «Не заполнено». Для строковых полей вариант «Не содержит» часто практичнее точного неравенства, потому что пользователи редко знают точное значение наименования.

В пользовательском режиме отчёта на СКД тот же отбор добавляется через кнопку настройки отборов: выбирается поле, в колонке вида сравнения — «Не равно», затем значение. Если поле недоступно для отбора, причина обычно в настройках схемы компоновки, а не в синтаксисе.

Варианты проверки неравенства

Оператор <>

Точное неравенство двух значений в коде и запросах. Не работает с NULL.

ЕСТЬ НЕ NULL

Проверка заполненности поля в запросе при соединениях таблиц.

НЕ ЗначениеЗаполнено()

Проверка пустой ссылки, строки или числа во встроенном языке.

Вид сравнения «Не равно»

Отбор в динамических списках и отчётах СКД без изменения кода.

Типичные ошибки при записи «не равно»

Первая ошибка — попытка использовать символы из других языков: != (как в C, JavaScript, Python) или ≠. Компилятор 1С выдаст синтаксическую ошибку ещё при сохранении модуля, поэтому такая опечатка обнаруживается быстро.

Вторая ошибка — сравнение значений разных типов без приведения. Например, строка "10" не равна числу 10, и условие КодСтрокой <> 10 будет истинным, даже если визуально значения совпадают. Перед сравнением приводите типы явно: Число(СтрокаКода) <> 10.

Третья группа ошибок связана со строками: лишние пробелы, неразрывные пробелы, разный регистр. Сравнение строк в 1С нечувствительно к регистру, но чувствительно к пробелам. Если данные приходят из внешних источников, перед сравнением применяйте СокрЛП().

Типичные ошибки
01
Запись != вместо <> — синтаксическая ошибка модуля
02
Сравнение с NULL через <> в запросе — все строки отфильтровываются
03
Сравнение строки с числом — условие всегда истинно
04
Игнорирование пробелов в строках — ложное неравенство визуально одинаковых значений
05
Сравнение с пустой ссылкой через пустую строку — типы не совпадают

Как проверить, что условие работает правильно

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

Для запросов проверку удобно выполнять в консоли запросов: сначала уберите условие неравенства и убедитесь, что данные вообще выбираются, затем добавьте условие и сравните количество строк. Резкое обнуление результата — признак проблемы с типом параметра или с NULL.

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

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

Типы операндов
Норма

Типы совпадают или приведены явно

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

Строка сравнивается с числом или ссылкой

Результат запроса
Норма

Строки отбираются по ожидаемому правилу

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

Пустой результат при наличии подходящих данных

Значения в отладчике
Норма

Значения соответствуют ожиданиям

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

NULL, лишние пробелы, неожиданный тип

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

Можно ли написать «не равно» через оператор НЕ?

Да, конструкция НЕ (А = Б) эквивалентна А <> Б. Вариант с <> короче и читается легче, поэтому в практике используется чаще. Оператор НЕ удобен для отрицания сложных условий целиком.

Почему условие «не равно» с датой не срабатывает?

Даты в 1С хранятся с точностью до секунды. Если сравнивается дата документа с датой без времени, неявное время 00:00:00 может отличаться от фактического. Отсекайте время через НачалоДня() или сравнивайте границы периода.

Как исключить несколько значений сразу?

В запросе используйте НЕ Поле В (&СписокЗначений), где параметр — массив или список значений. В отборах СКД для этого есть вид сравнения «Не в списке». Цепочка условий через И с несколькими <> тоже работает, но хуже читается.

Работает ли <> с булевыми значениями?

Да, например Если Флаг <> Истина Тогда. Но для булевых переменных читаемее вариант Если НЕ Флаг Тогда — он выражает ту же проверку без лишнего сравнения.

Как проверить, что строка не пустая?

Во встроенном языке — НЕ ПустаяСтрока(Значение) или ЗначениеЗаполнено(Значение). В запросе — Поле <> "", но надёжнее проверять через ВЫРАЗИТЬ и длину, если тип поля составной.

Отличается ли синтаксис в тонком клиенте и на сервере?

Нет, оператор <> одинаков во всех контекстах исполнения: на сервере, в тонком и веб-клиенте, во внешних соединениях. Различия касаются только доступности функций, а не синтаксиса сравнения.

Итог

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

«Не равно» в 1С — это оператор <>, единый для встроенного языка и запросов. Для NULL в запросах используйте ЕСТЬ НЕ NULL, для пустых реквизитов — ЗначениеЗаполнено(), в отборах СКД — вид сравнения «Не равно». Перед сравнением проверяйте типы и очищайте строки от лишних пробелов.