Разработка и Конфигурация · 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». Если шаблон собирается из пользовательского ввода, спецсимволы нужно экранировать программно перед передачей параметра — заменой каждого вхождения %, _, [ на экранированный вариант.
Функция ЭкранироватьШаблон(СтрокаПоиска)
Результат = СтрЗаменить(СтрокаПоиска, "~", "~~");
Результат = СтрЗаменить(Результат, "%", "~%");
Результат = СтрЗаменить(Результат, "_", "~_");
Результат = СтрЗаменить(Результат, "[", "~[");
Возврат "%" + Результат + "%";
КонецФункцииПроизводительность: почему запрос с ПОДОБНО может тормозить
Главный фактор — позиция знака процента. Шаблон вида «текст%» (совпадение с начала строки) позволяет СУБД использовать индекс по полю, и поиск выполняется быстро даже по таблице с миллионами записей. Шаблон «%текст» или «%текст%» делает индекс бесполезным: сервер вынужден просматривать каждую строку таблицы и сравнивать значение с маской.
На больших справочниках и регистрах это даёт заметные паузы. Если полнотекстовый поиск по середине строки действительно нужен и выполняется часто, рассмотрите встроенный механизм полнотекстового поиска данных 1С: он строит отдельный индекс и ищет по словам значительно быстрее, чем ПОДОБНО с ведущим процентом.
Дополнительные меры: ограничивайте выборку другими условиями (по дате, организации, пометке удаления), чтобы сузить объём сканируемых строк; не применяйте ПОДОБНО к результату функций в левой части условия, если этого можно избежать; проверяйте план запроса в консоли, если СУБД позволяет его получить.
Как выбрать способ поиска
Где ещё применяется ПОДОБНО
В динамических списках условие с ПОДОБНО добавляется в произвольный запрос списка или программно через отбор. Для строки поиска в форме списка типовой приём — обработчик изменения поля ввода, который устанавливает параметр запроса динамического списка с шаблоном «%введённый текст%».
В СКД оператор доступен в выражениях отборов и в тексте набора данных. При этом параметр шаблона можно вывести пользователю как настройку отчёта, чтобы он сам вводил маску. Важно документировать для пользователя, что % и _ имеют специальное значение, иначе он получит неожиданные результаты.
В параметрах виртуальных таблиц (например, «Остатки» регистра накопления) поддержка ПОДОБНО в условиях ограничена и зависит от конкретной таблицы — надёжнее фильтровать уже в секции ГДЕ основного запроса. Проверяйте синтакс-помощник по конкретному объекту метаданных.
Проверка результата и отладка шаблона
Отлаживать шаблон удобнее всего в консоли запросов: выполните запрос с тестовым параметром и проверьте, попали ли в результат ожидаемые строки и не попали ли лишние. Начинайте с узкого шаблона и постепенно расширяйте маску, наблюдая за изменением выборки.
Полезный приём — временно вывести в результат запроса само проверяемое поле и добавить вычисляемую колонку с условием ПОДОБНО, чтобы видеть, какие строки проходят фильтр и почему. Если условие ведёт себя неожиданно, проверьте наличие неразрывных пробелов и невидимых символов в данных: они часто становятся причиной «не находит, хотя значение есть».
Как проверить результат
Совпадает с ожиданием по тестовым данным
Ноль строк или явно лишние записи — проверьте маску и экранирование
Стоит там, где допускается любой текст
Пропущен с нужной стороны — поиск работает как точное сравнение
Запрос отрабатывает без заметной паузы
Секунды ожидания — уберите ведущий % или добавьте ограничения
Строки с неразрывными пробелами находятся
Значение «на глаз» есть, но не находится — проверьте коды символов
Частые вопросы
Чем ПОДОБНО отличается от обычного равенства строк?
Равенство требует точного совпадения значения целиком, включая все пробелы. ПОДОБНО сравнивает строку с маской и позволяет искать по части значения с помощью спецсимволов %, _ и []. Для точного совпадения равенство предпочтительнее — оно проще и быстрее.
Почему запрос с ПОДОБНО не находит значение, которое точно есть в базе?
Чаще всего причины три: в шаблоне пропущен знак % с нужной стороны, в искомом тексте есть спецсимволы (% или _), которые не экранированы, либо в данных присутствуют неразрывные пробелы или другие невидимые символы. Проверьте значение через функцию поиска кодов символов.
Как найти строки, содержащие сам знак процента?
Используйте конструкцию СПЕЦСИМВОЛ: например, шаблон «%~%» с указанием СПЕЦСИМВОЛ "~" найдёт строки, где есть обычный знак процента. Тильда здесь отменяет специальное значение следующего за ней символа.
Работает ли ПОДОБНО с числовыми полями?
Нет, оператор предназначен для строковых значений. Чтобы искать по части числа или кода числового типа, значение нужно сначала представить строкой — но лучше пересмотреть структуру данных: если по значению ищут как по строке, возможно, тип поля выбран неверно.
Учитывается ли регистр букв при сравнении ПОДОБНО?
Зависит от СУБД и её настроек сортировки. В файловых базах и типовых установках MS SQL сравнение обычно регистронезависимое, на PostgreSQL поведение определяется collation базы. Проверьте на своей базе двумя шаблонами в разном регистре.
Что быстрее: ПОДОБНО или полнотекстовый поиск?
Для поиска по началу строки («текст%») ПОДОБНО с индексом очень быстр. Для поиска слов в середине длинных текстов по большим таблицам полнотекстовый поиск данных заметно эффективнее, так как использует специальный индекс, но требует включения и настройки механизма.
Что важно запомнить
ПОДОБНО сравнивает строку с маской: % — любая последовательность, _ — один символ, [] — набор символов. Шаблон передавайте параметром, спецсимволы пользовательского ввода экранируйте через СПЕЦСИМВОЛ, а ведущего % на больших таблицах избегайте — он отключает индекс.