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

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

Что такое тип сравнения в 1С и как его применять

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

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

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

Ниже разобраны основные типы сравнения, их отличия между языком запросов и компоновкой данных, практические примеры кода, а также типичные ошибки и способы проверить, что условие работает так, как задумано.

Где в 1С используется тип сравнения

Механизм сравнения встроен в платформу на нескольких уровнях, и в каждом он оформлен по-разному. В языке запросов условия записываются текстом: ГДЕ Номенклатура.Код = &Код. Здесь тип сравнения — это сам оператор между левой и правой частью выражения.

В динамических списках и отчётах на СКД условие отбора описывается объектно: задаётся левое значение (поле), вид сравнения и правое значение. В конфигураторе это видно в настройках отбора, программно — через коллекцию ЭлементыОтбора и перечисление ВидСравненияКомпоновкиДанных.

Отдельно сравнение встречается в обычных условных операторах встроенного языка (Если А = Б Тогда) и в методах поиска, например НайтиПоКоду или НайтиПоНаименованию, где точное или частичное совпадение задаётся параметрами. Логика везде одна, но синтаксис разный, и смешение этих синтаксисов — частый источник ошибок.

Основные виды сравнения в языке запросов

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

Для строк предназначен оператор ПОДОБНО с шаблоном, где символ % заменяет любую последовательность символов, а _ — один символ. Например, ГДЕ Наименование ПОДОБНО "%кабель%" найдёт все позиции, где слово встречается в любом месте строки. Учтите, что поиск по ПОДОБНО с шаблоном, начинающимся с %, не использует индекс и на больших таблицах работает медленно.

Для проверки вхождения в набор значений служит оператор В: ГДЕ Склад В (&СписокСкладов), где параметром передаётся массив или список значений. Вариант В ИЕРАРХИИ проверяет принадлежность элемента группе справочника с учётом всех вложенных уровней — это стандартный способ отобрать, например, всю номенклатуру из группы «Материалы» включая подгруппы.

Проверка на NULL и сложные условия

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

Виды сравнения в отборах динамических списков и СКД

В компоновке данных набор видов сравнения шире и представлен перечислением ВидСравненияКомпоновкиДанных. Помимо привычных Равно, НеРавно, Больше, Меньше, здесь есть специализированные варианты: Содержит, НеСодержит, НачинаетсяС, ВСписке, НеВСписке, ВИерархии, ВСпискеПоИерархии, Заполнено, НеЗаполнено, а также интервальные варианты БольшеИлиРавно и МеньшеИлиРавно.

Вид «Содержит» соответствует оператору ПОДОБНО с шаблоном «%строка%», «НачинаетсяС» — шаблону «строка%». Виды «Заполнено» и «НеЗаполнено» проверяют, задано ли значение: для строки это непустая строка, для ссылки — не пустая ссылка, для числа — отличие от нуля. Это удобнее, чем вручную перечислять все «пустые» варианты для разных типов.

Ниже пример программной установки отбора в динамическом списке формы:

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

Тип("ЭлементОтбораКомпоновкиДанных"));

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

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

ЭлементОтбора.ПравоеЗначение = СписокОрганизаций;

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

Если правое значение задать типом, не соответствующим виду сравнения (например, для ВСписке передать одиночное значение вместо списка), отбор либо не сработает, либо отфильтрует всё. Поэтому после установки отбора всегда проверяйте результат на тестовых данных с заранее известным составом.

Как выбрать подходящий тип сравнения

Выбор зависит от задачи и типа данных поля. Для точного совпадения по ссылке, коду или дате используйте равенство — это самый быстрый и предсказуемый вариант, особенно по индексированным полям. Для поиска по фрагменту наименования — Содержит или ПОДОБНО, но помните о нагрузке на больших таблицах.

Для отбора по нескольким значениям всегда предпочитайте В / ВСписке вместо цепочки условий через ИЛИ: запрос короче, а платформа оптимизирует его эффективнее. Для иерархических данных — групп товаров, статей затрат, подразделений — используйте В ИЕРАРХИИ, иначе придётся вручную перечислять все вложенные группы и поддерживать этот список при изменении структуры справочника.

Маршрут решения

Как выбрать действие

Нужно найти записи по точному значению ссылки, кода или датыИспользуйте Равно (=) — самый быстрый вариант по индексированным полям
Нужно найти строку по фрагменту текстаИспользуйте Содержит / ПОДОБНО с шаблоном %текст%
Нужно отобрать по нескольким значениямИспользуйте В / ВСписке с массивом или списком значений
Нужно включить элементы группы справочника со всеми подгруппамиИспользуйте В ИЕРАРХИИ / ВИерархии
Нужно найти записи без связанных данных после левого соединенияИспользуйте условие Поле ЕСТЬ NULL

Пошаговая настройка отбора с типом сравнения

Типовая задача — добавить в форму списка отбор, который пользователь не может снять, или который устанавливается программно при открытии. Порядок действий одинаков для большинства управляемых форм.

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

После установки отбора полезно временно вывести текст итогового запроса или открыть список и вручную посчитать, сколько записей должно попасть в выборку. Если фактическое число не совпадает с ожидаемым — проблема почти всегда в виде сравнения или в типе правого значения.

Типичные ошибки при работе с типами сравнения

Самая распространённая ошибка — сравнение значений разных типов. Например, сравнение строкового кода с числом или ссылки с её строковым представлением. В запросе такое условие обычно не вызывает ошибки, но и не находит ничего. Всегда приводите параметр к типу поля: &Параметр = "000001" для строкового кода, а не число 1.

Вторая группа ошибок связана со специальными значениями: NULL, пустые ссылки, неопределено. Условие Поле = Значение(Справочник.Номенклатура.ПустаяСсылка) корректно, а вот попытка сравнить поле составного типа с «пустотой» через равенство часто даёт неожиданный результат — надёжнее использовать вид сравнения Заполнено/НеЗаполнено в СКД или явную проверку в запросе.

Типичные ошибки
01
Сравнение с NULL через равенство — условие никогда не выполняется, нужна конструкция ЕСТЬ NULL
02
Передача одиночного значения вместо списка для ВСписке — отбор молча не работает
03
Поиск через ПОДОБНО с шаблоном %текст% на большой таблице — полное сканирование и замедление работы
04
Сравнение строки с числом или ссылки со строкой — пустой результат без сообщения об ошибке
05
Использование ВИерархии для неиерархического справочника — отбор не имеет смысла и вводит в заблуждение

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

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

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

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

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

Состав выборки на контрольных данных
Норма

В результат попали ровно те записи, которые ожидались

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

Записей больше, меньше или нет вовсе — проверяйте вид сравнения и типы значений

Поведение на пустых значениях
Норма

Пустые и NULL-значения обрабатываются осознанно (ЕСТЬ NULL, Заполнено)

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

Записи с пустыми полями пропадают или появляются неожиданно

Скорость выполнения на реальном объёме данных
Норма

Запрос выполняется быстро, используются индексы

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

Заметная задержка — вероятно, ПОДОБНО с ведущим % или сравнение по неиндексированному полю

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

Чем отличается В от В ИЕРАРХИИ в запросе 1С?

Оператор В проверяет точное вхождение значения в переданный список. В ИЕРАРХИИ проверяет, принадлежит ли элемент указанной группе иерархического справочника на любом уровне вложенности, включая все подгруппы. Для плоских списков и неиерархических данных применим только обычный В.

Почему отбор с видом сравнения Содержит ничего не находит?

Чаще всего причина в регистре или лишних пробелах в строке поиска, а также в том, что искомый фрагмент реально отсутствует в данных. Проверьте несколько заведомо существующих значений. Также убедитесь, что отбор применён к тому полю, где хранится искомый текст, а не, например, к представлению ссылки.

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

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

Можно ли сравнивать даты без учёта времени?

Да. В запросе применяйте функции НАЧАЛОПЕРИОДА и КОНЕЦПЕРИОДА, чтобы привести дату к границам дня, либо задавайте интервал условиями БольшеИлиРавно началу дня и Меньше начала следующего дня. Прямое равенство дат с разным временем не выполнится.

Что быстрее: несколько условий через ИЛИ или один оператор В?

Оператор В со списком значений предпочтительнее: запрос короче, читабельнее и, как правило, эффективнее оптимизируется платформой. Цепочки ИЛИ с равенствами стоит заменять на В всегда, когда сравнивается одно и то же поле.

Как программно узнать, какой вид сравнения установлен в отборе?

Обратитесь к элементу отбора в настройках компоновки и прочитайте свойство ВидСравнения — оно вернёт значение перечисления ВидСравненияКомпоновкиДанных. Перебрать все элементы можно циклом по коллекции Отбор.Элементы с проверкой свойства Использование.

Итог

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

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