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

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

Как в 1С сделать «не равно»: оператор <> и все способы сравнения

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

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

Конструкция выглядит одинаково в большинстве контекстов: Если Сумма <> 0 Тогда.. КонецЕсли;. Однако есть нюансы: сравнение с NULL в запросах работает иначе, в отборах СКД используется вид сравнения «Не равно», а при сравнении строк регистр и тип данных могут дать неожиданный результат.

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

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

Во встроенном языке 1С неравенство обозначается парой символов <>. Это единственный допустимый вариант: записи вроде != (как в C или JavaScript) или NE компилятор не примет и выдаст синтаксическую ошибку при проверке модуля.

Типовой пример в условном операторе:

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

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

КонецЕсли;

Тот же оператор работает в циклах, тернарных выражениях через ?(Условие, Значение1, Значение2) и в любых логических выражениях. Результат сравнения — булево значение, поэтому его можно присваивать переменной: ЕстьРасхождения = СуммаДокумента <> СуммаОплат;.

Число 0, строка «0» и пустая ссылка — разные значения, и выражение 0 <> "0" вернёт Истина. Если типы сравниваемых значений могут отличаться, сначала приведите их к одному типу или проверьте тип явно через ТипЗнч().

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

В языке запросов 1С используется тот же знак <> в секции ГДЕ. Это самый частый способ отфильтровать данные: исключить помеченные на удаление объекты, отобрать документы определённого вида и т.п.

ВЫБРАТЬ

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

Номенклатура.Наименование

ИЗ

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

ГДЕ

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

И Номенклатура.ЭтоГруппа <> ИСТИНА

Параметры в запросе сравниваются так же: ГДЕ Таблица.Организация <> &Организация. Перед выполнением запроса параметр устанавливается методом УстановитьПараметр() объекта Запрос.

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

Сравнение с NULL в запросе

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

Правильная конструкция — НЕ.. ЕСТЬ NULL:

ГДЕ

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

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

Типичные ошибки
01
Сравнение Поле <> NULL в запросе — условие никогда не выполняется, нужны IS NULL / IS NOT NULL
02
Сравнение значений разных типов (число со строкой) без приведения — результат непредсказуем
03
Проверка ПометкаУдаления <> Истина вместо НЕ ПометкаУдаления — работает, но хуже читается
04
Использование != по привычке из других языков — синтаксическая ошибка модуля

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

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

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

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

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

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

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

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

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

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

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

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

Отдельная задача — проверка «не равно пустому». В 1С «пустое» значение зависит от типа: пустая строка, ноль, пустая ссылка, дата 01.01.0001. Универсальная проверка в коде — функция ЗначениеЗаполнено(): она возвращает Истина, если значение отличается от пустого для своего типа.

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

// договор указан

КонецЕсли;

Для ссылочных типов есть метод Пустая(): Если НЕ Контрагент.Пустая() Тогда. Для строк — сравнение с пустой строкой Строка <> "", но учтите, что строка из одних пробелов таким сравнением не отсечётся; используйте СокрЛП(Строка) <> "".

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

Способы проверки «не пусто»

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

Универсально для любых типов в коде; не работает в запросах

НЕ Ссылка.Пустая()

Только ссылочные типы, читается явно; не подходит для примитивов

<> ЗНАЧЕНИЕ(..ПустаяСсылка) в запросе

Точное сравнение в запросе; требует указания конкретного типа

Вид сравнения «Не заполнено» в СКД

Для отборов без программирования; только в настройках компоновки

Проверка результата и отладка условий

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

Для запросов используйте консоль запросов (в типовых конфигурациях — внешняя обработка или встроенный инструмент разработчика): выполните запрос без условия, посмотрите значения поля, затем добавьте условие и сравните количество строк. Если строки «пропали» после добавления <>, почти наверняка в поле встречается NULL.

Признаки корректно работающего условия: отбор исключает ровно те записи, которые содержат заданное значение, пустые и NULL-значения обрабатываются осознанно (либо явно включены, либо исключены), а при изменении тестовых данных результат меняется предсказуемо.

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

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

Сравнение в коде
Норма

Условие срабатывает на контрольных значениях обеих сторон

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

Условие всегда Истина или всегда Ложь — проверьте типы значений

Условие <> в запросе
Норма

Исключены только строки с заданным значением

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

Пропали ещё и строки с NULL — добавьте ЕСТЬNULL или IS NOT NULL

Отбор в списке
Норма

В списке нет записей с исключённым значением

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

Отбор установлен, но список не меняется — проверьте флаг «Использование» и произвольный запрос списка

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

Можно ли написать != или NOT = вместо <>?

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

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

Чаще всего причина в NULL: если поле получено левым соединением, сравнение с <> отбрасывает такие строки. Замените поле на ЕСТЬNULL(Поле, ЗначениеПоУмолчанию) или добавьте явную обработку через ЕСТЬ NULL. Вторая причина — несовпадение типов параметра и поля.

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

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

Как сравнить строки без учёта регистра?

Приведите обе строки к одному регистру функцией НРег() или ВРег(): Если НРег(Строка1) <> НРег(Строка2) Тогда. В запросах сравнение строк при использовании ВЫРАЗИТЬ и сопоставлений зависит от настроек базы, поэтому надёжнее сравнивать приведённые значения.

Работает ли <> с датами?

Да, даты сравниваются тем же оператором. Учтите только, что дата в 1С хранится с точностью до секунды: документы в одну дату, но разное время считаются неравными. Для сравнения по дню используйте НАЧАЛОПЕРИОДА(Дата, ДЕНЬ) в запросе или НачалоДня() в коде.

Чем «Не равно» отличается от «Не заполнено» в отборе?

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

Итог

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

Неравенство в 1С везде записывается оператором <>: в коде, в запросах и в виде сравнения «Не равно» в отборах. Единственное исключение — NULL в запросах, для него нужны IS NULL / IS NOT NULL или ЕСТЬNULL. Перед сравнением проверяйте типы значений, а для проверки на пустоту используйте ЗначениеЗаполнено() или вид сравнения «Не заполнено».