Разработка и Конфигурация · 10 мин
ПОДОБНО с параметром в запросе 1С: как искать по части строки
Как использовать ПОДОБНО с параметром в запросе 1С: шаблоны, спецсимволы, экранирование, примеры кода и типичные ошибки при поиске по части строки.
Оператор ПОДОБНО (аналог LIKE в SQL) в языке запросов 1С позволяет отбирать записи по шаблону строки: по началу наименования, вхождению подстроки, маске с одиночными символами. На практике шаблон почти никогда не пишут прямо в тексте запроса — его передают через параметр, чтобы один и тот же запрос работал с разными значениями из формы, отбора или кода.
Тонкость в том, что параметр для ПОДОБНО — это не просто строка поиска. В нём используются служебные символы (% и _), а сами эти символы в исходных данных нужно экранировать через конструкцию СПЕЦСИМВОЛ. Если этого не сделать, поиск «Иванов_И» найдёт и «Иванов1И», и «Иванов2И», потому что подчёркивание воспримется как шаблон.
Ниже разобраны синтаксис, способы формирования параметра в коде, экранирование спецсимволов, работа с динамическими списками и типичные ошибки, из-за которых отбор либо ничего не находит, либо находит лишнее.
Как устроен оператор ПОДОБНО в языке запросов 1С
Оператор ПОДОБНО сравнивает строковое значение поля с шаблоном. Шаблон — это обычная строка, в которой два символа имеют специальное значение: % заменяет любую последовательность символов любой длины (включая пустую), а _ заменяет ровно один произвольный символ. Все остальные символы сравниваются буквально, причём сравнение зависит от регистра настроек СУБД — в типовых файловых и клиент-серверных базах 1С поиск обычно регистронезависимый.
Простейший пример: условие ГДЕ Наименование ПОДОБНО "Стол%" найдёт «Стол», «Стол письменный», «Столешница», но не найдёт «Кухонный стол». Условие ПОДОБНО "%стол%" найдёт всё перечисленное, потому что проценты с обеих сторон означают поиск вхождения в любую позицию строки.
Помимо % и _, в 1С поддерживаются квадратные скобки для диапазонов и списков символов: ПОДОБНО "[А-Г]%" — строки, начинающиеся с букв от А до Г. Конструкция [^...] означает «любой символ, кроме перечисленных». Эти возможности редко нужны в прикладных решениях, но их важно учитывать при экранировании пользовательского ввода.
Передача шаблона через параметр запроса
Стандартный приём: шаблон формируется в коде модуля, а в тексте запроса стоит только ссылка на параметр. Так запрос остаётся статичным, его проще читать, отлаживать в консоли запросов и повторно использовать.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.Наименование КАК Наименование
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Наименование ПОДОБНО &Шаблон";
Запрос.УстановитьПараметр("Шаблон", "%" + СтрокаПоиска + "%");
Результат = Запрос.Выполнить().Выбрать();
Ключевой момент: символы % добавляются в коде, а не в тексте запроса. Это даёт гибкость — по одной и той же переменной СтрокаПоиска можно строить разные режимы поиска: «начинается с» (СтрокаПоиска + "%"), «содержит» ("%" + СтрокаПоиска + "%"), «заканчивается на» ("%" + СтрокаПоиска).
Параметр обязан быть установлен до выполнения запроса. Если забыть вызвать УстановитьПараметр, запрос завершится с ошибкой «Параметр не определён». Пустая строка поиска — отдельный сценарий: шаблон "%%" найдёт все записи с непустым наименованием, что редко является желаемым поведением; обычно при пустом вводе условие просто не добавляют.
- 1Сформулируйте текст запроса с условием ПОДОБНО &Шаблон
- 2В коде соберите шаблон: добавьте % с нужных сторон строки поиска
- 3Экранируйте служебные символы в строке поиска, если вводит пользователь
- 4Вызовите Запрос.УстановитьПараметр("Шаблон", Шаблон)
- 5Выполните запрос и проверьте результат на тестовых данных
Экранирование спецсимволов и СПЕЦСИМВОЛ
Если пользователь ищет строку, в которой есть %, _, [, ] или ^, эти символы будут восприняты как элементы шаблона. Например, поиск товара «Скидка_5%» без экранирования найдёт и «Скидка-50», и «СкидкаX5Y». Чтобы символы трактовались буквально, их экранируют служебным символом, объявленным через конструкцию СПЕЦСИМВОЛ.
Функция ЭкранироватьШаблон(СтрокаПоиска)
Результат = СтрокаПоиска;
Результат = СтрЗаменить(Результат, "~", "~~");
Результат = СтрЗаменить(Результат, "%", "~%");
Результат = СтрЗаменить(Результат, "_", "~_");
Результат = СтрЗаменить(Результат, "[", "~[");
Результат = СтрЗаменить(Результат, "]", "~]");
Результат = СтрЗаменить(Результат, "^", "~^");
Возврат Результат;
КонецФункции
// В тексте запроса:
// ГДЕ Наименование ПОДОБНО &Шаблон СПЕЦСИМВОЛ "~"
Порядок замен важен: сначала экранируется сам служебный символ (~), иначе повторные замены испортят уже вставленные экранирующие последовательности. В качестве спецсимвола выбирайте знак, который гарантированно не встречается в данных, — тильда подходит почти всегда.
ПОДОБНО в динамических списках и СКД
В динамическом списке формы отбор по части строки часто делают через произвольный запрос с параметром. В свойствах динамического списка включают «Произвольный запрос», в тексте пишут условие ПОДОБНО &Шаблон, а параметр устанавливают в обработчике ПриПолученииДанныхНаСервере или при изменении поля поиска на форме: Список.Параметры.УстановитьЗначениеПараметра("Шаблон", Шаблон).
Альтернатива без ПОДОБНО — стандартный отбор динамического списка с видом сравнения «Содержит». Платформа сама транслирует его в ПОДОБНО с нужным шаблоном и корректным экранированием. Это предпочтительный вариант, если не нужны составные условия: меньше кода, меньше риска ошибиться с экранированием.
В СКД параметр шаблона объявляется в запросе набора данных так же, через &Шаблон, а значение задаётся в настройках отчёта или программно через КомпоновщикНастроек. Учтите, что пользователь отчёта обычно не знает про символы %, поэтому шаблон удобнее собирать программно при формировании отчёта.
Способы отбора по части строки
Гибкие шаблоны и составные условия, но нужно вручную экранировать спецсимволы и собирать шаблон.
Платформа сама строит шаблон и экранирует ввод; подходит для простого поиска, но не для масок с _ и диапазонами.
Быстрый поиск по словам в больших объёмах; требует включения индекса и ищет по словам, а не по подстрокам.
Производительность и ограничения
Условие ПОДОБНО "%текст%" с процентом в начале шаблона не может использовать индекс по полю — СУБД вынуждена просматривать все строки таблицы. На справочнике в несколько тысяч записей это незаметно, на регистре или справочнике с сотнями тысяч записей поиск станет ощутимо медленным.
Шаблон вида "текст%" (поиск по началу строки) на клиент-серверной базе может использовать индекс, поэтому поиск «начинается с» работает заметно быстрее поиска «содержит». Если требования позволяют, предлагайте пользователю именно такой режим, а «содержит» оставляйте как дополнительную опцию.
Для больших объёмов и поиска по нескольким полям одновременно рассмотрите полнотекстовый поиск 1С: он строит отдельный индекс и работает быстрее, но ищет по целым словам, а не по произвольным подстрокам, и требует обновления индекса.
Проверка результата и отладка
Отлаживать условие ПОДОБНО удобнее всего в консоли запросов: вставьте текст запроса, задайте параметр шаблона в явном виде (например, %стол%) и убедитесь, что результат совпадает с ожиданием. Затем подставьте шаблон с экранированными символами и проверьте частные случаи.
Полезный приём — временно вывести в запрос сам параметр как поле (ВЫБРАТЬ &Шаблон КАК Шаблон), чтобы видеть, какая именно строка дошла до СУБД. Так быстро обнаруживаются двойные проценты, потерянное экранирование или лишние пробелы, которые пользователь ввёл в поле поиска.
Проверяйте граничные случаи: пустой ввод, строка из одних пробелов, ввод с символами % и _, очень длинная строка. Для формы поиска имеет смысл обрезать пробелы через СокрЛП и ограничивать минимальную длину ввода, чтобы не запускать тяжёлый запрос по шаблону из одного процента.
Как проверить результат
Находит именно те записи, где есть вхождение
Находит лишние записи или ничего
Символ трактуется буквально, найдена только нужная запись
Символ работает как шаблон, результат шире ожидаемого
Условие не применяется, список не фильтруется
Выполняется запрос с шаблоном %%, грузится вся таблица
Частые вопросы
Можно ли использовать ПОДОБНО с полем нестрокового типа?
Напрямую — нет: ПОДОБНО работает только со строками. Число или дату сначала приводят к строке функцией ПРЕДСТАВЛЕНИЕ или через ВЫРАЗИТЬ, но такой запрос не сможет использовать индексы и будет медленным. Для чисел и дат лучше применять обычные сравнения и диапазоны.
Как искать по нескольким словам одновременно?
Разбейте строку поиска на слова через СтрРазделить и для каждого слова добавьте отдельное условие ПОДОБНО со своим параметром, объединяя их через И (все слова должны встречаться) или ИЛИ (достаточно любого). Текст запроса при этом придётся собирать динамически, но сами значения по-прежнему передавайте параметрами.
Зависит ли ПОДОБНО от регистра букв?
В типовых базах 1С сравнение строк обычно регистронезависимое, поэтому «стол» и «Стол» находятся одинаково. Точное поведение определяется настройками сортировки базы данных на СУБД, поэтому в нестандартных конфигурациях стоит проверить на тестовых данных.
Чем ПОДОБНО отличается от В ИЕРАРХИИ?
Это разные операторы: ПОДОБНО сравнивает строки по шаблону, а В ИЕРАРХИИ проверяет вхождение элемента иерархического справочника в группу. Их часто используют вместе — например, искать по части наименования только внутри выбранной папки номенклатуры.
Можно ли передать в параметр массив шаблонов?
Нет, параметр для ПОДОБНО — одна строка-шаблон. Если нужно несколько шаблонов, для каждого создают отдельный параметр и отдельное условие ПОДОБНО, объединяя их через ИЛИ, либо используют временную таблицу с заранее отобранными ссылками.
Что важно запомнить
Шаблон для ПОДОБНО передаётся параметром, символы % добавляются в коде, пользовательский ввод экранируется с конструкцией СПЕЦСИМВОЛ. Шаблон с % в начале не использует индекс — на больших таблицах предпочтительнее поиск по началу строки или полнотекстовый поиск.