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