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

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

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

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

Во встроенном языке 1С оператор «не равно» записывается как <> — именно так, угловыми скобками, а не привычным знаком «≠» или комбинацией «!=» из других языков. Начинающие разработчики чаще всего ошибаются именно здесь: пытаются написать != или >< и получают синтаксическую ошибку при проверке модуля.

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

Ниже разобраны все практические сценарии: оператор в коде, условие в запросе, отбор в динамическом списке и СКД, сравнение с NULL и пустыми значениями, а также типичные ошибки, которые приводят к неверным результатам даже без сообщений об ошибках.

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

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

Если Документ.Проведен <> Истина Тогда

Сообщить("Документ не проведен");

КонецЕсли;

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

Частый приём — проверка, что реквизит заполнен, то есть не равен пустому значению. Для этого сравнивают с пустой ссылкой или пустой строкой:

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

// контрагент указан

КонецЕсли;

Альтернатива оператору — функция ЗначениеЗаполнено(), которая универсально проверяет заполненность для любых типов. Во многих случаях она читается лучше, чем цепочка сравнений с пустыми значениями разных типов.

Условие «не равно» в запросах 1С

В языке запросов используется тот же знак <>. Условие добавляют в секцию ГДЕ, чтобы отобрать только нужные записи:

ВЫБРАТЬ

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

ИЗ

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

ГДЕ

Номенклатура.ПометкаУдаления <> ИСТИНА

И Номенклатура.ВидНоменклатуры <> &ИсключаемыйВид

Такой запрос вернёт все элементы, кроме помеченных на удаление и исключённого вида номенклатуры. Обратите внимание: булево значение в запросе пишется как ИСТИНА/ЛОЖЬ, а параметры передаются через амперсанд — &ИмяПараметра.

Для исключения группы значений удобнее использовать конструкцию «НЕ В» вместо цепочки условий «не равно»: ГДЕ НЕ Статус В (&СписокСтатусов). Это короче и быстрее читается, когда исключаемых значений три и больше.

Со строками есть нюанс: сравнение <> учитывает полное совпадение строки, включая пробельные символы в конце, если тип строки фиксированной длины. Если нужно исключить записи по части строки, используйте НЕ ПОДОБНО с шаблоном.

bsl
Если Заказ.Статус <> Перечисления.СтатусыЗаказов.Отменен Тогда
    ОбработатьЗаказ(Заказ);
КонецЕсли;

Сравнение с NULL и пустыми значениями

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

Правильный способ проверить «не равно NULL» — специальная конструкция:

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

Если нужно заменить NULL на конкретное значение и потом сравнивать, применяйте функцию ЕСТЬNULL: ГДЕ ЕСТЬNULL(Остатки.Количество, 0) <> 0. Это одновременно убирает NULL и задаёт корректное условие.

Отдельно стоит различать пустую строку, пустую ссылку, пустую дату (01.01.0001) и NULL — это четыре разных «пустых» состояния. Условие «не равно пустой ссылке» не отфильтрует NULL, и наоборот. Перед написанием условия проверьте, какие именно значения реально встречаются в поле.

«Не равно» в отборах динамических списков и СКД

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

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

Программно отбор «не равно» в динамическом списке устанавливается через коллекцию отборов компоновки данных:

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

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

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

ЭлементОтбора.ПравоеЗначение = Истина;

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

Аналогично работают виды сравнения НеВСписке, НеСодержит, НеПодобно — они покрывают почти все сценарии исключения данных без изменения текста запроса.

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

Типичные ошибки и как их избежать

Самая распространённая ошибка — написать != по привычке из других языков. В 1С такого оператора нет, и конфигуратор выдаст синтаксическую ошибку при проверке модуля. Вторая по частоте — перепутать порядок скобок и написать >< вместо <>.

Менее очевидная проблема — сравнение значений разных типов. Например, условие НомерДокумента <> "00125" может вести себя неожиданно, если номер хранится как число или строка другой длины. Перед сравнением приведите значения к одному типу или проверьте тип через ТипЗнч().

Ещё одна ловушка — сравнение строк без учёта регистра. В коде "Акт" <> "акт" вернёт Истина, то есть строки считаются разными. Если регистр не важен, приводите обе строки к одному регистру функцией НРег() или ВРег() перед сравнением.

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

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

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

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

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

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

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

Количество записей до и после условия
Норма

Убрались только целевые записи

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

Пропали лишние строки — вероятен NULL в поле

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

Оба значения одного типа

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

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

Результат условия в отладчике
Норма

Условие принимает ожидаемое Истина/Ложь

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

Условие всегда Истина или всегда Ложь

FAQ

Как написать «не равно» в 1С — <> или !=?

Только <></> — то есть угловые скобки <>. Оператор != в 1С не существует и вызовет синтаксическую ошибку.

Почему условие «не равно» в запросе убирает часть записей?

Скорее всего, в проверяемом поле есть значения NULL, например из левого соединения. Сравнение с NULL не даёт Истину, поэтому такие строки отбрасываются. Оберните поле в ЕСТЬNULL или добавьте условие «ИЛИ Поле ЕСТЬ NULL».

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

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

Как проверить, что реквизит не заполнен?

Надёжнее всего функция НЕ ЗначениеЗаполнено(Реквизит) — она корректно обрабатывает пустые ссылки, пустые строки, нулевые даты и неопределённость. Прямое сравнение с пустой ссылкой сработает только для ссылочного типа.

Учитывается ли регистр при сравнении строк через <>?

Да, учитывается: «Акт» и «акт» считаются разными строками. Чтобы сравнить без учёта регистра, приведите обе строки к одному регистру функцией НРег() или ВРег().

Можно ли поставить «не равно» без программирования?

Да. В любой форме списка через «Ещё → Настроить список» добавьте отбор с видом сравнения «Не равно», а в отчётах — на закладке «Отбор» в настройках. Код не требуется.

Итог

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

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