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

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

Как в 1С пишется «не равно»: оператор <> и его применение

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

Во встроенном языке 1С и в языке запросов условие «не равно» записывается одним и тем же способом — парой символов <>, которые ставятся между сравниваемыми значениями без пробела между ними. Например: Если Сумма <> 0 Тогда. Это единственный штатный вариант: комбинации вроде !=, привычные по C-подобным языкам, в 1С не работают и вызовут синтаксическую ошибку.

Знак «не равно» используется повсеместно: в условиях Если, в запросах к базе данных, в отборах динамических списков, в настройках СКД и в выражениях управляемых форм. Понимание того, где и как он пишется, а также чем отличается сравнение ссылок, строк и значения NULL, избавляет от большинства ошибок, с которыми сталкиваются начинающие разработчики и администраторы, настраивающие отборы.

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

Во встроенном языке (модуле объекта, формы, общем модуле) неравенство записывается оператором <>. Он возвращает значение типа Булево и применяется к числам, строкам, датам, ссылкам и другим сравнимым типам:

Если Контрагент <> Справочники.Контрагенты.ПустаяСсылка() Тогда

Сообщить("Контрагент выбран");

КонецЕсли;

Между символами < и > пробел не ставится — иначе компилятор воспримет их как два отдельных оператора сравнения и выдаст ошибку. Пробелы вокруг всего оператора допустимы и рекомендуются для читаемости кода.

Оператор корректно работает со ссылочными типами: сравнение двух ссылок идёт по уникальному идентификатору, поэтому ТекСсылка <> ДругаяСсылка — надёжный способ проверить, что это разные объекты. Сравнение значений несравнимых типов (например, строки со ссылкой) не вызовет исключение, а просто вернёт Истина, что иногда маскирует логические ошибки.

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

В языке запросов оператор тот же — <>. Он применяется в секции ГДЕ, в условиях соединений и в ИМЕЮЩИЕ:

ВЫБРАТЬ

Номенклатура.Ссылка

ИЗ

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

ГДЕ

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

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

Частый сценарий — исключить пустые значения. Для ссылок это Поле <> ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка), для строк — Поле <> "", для чисел — Поле <> 0. У каждого типа своё «пустое» значение, и сравнивать нужно именно с ним.

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

ГДЕ НЕ Таблица.Поле ЕСТЬ NULL

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

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

Если нужно исключить несколько значений сразу, эффективнее вид сравнения «Не в списке»: он заменяет цепочку условий Поле <> Значение1 И Поле <> Значение2 и работает быстрее, так как платформа формирует один компактный оператор в итоговом запросе.

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

Порядок действий: отбор «не равно» в отчёте СКД
  1. 1
    Откройте настройки отчёта и перейдите на закладку «Отбор»
  2. 2
    Добавьте нужное поле из списка доступных полей
  3. 3
    В колонке «Вид сравнения» выберите «Не равно» (или «Не в списке» для нескольких значений)
  4. 4
    Укажите значение отбора и сформируйте отчёт
  5. 5
    Проверьте, что исключённые записи отсутствуют в результате

Сравнение строк, дат и составных типов

При сравнении строк оператор <> учитывает регистр символов и пробелы: "Контрагент " с пробелом в конце не равно "Контрагент". Если данные приходят из загрузок или обменов, перед сравнением строки стоит нормализовать функциями СокрЛП() и, при необходимости, ВРег() или НРег().

Даты сравниваются с точностью до секунды. Документ, проведённый в 14:00:00, не равен дате 14:00:01. Если нужно сравнить только день без времени, используйте НачалоДня() для обеих сторон сравнения.

Реквизиты составного типа (например, «Контрагент или Договор») при сравнении с конкретным значением другого типа вернут Истина для <>, даже если по смыслу поле «пустое». Надёжнее проверять тип через ТипЗнч() или в запросе — через ВЫРАЗИТЬ(... КАК ...).

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

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

Самый быстрый способ — консоль запросов или отладчик. В отладчике поставьте точку останова на строке с условием и вычислите выражение Значение1 <> Значение2 через «Вычислить выражение»: сразу видно, какой результат даёт сравнение и какого типа операнды.

Для запросов проверяйте граничные случаи: запись с NULL в сравниваемом поле, запись с пустой ссылкой, запись со значением, равным отбору. Если в результате нет строк, которые должны быть, — почти всегда виноват NULL или несовпадение типов параметра и поля.

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

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

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

Типы сравниваемых значений
Норма

Оба операнда одного типа (ссылка со ссылкой, строка со строкой)

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

Сравнивается строка со ссылкой или число с датой — условие всегда Истина

Поля, участвующие в соединении
Норма

NULL обработан через ЕСТЬ NULL

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

В результате пропадают строки, где поле пустое

Результат отбора в отчёте
Норма

Исключённые значения отсутствуют, остальные присутствуют

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

Отчёт пустой или содержит исключаемое значение

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

Можно ли в 1С написать «не равно» как != ?

Нет. Встроенный язык и язык запросов 1С поддерживают только оператор <>. Запись != вызовет синтаксическую ошибку при проверке модуля.

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

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

Почему условие <> не исключает записи с пустым полем?

Скорее всего, в поле хранится NULL, а не пустое значение. NULL не равен ничему, включая сам себя, поэтому сравнение его не отбрасывает. Добавьте условие НЕ Поле ЕСТЬ NULL.

Как сравнить «не равно» для нескольких значений сразу?

В запросе — Поле НЕ В (&СписокЗначений), где параметр — массив или список. В СКД — вид сравнения «Не в списке». Это компактнее и быстрее цепочки условий через И.

Работает ли <> в условном оформлении формы?

Да. В настройках условного оформления формы добавляется отбор с видом сравнения «Не равно», после чего можно задать оформление (цвет, шрифт) для строк, где условие выполняется.

Чем отличается <> от логического НЕ с равенством?

По результату — ничем: НЕ (А = Б) эквивалентно А <> Б. Первый вариант иногда читается лучше в сложных составных условиях, но для простого сравнения принято писать <>.

Итог

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

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