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

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

Как работает оператор ПОДОБНО в запросах 1С

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

Оператор ПОДОБНО (в английском синтаксисе — LIKE) в языке запросов 1С сравнивает строковое значение с шаблоном и возвращает Истина, если строка соответствует маске. Это основной инструмент поиска по части наименования, кода, комментария или любого другого реквизита строкового типа: без ПОДОБНО пришлось бы требовать точного совпадения значения, что на практике почти бесполезно для поиска.

Типовая задача выглядит так: менеджер помнит, что в названии контрагента есть слово «Вектор», но не помнит полное наименование. Запрос с условием Наименование ПОДОБНО "%Вектор%" найдёт всех контрагентов, где это слово встречается в любой позиции строки. Знак процента заменяет любую последовательность символов, включая пустую.

Оператор работает и в консоли запросов, и в программном коде на встроенном языке, и в отборах динамических списков, и в произвольных выражениях СКД. Синтаксис везде одинаковый, но есть нюансы с производительностью, регистром букв и спецсимволами, которые нужно учитывать, чтобы запрос не «тормозил» и не возвращал лишние строки.

Синтаксис оператора и базовые примеры

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

Простейший запрос, ищущий контрагентов по фрагменту наименования:

ВЫБРАТЬ

Контрагенты.Ссылка,

Контрагенты.Наименование

ИЗ

Справочник.Контрагенты КАК Контрагенты

ГДЕ

Контрагенты.Наименование ПОДОБНО &Шаблон

Параметр передаётся из кода: Запрос.УстановитьПараметр("Шаблон", "%" + СтрокаПоиска + "%");. Передавать шаблон параметром — правильная практика: это исключает синтаксические ошибки при подстановке текста и защищает от ошибок разбора запроса, если пользователь введёт кавычки.

Обратная операция записывается с отрицанием: НЕ Наименование ПОДОБНО "%тест%" — выберет все строки, где фрагмента нет. Скобки вокруг условия с НЕ желательны при сочетании с другими условиями через И/ИЛИ, чтобы порядок вычисления был однозначным.

Спецсимволы шаблона и что они означают

ПОДОБНО в 1С поддерживает четыре конструкции шаблона. Их комбинации покрывают практически все сценарии поиска — от «содержит подстроку» до «код строго из пяти цифр».

КонструкцияЗначениеПример шаблонаЧто найдёт
%Любая последовательность символов, включая пустую%торг%«Автоторг», «Торговый дом», «Оптторг-сервис»
_Ровно один произвольный символА-00_«А-001», «А-00А», но не «А-0010»
[...]Один символ из перечисленных[Пп]етров«Петров» и «петров»
[^...]Один символ НЕ из перечисленныхА-00[^0]«А-001»…«А-009», но не «А-000»

Подчёркивание удобно для кодов фиксированной длины. Например, шаблон "_-__-____" подходит для поиска значений, похожих на дату в формате «Д.ММ.ГГГГ», а "___" найдёт все трёхсимвольные коды.

Скобочные конструкции применяются реже, но незаменимы, когда нужно ограничить допустимый символ: шаблон "[0-9][0-9][0-9]" выберет только числовые трёхзначные коды и отсечёт значения с буквами. Диапазоны внутри скобок указываются через дефис.

% в начале и концеПоиск подстроки в любом месте

Самый частый сценарий, но и самый тяжёлый для СУБД

Только % в концеПоиск по началу строки

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

_ в шаблонеСтрогая позиция символа

Проверьте, что длина шаблона соответствует ожидаемой структуре

[ ] в шаблонеОграничение набора символов

Убедитесь, что диапазон задан без ошибок, например [0-9], а не [09]

Регистр букв и сравнение строк

Чувствительность к регистру зависит от настроек СУБД, на которой развёрнута информационная база. В файловом варианте и в типичных установках MS SQL Server с русской сортировкой сравнение обычно регистронезависимое: шаблон «%вектор%» найдёт и «Вектор», и «ВЕКТОР». На PostgreSQL поведение может отличаться в зависимости от collation базы.

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

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

Экранирование спецсимволов в тексте поиска

Если пользователь ищет строку, которая сама содержит знак процента, подчёркивание или квадратные скобки, эти символы будут восприняты как элементы шаблона, и результат окажется неверным. Например, поиск «скидка 10_%» без экранирования найдёт «скидка 10 рублей», «скидка 105» и любые строки, начинающиеся с «скидка 10», потому что подчёркивание совпадёт с любым символом, а процент — с любым хвостом.

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

ГДЕ

Товары.Наименование ПОДОБНО &Шаблон СПЕЦСИМВОЛ "~"

При этом шаблон формируется с экранированием: «скидка 10~_%» найдёт именно строки с подчёркиванием после «10». Если шаблон собирается из пользовательского ввода, спецсимволы нужно экранировать программно перед передачей параметра — заменой каждого вхождения %, _, [ на экранированный вариант.

bsl
Функция ЭкранироватьШаблон(СтрокаПоиска)
	Результат = СтрЗаменить(СтрокаПоиска, "~", "~~");
	Результат = СтрЗаменить(Результат, "%", "~%");
	Результат = СтрЗаменить(Результат, "_", "~_");
	Результат = СтрЗаменить(Результат, "[", "~[");
	Возврат "%" + Результат + "%";
КонецФункции

Производительность: почему запрос с ПОДОБНО может тормозить

Главный фактор — позиция знака процента. Шаблон вида «текст%» (совпадение с начала строки) позволяет СУБД использовать индекс по полю, и поиск выполняется быстро даже по таблице с миллионами записей. Шаблон «%текст» или «%текст%» делает индекс бесполезным: сервер вынужден просматривать каждую строку таблицы и сравнивать значение с маской.

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

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

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

Как выбрать способ поиска

Поиск по началу строки, например по префиксу кодаИспользуйте ПОДОБНО с шаблоном «текст%» — индекс будет работать
Поиск подстроки в любой позиции, редко и по небольшой таблицеПОДОБНО «%текст%» допустимо, но добавьте ограничивающие условия
Частый поиск по словам в больших текстах и наименованияхВключите полнотекстовый поиск данных вместо ПОДОБНО
Нужно точное совпадение без маскиИспользуйте обычное равенство — оно быстрее и понятнее

Где ещё применяется ПОДОБНО

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

В СКД оператор доступен в выражениях отборов и в тексте набора данных. При этом параметр шаблона можно вывести пользователю как настройку отчёта, чтобы он сам вводил маску. Важно документировать для пользователя, что % и _ имеют специальное значение, иначе он получит неожиданные результаты.

В параметрах виртуальных таблиц (например, «Остатки» регистра накопления) поддержка ПОДОБНО в условиях ограничена и зависит от конкретной таблицы — надёжнее фильтровать уже в секции ГДЕ основного запроса. Проверяйте синтакс-помощник по конкретному объекту метаданных.

Типичные ошибки
01
Шаблон без % с обеих сторон при поиске подстроки — «текст» найдёт только точное совпадение, а не вхождение
02
Ведущий % на большой таблице без других условий — запрос сканирует всю таблицу и заметно замедляет работу
03
Передача пользовательского ввода без экранирования — символы % и _ в тексте искажают результат поиска
04
Подстановка текста в запрос конкатенацией вместо параметра — синтаксические ошибки и риск некорректного запроса
05
Ожидание строгой регистронезависимости на любой СУБД — поведение зависит от collation базы данных

Проверка результата и отладка шаблона

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

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

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

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

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

Совпадает с ожиданием по тестовым данным

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

Ноль строк или явно лишние записи — проверьте маску и экранирование

Наличие % в шаблоне
Норма

Стоит там, где допускается любой текст

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

Пропущен с нужной стороны — поиск работает как точное сравнение

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

Запрос отрабатывает без заметной паузы

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

Секунды ожидания — уберите ведущий % или добавьте ограничения

Данные с пробелами
Норма

Строки с неразрывными пробелами находятся

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

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

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

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

Равенство требует точного совпадения значения целиком, включая все пробелы. ПОДОБНО сравнивает строку с маской и позволяет искать по части значения с помощью спецсимволов %, _ и []. Для точного совпадения равенство предпочтительнее — оно проще и быстрее.

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

Чаще всего причины три: в шаблоне пропущен знак % с нужной стороны, в искомом тексте есть спецсимволы (% или _), которые не экранированы, либо в данных присутствуют неразрывные пробелы или другие невидимые символы. Проверьте значение через функцию поиска кодов символов.

Как найти строки, содержащие сам знак процента?

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

Работает ли ПОДОБНО с числовыми полями?

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

Учитывается ли регистр букв при сравнении ПОДОБНО?

Зависит от СУБД и её настроек сортировки. В файловых базах и типовых установках MS SQL сравнение обычно регистронезависимое, на PostgreSQL поведение определяется collation базы. Проверьте на своей базе двумя шаблонами в разном регистре.

Что быстрее: ПОДОБНО или полнотекстовый поиск?

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

Итог

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

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