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

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

Что значит «равно» в 1С и как правильно использовать сравнение

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

Знак «равно» в 1С встречается везде: во встроенном языке, в конструкторе запросов, в отборах динамических списков и в настройках отчётов СКД. При этом новичков часто смущает, что в 1С один и тот же символ «=» используется и для присваивания значения переменной, и для сравнения двух значений — в отличие от языков вроде C++ или JavaScript, где для сравнения применяется двойное «==».

Понимание того, как именно платформа 1С выполняет сравнение, критично для корректной работы кода: неправильное сравнение дат, строк с лишними пробелами или ссылок разных типов приводит к тому, что условие «не срабатывает», документы не отбираются, а отчёты показывают пустой результат. При этом никакой ошибки система не выдаёт — код просто молча идёт по другой ветке.

Ниже разобраны все основные контексты, где встречается «равно» в 1С: встроенный язык, язык запросов, отборы и СКД, а также особенности сравнения разных типов данных и типичные ошибки, которые допускают даже опытные разработчики.

Где в 1С встречается знак «равно»

Оператор «=» в 1С имеет двойное назначение, и платформа различает его по контексту. В строке Количество = 10; происходит присваивание: переменной Количество записывается значение 10. В выражении Если Количество = 10 Тогда тот же символ означает сравнение: проверяется, равно ли текущее значение переменной числу 10, и результатом будет Истина или Ложь.

Кроме встроенного языка, «равно» активно используется в языке запросов 1С — в условиях ГДЕ (WHERE), в соединениях таблиц и в параметрах виртуальных таблиц. Третий контекст — отборы: динамические списки, отчёты на СКД, отборы в формах списков. Там «равно» задаётся пользователем или программно как вид сравнения элемента отбора.

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

Равно во встроенном языке: присваивание и сравнение

В модуле формы, общем модуле или модуле объекта сравнение чаще всего встречается внутри условного оператора. Типичный пример: Если Документ.Проведен = Истина Тогда — здесь проверяется, проведён ли документ. Обратите внимание, что писать = Истина избыточно: условие Если Документ.Проведен Тогда работает так же и считается хорошим стилем.

Для проверки неравенства используется оператор «<>». Например: Если Статус <> Перечисления.СтатусыЗаказов.Закрыт Тогда. Сравнение можно комбинировать логическими операторами И, ИЛИ, НЕ: Если Сумма = 0 И Количество = 0 Тогда.

Результат сравнения можно сохранить в переменную: ЭтоНашСклад = (Склад = ОсновнойСклад); — переменная получит значение Истина или Ложь. Скобки здесь нужны для читаемости, платформа и без них корректно определит приоритет операций, но с ними код проще поддерживать.

Сравнение ссылок и значений

Ссылки на объекты (документы, справочники) сравниваются по уникальному идентификатору: две ссылки равны, если указывают на один и тот же объект базы данных. Пустая ссылка проверяется либо сравнением с конструктором пустой ссылки, либо функцией ЗначениеЗаполнено(Ссылка) или методом Ссылка.Пустая(). Сравнение ссылки со строкой или числом всегда даст Ложь — типы разные.

Равно в запросах 1С

В языке запросов условие равенства записывается в секции ГДЕ: ГДЕ Номенклатура.Вид = &ВидНоменклатуры. Здесь амперсанд обозначает параметр запроса, который передаётся через Запрос.УстановитьПараметр("ВидНоменклатуры", Значение) до выполнения запроса.

Ключевая особенность запросов: сравнение выполняется на стороне СУБД, и типы должны совпадать строго. Если поле имеет составной тип (например, строка или ссылка), а параметр — ссылка конкретного вида, соединения и условия могут работать медленнее или давать неожиданный результат. Для составных типов полезно приводить значение через ВЫРАЗИТЬ.

Для сравнения с пустой ссылкой в запросе используется ЗНАЧЕНИЕ: ГДЕ Документ.Контрагент = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка). Для проверки на NULL (который появляется при левых соединениях) обычное «=» не работает — NULL не равен ничему, даже самому себе. Используйте ЕСТЬ NULL или функцию ЕСТЬNULL().

Особенности сравнения разных типов данных

Строки в 1С сравниваются посимвольно с учётом регистра в запросах (поведение зависит от настроек СУБД) и без учёта регистра в некоторых контекстах встроенного языка. Главная ловушка — пробелы: строка «Контрагент » с пробелом в конце не равна строке «Контрагент». Перед сравнением применяйте СокрЛП(), а в запросах — УБРАТЬ аналогично нельзя, поэтому данные лучше очищать при записи.

Даты сравниваются с точностью до секунды. Если вы сравниваете дату документа с датой без времени, условие Дата = '20260115' не сработает для документа, созданного в 14:30. Для отбора за день используйте диапазон: Дата МЕЖДУ &НачалоДня И &КонецДня или сравнение с началом и концом дня через функции НачалоДня() и КонецДня() в коде.

Числа сравниваются по значению, но осторожность нужна при вычислениях с дробными числами: результат деления может содержать хвост в младших разрядах, и прямое сравнение на равенство даст Ложь. Надёжнее сравнивать модуль разности с малым порогом или округлять перед сравнением.

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

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

Условие в коде срабатывает
Норма

Отладчик показывает Истина, типы обеих сторон совпадают

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

Условие Ложь, хотя значения «на глаз» одинаковые — проверьте типы и пробелы

Запрос возвращает строки
Норма

В консоли запросов с теми же параметрами данные отбираются

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

Пустой результат — проверьте NULL в соединениях и точность даты

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

Список фильтруется по выбранному значению

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

Фильтр установлен, но список пуст — проверьте вид сравнения и значение отбора

Равно в отборах и СКД

В динамических списках и отчётах на СКД «равно» — один из видов сравнения элемента отбора. Программно отбор устанавливается так: создаётся элемент отбора, ему присваивается ВидСравненияКомпоновкиДанных.Равно, правое значение и признак использования. Если забыть установить Использование = Истина, отбор будет создан, но не применится — частая причина «не работающего» фильтра.

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

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

Как установить отбор «равно» программно
  1. 1
    Получите коллекцию отборов: Отборы = Список.КомпоновщикНастроек.Настройки.Отбор
  2. 2
    Добавьте элемент: ЭлементОтбора = Отборы.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"))
  3. 3
    Укажите поле: ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Склад")
  4. 4
    Задайте вид сравнения: ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно
  5. 5
    Установите значение и включите отбор: ПравоеЗначение = Склад; Использование = Истина
  6. 6
    Проверьте результат: список должен показать только строки с выбранным складом

Альтернативы простому «равно»

Не всегда «равно» — оптимальный способ отбора. Когда нужно сравнить значение с несколькими вариантами, в запросе эффективнее оператор В: ГДЕ Статус В (&СписокСтатусов), где параметром передаётся массив или список значений. Это короче и быстрее, чем цепочка условий через ИЛИ.

Для строкового поиска по части значения используйте ПОДОБНО с шаблоном: ГДЕ Наименование ПОДОБНО \"%кабель%\". Для иерархических справочников — В ИЕРАРХИИ. Для проверки значения в результате другого запроса — В с подзапросом. Каждый из этих операторов решает задачу, которую простое «равно» решить не может.

Какой оператор выбрать вместо «равно»

= (равно)

Точное совпадение одного значения: ссылка, число, флаг. Не работает с NULL и списками значений

В (список)

Значение совпадает с любым элементом списка или результатом подзапроса. Подходит для отбора по нескольким контрагентам или статусам

ПОДОБНО

Поиск по шаблону в строках с символами % и _. Медленнее равно, не использует индекс при шаблоне, начинающемся с %

В ИЕРАРХИИ

Отбор элемента и всех его подчинённых в иерархическом справочнике. Обычное «равно» дочерние элементы не захватывает

Типичные ошибки при использовании «равно»

Самая распространённая ошибка — сравнение значений разных типов. Например, сравнение реквизита-ссылки со строкой наименования: условие всегда ложно, но платформа не сообщает об ошибке. Вторая по частоте — сравнение с NULL в запросах после левого соединения: правильная конструкция — ЕСТЬ NULL или ЕСТЬNULL(Поле, ЗначениеПоУмолчанию).

Третья группа ошибок связана с датами и строками: сравнение даты со временем с датой без времени, лишние пробелы в строках, различие регистра. Четвёртая — забытое свойство Использование у элемента отбора СКД: отбор создан, но не применён, и список показывает все данные без какого-либо предупреждения.

Типичные ошибки
01
Сравнение ссылки со строкой или числом — условие молча возвращает Ложь, отладка занимает часы
02
Сравнение с NULL через «=» в запросе — NULL не равен ничему, нужен ЕСТЬ NULL или ЕСТЬNULL
03
Сравнение дат без учёта времени — документ за день не попадает в условие «Дата = &Дата»
04
Не установлено Использование = Истина у элемента отбора — фильтр не применяется
05
Сравнение строк с неочищенными пробелами — используйте СокрЛП перед сравнением

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

Для кода во встроенном языке основной инструмент — отладчик: поставьте точку останова на строке с условием и посмотрите значения и типы обеих сторон сравнения. Быстрая альтернатива — вывод через Сообщить() с указанием типа: Сообщить(ТипЗнч(Значение));.

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

Итог

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

«Равно» в 1С — одновременно оператор присваивания и сравнения, контекст определяет смысл. Сравнение всегда учитывает тип значения: ссылка не равна строке, NULL не равен ничему, даты сравниваются с точностью до секунды. Для списков, иерархий и строковых шаблонов используйте В, В ИЕРАРХИИ и ПОДОБНО вместо цепочек равенств.

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

Почему в 1С нет двойного «==» для сравнения?

Встроенный язык 1С исторически использует один символ «=» для обеих операций, а компилятор различает их по положению в выражении. В операторе присваивания «=» означает запись значения, внутри условий и выражений — сравнение. Отдельный оператор «==» не нужен и не поддерживается.

Как сравнить значение с NULL в запросе?

Оператор «=» с NULL не работает: выражение «Поле = NULL» всегда даёт неопределённый результат, а не Истину. Используйте конструкцию «Поле ЕСТЬ NULL» для проверки или функцию ЕСТЬNULL(Поле, ЗначениеЗамены), чтобы подставить значение по умолчанию и сравнивать уже его.

Учитывается ли регистр букв при сравнении строк?

Зависит от контекста и настроек базы данных. В запросах на большинстве СУБД сравнение строк нечувствительно к регистру при стандартных настройках, но чувствительно к пробелам и спецсимволам. Если нужен точный контроль, нормализуйте строки при записи и очищайте их функцией СокрЛП перед сравнением в коде.

Как проверить, что ссылка пустая?

Три рабочих способа: сравнение с пустой ссылкой нужного типа, метод Ссылка.Пустая() или универсальная функция ЗначениеЗаполнено(Ссылка), которая возвращает Ложь для пустых ссылок, пустых строк, нулей и незаполненных дат. В запросе используйте ЗНАЧЕНИЕ(Справочник.ИмяСправочника.ПустаяСсылка).

Почему отбор «равно» в динамическом списке не фильтрует данные?

Чаще всего не установлено свойство Использование у элемента отбора — программно созданный отбор по умолчанию выключен. Реже причина в неверном имени поля (поле отсутствует в запросе списка) или в том, что отбор добавлен не в тот компоновщик настроек. Проверьте структуру настроек списка в отладчике.

Чем отличается «=» от «В» для одного значения?

По результату для одного значения разницы нет — оба отберут точное совпадение. Различие в масштабируемости: «В» позволяет передать массив или подзапрос и отобрать по множеству значений одним условием, тогда как для «=» пришлось бы строить цепочку через ИЛИ. Для одиночного сравнения «=» читается нагляднее.