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

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

Оператор ПОДОБНО в запросах 1С: поиск по шаблону с примерами

Как работает оператор ПОДОБНО в запросах 1С: синтаксис, спецсимволы % и _, экранирование, регистр, производительность и типичные ошибки с примерами кода.

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

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

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

Синтаксис оператора ПОДОБНО

Базовая конструкция выглядит так: Поле ПОДОБНО "шаблон". Оператор возвращает ИСТИНА, если значение поля соответствует шаблону, и ЛОЖЬ в противном случае. Шаблон может быть строковым литералом или параметром запроса — второй вариант предпочтительнее, так как позволяет переиспользовать запрос и защищает от ошибок с кавычками.

Оператор можно инвертировать: НЕ Поле ПОДОБНО "шаблон" отберёт строки, которые шаблону не соответствуют. Это удобно для исключения «служебных» элементов, например папок с префиксом «Архив» или тестовых контрагентов.

bsl
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Контрагенты.Ссылка КАК Ссылка,
| Контрагенты.Наименование КАК Наименование
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.Наименование ПОДОБНО &Шаблон";
Запрос.УстановитьПараметр("Шаблон", "%" + СтрокаПоиска + "%");
Результат = Запрос.Выполнить().Выгрузить();

Обратите внимание: шаблон с символами % формируется в коде и передаётся как параметр. Так запрос остаётся статическим, его текст не меняется между вызовами, что положительно сказывается на кэшировании плана запроса.

Спецсимволы шаблона: %, _ и квадратные скобки

Язык запросов 1С поддерживает несколько служебных символов внутри шаблона. Знание их поведения — ключ к корректным условиям.

  • % — любая последовательность символов любой длины, включая пустую. Шаблон "%склад%" найдёт «Основной склад», «складской учёт» и «склад».
  • _ (подчёркивание) — ровно один произвольный символ. Шаблон "АБ_12" совпадёт с «АБВ12», но не с «АБ12» и не с «АБВГ12».
  • [...] — один символ из перечисленных в скобках, например "[АБВ]%" — строки, начинающиеся с А, Б или В.
  • [^...] — один символ, отсутствующий в перечислении.
  • [а-я] — диапазон символов.

Комбинируя эти символы, можно строить довольно точные маски. Например, поиск номеров вида «00-0001» (две цифры, дефис, четыре цифры) реализуется шаблоном "[0-9][0-9]-[0-9][0-9][0-9][0-9]". Это надёжнее, чем простое "%-%", которое пропустит и «АБ-ВГ».

Экранирование служебных символов через СПЕЦСИМВОЛ

Проблема возникает, когда искомый текст сам содержит %, _ или квадратные скобки. Например, нужно найти товары с наименованием «Скидка 10%». Если написать ПОДОБНО "%Скидка 10%%", оператор воспримет внутренний % как служебный и найдёт лишнее или не найдёт ничего.

Решение — конструкция СПЕЦСИМВОЛ. Она указывает символ, который отменяет специальное значение следующего за ним знака. Традиционно используют обратную косую черту или тильду.

bsl
// Поиск строки, содержащей буквальный символ %
|ГДЕ
| Наименование ПОДОБНО "%Скидка 10~%%" СПЕЦСИМВОЛ "~"

// Поиск строки, содержащей подчёркивание
|ГДЕ
| Код ПОДОБНО "%~_%" СПЕЦСИМВОЛ "~"

Если строка поиска вводится пользователем, экранирование нужно выполнять программно перед передачей в параметр: заменить в ней тильду на двойную, затем % на ~% и _ на ~_. Без этого ввод «50_000» будет интерпретирован как шаблон и вернёт неожиданные результаты.

Безопасная подготовка строки поиска
  1. 1
    Выберите экранирующий символ, например ~, и зафиксируйте его в конструкции СПЕЦСИМВОЛ
  2. 2
    В строке пользователя замените ~ на ~~
  3. 3
    Замените % на ~%, а _ на ~_
  4. 4
    Обрамите результат символами % по краям, если нужен поиск подстроки
  5. 5
    Передайте итог в параметр запроса и выполните запрос

Регистр символов и сравнение строк

Чувствительность ПОДОБНО к регистру зависит от настроек СУБД, а не от самой 1С. На Microsoft SQL Server с типичной для 1С collation (кириллическая, нечувствительная к регистру) шаблон "%стол%" найдёт и «Стол», и «СТОЛ», и «сТоЛ». На PostgreSQL поведение может отличаться — там сравнение чаще регистрозависимое, и это регулярно становится причиной «исчезнувших» результатов после миграции базы.

Если требуется гарантированно нечувствительный к регистру поиск независимо от СУБД, применяйте функцию ВРЕГ или НРЕГ к обеим сторонам: ГДЕ ВРЕГ(Наименование) ПОДОБНО ВРЕГ(&Шаблон). Учтите, что оборачивание поля в функцию отключает использование индекса по этому полю.

Производительность: когда ПОДОБНО тормозит

Главный фактор скорости — позиция символа % в шаблоне. Шаблон вида "АБВ%" (префиксный поиск) позволяет СУБД использовать индекс по полю и выполняется быстро даже на миллионах записей. Шаблон "%АБВ%" (поиск подстроки в любом месте) заставляет сервер просматривать каждую строку таблицы — полное сканирование.

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

Способы поиска по части строки

ПОДОБНО с шаблоном "текст%"

Быстро за счёт индекса, но ищет только по началу строки

ПОДОБНО с шаблоном "%текст%"

Ищет вхождение в любом месте, но сканирует всю таблицу; приемлемо на небольших справочниках

Полнотекстовый поиск

Оптимален для поиска подстрок и слов на больших объёмах; требует включения и обновления индекса

Перебор в цикле на встроенном языке

Не использовать: данные целиком гоняются на клиент, самый медленный вариант

Дополнительный приём — отказ от ВЫБРАТЬ ПЕРВЫЕ без необходимости и, наоборот, добавление ПЕРВЫЕ N в автоподборе: пользователю достаточно 10–20 подсказок, и ограничение выборки заметно разгружает сервер при медленном шаблоне.

Практические сценарии использования

Автоподбор в поле ввода

В событии автоподбора формируется запрос к справочнику с условием Наименование ПОДОБНО &Шаблон и ограничением ПЕРВЫЕ 10. Экранирование спецсимволов обязательно — пользователь может ввести % или _ осознанно.

Отбор документов по префиксу номера

Номера документов в 1С — строки, поэтому ПОДОБНО работает и с ними: ГДЕ Номер ПОДОБНО "ПР/%" выберет документы с префиксом ПР. Помните, что номер хранится с лидирующими нулями, и префикс может стоять не в самом начале — проверьте фактический формат в своей базе.

Поиск дублей в справочнике

ПОДОБНО помогает найти потенциальные дубли: отобрать элементы, где наименование содержит ключевое слово, и сгруппировать результат. Для более точного поиска дублей лучше нормализовать строки (убрать пробелы, привести регистр) и сравнивать на равенство.

Проверка формата данных

С помощью скобочных шаблонов можно валидировать значения: например, найти артикулы, не соответствующие маске, условием НЕ Артикул ПОДОБНО "[0-9][0-9][0-9][0-9][0-9][0-9]". Это быстрый способ выявить «грязные» данные перед обменом или отчётностью.

Типичные ошибки и ограничения

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

Отдельно стоит упомянуть ограничение на длину: ПОДОБНО корректно работает со строками ограниченной длины. Для строк неограниченной длины (например, реквизиты типа Строка(0)) поведение зависит от СУБД, и надеяться на такой поиск не стоит — переносите поисковые поля в строки фиксированной длины.

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

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

Количество найденных строк
Норма

Результат содержит ожидаемые тестовые записи, включая граничные случаи

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

Записей нет вообще или найдены явно лишние — проверяйте шаблон и экранирование

Время выполнения
Норма

Запрос отрабатывает за доли секунды на реальном объёме данных

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

Запрос выполняется секундами — вероятно полное сканирование, пересмотрите шаблон

Поведение при спецсимволах
Норма

Ввод % или _ в строку поиска ищет их буквально

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

Ввод % возвращает всю таблицу — экранирование отсутствует

Альтернативы оператору ПОДОБНО

ПОДОБНО — не единственный способ фильтрации строк в запросах 1С. Функция ПОДСТРОКА в сочетании с равенством заменяет префиксный поиск: ПОДСТРОКА(Наименование, 1, 3) = "АБВ". Однако такой вариант не использует индекс и обычно медленнее, чем ПОДОБНО "АБВ%", поэтому применять его имеет смысл лишь в особых случаях.

Для поиска по нескольким словам одновременно («стол» и «круглый» в любом порядке) ПОДОБНО неудобен — придётся строить цепочку условий И. Здесь выигрывает полнотекстовый поиск, который изначально рассчитан на словесные запросы, морфологию и ранжирование результатов.

Итог

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

ПОДОБНО сравнивает строку с шаблоном: % — любая последовательность, _ — один символ. Шаблон "текст%" использует индекс, "%текст%" — нет. Пользовательский ввод всегда экранируйте через СПЕЦСИМВОЛ, поведение по регистру проверяйте на своей СУБД, а для полноценного поиска по подстроке на больших данных используйте полнотекстовый поиск.

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

Чем ПОДОБНО отличается от обычного равенства в запросе?

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

Можно ли использовать ПОДОБНО с параметром-списком?

Нет, ПОДОБНО принимает один шаблон. Если нужно проверить соответствие нескольким шаблонам, объединяйте условия через ИЛИ: Поле ПОДОБНО &Шаблон1 ИЛИ Поле ПОДОБНО &Шаблон2.

Почему запрос с ПОДОБНО не находит запись, которая точно есть?

Частые причины: регистрозависимое сравнение на PostgreSQL, неэкранированные % или _ в строке поиска, значение поля равно NULL, либо в данных есть непечатаемые символы или лишние пробелы. Проверьте поле функциями ВРЕГ и СОКРЛП.

Работает ли ПОДОБНО в динамических списках форм?

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

Как искать сразу по наименованию и коду?

Объедините условия через ИЛИ: Наименование ПОДОБНО &Шаблон ИЛИ Код ПОДОБНО &Шаблон. Учтите, что такое условие почти наверняка отключит индексный поиск, поэтому на больших таблицах добавляйте ПЕРВЫЕ.

Есть ли в 1С аналог ПОДОБНО для регулярных выражений?

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