Разработка и Конфигурация · 11 мин
Оператор ПОДОБНО в запросах 1С: поиск по шаблону с примерами
Как работает оператор ПОДОБНО в запросах 1С: синтаксис, спецсимволы % и _, экранирование, регистр, производительность и типичные ошибки с примерами кода.
Оператор ПОДОБНО (в английском синтаксисе — LIKE) применяется в языке запросов 1С для сравнения строкового значения с шаблоном. Он незаменим, когда нужно найти элементы справочника по части наименования, отобрать документы по фрагменту номера или проверить текст на соответствие маске. В отличие от точного равенства, ПОДОБНО позволяет задавать гибкие правила совпадения через специальные символы.
Типичный сценарий — автоподбор в поле ввода: пользователь набирает несколько букв, а запрос возвращает контрагентов, чьё наименование содержит эту подстроку. Другой частый случай — поиск документов, где номер начинается с определённого префикса. В обоих случаях без ПОДОБНО пришлось бы перебирать данные в цикле, что на больших таблицах недопустимо медленно.
Оператор работает только со строковыми типами данных. Если попытаться применить его к числу, дате или ссылке, запрос завершится с ошибкой. Поэтому перед использованием важно понимать тип поля и при необходимости приводить значения к строке. Ниже разобраны синтаксис, шаблоны, экранирование, влияние на производительность и практические сценарии.
Синтаксис оператора ПОДОБНО
Базовая конструкция выглядит так: Поле ПОДОБНО "шаблон". Оператор возвращает ИСТИНА, если значение поля соответствует шаблону, и ЛОЖЬ в противном случае. Шаблон может быть строковым литералом или параметром запроса — второй вариант предпочтительнее, так как позволяет переиспользовать запрос и защищает от ошибок с кавычками.
Оператор можно инвертировать: НЕ Поле ПОДОБНО "шаблон" отберёт строки, которые шаблону не соответствуют. Это удобно для исключения «служебных» элементов, например папок с префиксом «Архив» или тестовых контрагентов.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Контрагенты.Ссылка КАК Ссылка,
| Контрагенты.Наименование КАК Наименование
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.Наименование ПОДОБНО &Шаблон";
Запрос.УстановитьПараметр("Шаблон", "%" + СтрокаПоиска + "%");
Результат = Запрос.Выполнить().Выгрузить();Обратите внимание: шаблон с символами % формируется в коде и передаётся как параметр. Так запрос остаётся статическим, его текст не меняется между вызовами, что положительно сказывается на кэшировании плана запроса.
Спецсимволы шаблона: %, _ и квадратные скобки
Язык запросов 1С поддерживает несколько служебных символов внутри шаблона. Знание их поведения — ключ к корректным условиям.
- % — любая последовательность символов любой длины, включая пустую. Шаблон
"%склад%"найдёт «Основной склад», «складской учёт» и «склад». - _ (подчёркивание) — ровно один произвольный символ. Шаблон
"АБ_12"совпадёт с «АБВ12», но не с «АБ12» и не с «АБВГ12». - [...] — один символ из перечисленных в скобках, например
"[АБВ]%"— строки, начинающиеся с А, Б или В. - [^...] — один символ, отсутствующий в перечислении.
- [а-я] — диапазон символов.
Комбинируя эти символы, можно строить довольно точные маски. Например, поиск номеров вида «00-0001» (две цифры, дефис, четыре цифры) реализуется шаблоном "[0-9][0-9]-[0-9][0-9][0-9][0-9]". Это надёжнее, чем простое "%-%", которое пропустит и «АБ-ВГ».
Экранирование служебных символов через СПЕЦСИМВОЛ
Проблема возникает, когда искомый текст сам содержит %, _ или квадратные скобки. Например, нужно найти товары с наименованием «Скидка 10%». Если написать ПОДОБНО "%Скидка 10%%", оператор воспримет внутренний % как служебный и найдёт лишнее или не найдёт ничего.
Решение — конструкция СПЕЦСИМВОЛ. Она указывает символ, который отменяет специальное значение следующего за ним знака. Традиционно используют обратную косую черту или тильду.
// Поиск строки, содержащей буквальный символ %
|ГДЕ
| Наименование ПОДОБНО "%Скидка 10~%%" СПЕЦСИМВОЛ "~"
// Поиск строки, содержащей подчёркивание
|ГДЕ
| Код ПОДОБНО "%~_%" СПЕЦСИМВОЛ "~"Если строка поиска вводится пользователем, экранирование нужно выполнять программно перед передачей в параметр: заменить в ней тильду на двойную, затем % на ~% и _ на ~_. Без этого ввод «50_000» будет интерпретирован как шаблон и вернёт неожиданные результаты.
- 1Выберите экранирующий символ, например ~, и зафиксируйте его в конструкции СПЕЦСИМВОЛ
- 2В строке пользователя замените ~ на ~~
- 3Замените % на ~%, а _ на ~_
- 4Обрамите результат символами % по краям, если нужен поиск подстроки
- 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]". Это быстрый способ выявить «грязные» данные перед обменом или отчётностью.
Типичные ошибки и ограничения
Отдельно стоит упомянуть ограничение на длину: ПОДОБНО корректно работает со строками ограниченной длины. Для строк неограниченной длины (например, реквизиты типа Строка(0)) поведение зависит от СУБД, и надеяться на такой поиск не стоит — переносите поисковые поля в строки фиксированной длины.
Как проверить результат
Результат содержит ожидаемые тестовые записи, включая граничные случаи
Записей нет вообще или найдены явно лишние — проверяйте шаблон и экранирование
Запрос отрабатывает за доли секунды на реальном объёме данных
Запрос выполняется секундами — вероятно полное сканирование, пересмотрите шаблон
Ввод % или _ в строку поиска ищет их буквально
Ввод % возвращает всю таблицу — экранирование отсутствует
Альтернативы оператору ПОДОБНО
ПОДОБНО — не единственный способ фильтрации строк в запросах 1С. Функция ПОДСТРОКА в сочетании с равенством заменяет префиксный поиск: ПОДСТРОКА(Наименование, 1, 3) = "АБВ". Однако такой вариант не использует индекс и обычно медленнее, чем ПОДОБНО "АБВ%", поэтому применять его имеет смысл лишь в особых случаях.
Для поиска по нескольким словам одновременно («стол» и «круглый» в любом порядке) ПОДОБНО неудобен — придётся строить цепочку условий И. Здесь выигрывает полнотекстовый поиск, который изначально рассчитан на словесные запросы, морфологию и ранжирование результатов.
Что важно запомнить
ПОДОБНО сравнивает строку с шаблоном: % — любая последовательность, _ — один символ. Шаблон "текст%" использует индекс, "%текст%" — нет. Пользовательский ввод всегда экранируйте через СПЕЦСИМВОЛ, поведение по регистру проверяйте на своей СУБД, а для полноценного поиска по подстроке на больших данных используйте полнотекстовый поиск.
Частые вопросы
Чем ПОДОБНО отличается от обычного равенства в запросе?
Равенство сравнивает строки целиком и посимвольно, а ПОДОБНО — по шаблону со служебными символами. Равенство быстрее и предсказуемее, ПОДОБНО нужен только там, где требуется частичное совпадение.
Можно ли использовать ПОДОБНО с параметром-списком?
Нет, ПОДОБНО принимает один шаблон. Если нужно проверить соответствие нескольким шаблонам, объединяйте условия через ИЛИ: Поле ПОДОБНО &Шаблон1 ИЛИ Поле ПОДОБНО &Шаблон2.
Почему запрос с ПОДОБНО не находит запись, которая точно есть?
Частые причины: регистрозависимое сравнение на PostgreSQL, неэкранированные % или _ в строке поиска, значение поля равно NULL, либо в данных есть непечатаемые символы или лишние пробелы. Проверьте поле функциями ВРЕГ и СОКРЛП.
Работает ли ПОДОБНО в динамических списках форм?
Да, условие с ПОДОБНО можно добавить в произвольный запрос динамического списка или в отбор. Именно так обычно реализуется строка поиска в формах списков справочников и документов.
Как искать сразу по наименованию и коду?
Объедините условия через ИЛИ: Наименование ПОДОБНО &Шаблон ИЛИ Код ПОДОБНО &Шаблон. Учтите, что такое условие почти наверняка отключит индексный поиск, поэтому на больших таблицах добавляйте ПЕРВЫЕ.
Есть ли в 1С аналог ПОДОБНО для регулярных выражений?
В языке запросов 1С регулярных выражений нет — доступны только шаблоны ПОДОБНО. Для сложных масок придётся либо комбинировать несколько условий, либо обрабатывать выборку на встроенном языке после запроса.