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