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