Разработка и Конфигурация · 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.
«Не равно» в отборах динамических списков и СКД
Когда условие задаётся не в коде, а в настройках — в динамическом списке, отчёте на СКД или в отборе формы списка — оператор выбирается из списка видов сравнения. Для неравенства используется вид сравнения «Не равно».
В конфигураторе для динамического списка: откройте свойства реквизита формы, перейдите в «Настройка списка» → «Отбор», добавьте элемент, укажите поле, в колонке «Вид сравнения» выберите «Не равно», а справа задайте значение. Пользователь в режиме предприятия делает то же самое через кнопку «Настроить список» или «Ещё» → «Настроить список».
Программно отбор устанавливается через коллекцию ЭлементыОтбора настроек компоновки данных:
ЭлементОтбора = Список.КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПометкаУдаления");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно;
ЭлементОтбора.ПравоеЗначение = Истина;
ЭлементОтбора.Использование = Истина;
Помимо «Не равно» в СКД доступны родственные виды: «Не в списке», «Не содержит» (для подстрок), «Не начинается с», «Не заполнено». Для строковых полей «Не содержит» часто удобнее, чем точное неравенство, потому что работает по части значения.
- 1Откройте список и нажмите «Ещё» → «Настроить список» (или «Настроить список» в панели)
- 2На вкладке «Отбор» добавьте новое условие и выберите нужное поле
- 3В колонке вида сравнения выберите «Не равно»
- 4Укажите значение, которое нужно исключить, и нажмите «Завершить редактирование»
- 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. Перед сравнением проверяйте типы значений, а для проверки на пустоту используйте ЗначениеЗаполнено() или вид сравнения «Не заполнено».