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

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

Как в запросе 1С найти по части строки

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

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

Главное отличие от обычного сравнения через знак «=» в том, что равенство требует точного совпадения всей строки, включая пробелы и регистр в некоторых СУБД, а ПОДОБНО позволяет задать гибкий шаблон: начало строки, её окончание или произвольный фрагмент внутри. Именно поэтому попытка написать Наименование = "Ромашка" не найдёт контрагента «ООО Ромашка», а Наименование ПОДОБНО "%Ромашка%" — найдёт.

Материал ниже разбирает синтаксис оператора, работу шаблонных символов, экранирование, поиск без учёта регистра, типичные ошибки и вопросы производительности. Примеры приведены на встроенном языке 1С и применимы как к управляемым, так и к обычным формам.

Оператор ПОДОБНО: базовый синтаксис

Оператор ПОДОБНО записывается в секции ГДЕ запроса и сравнивает строковое выражение с шаблоном. Общий вид: СтроковоеПоле ПОДОБНО "Шаблон". Шаблон может быть строковым литералом или параметром запроса — второй вариант предпочтительнее, когда фрагмент ищет пользователь.

Типовой пример поиска контрагентов по части наименования:

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

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

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

|ИЗ

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

|ГДЕ

| Контрагенты.Наименование ПОДОБНО &ЧастьСтроки";

Запрос.УстановитьПараметр("ЧастьСтроки", "%Ромашка%");

Результат = Запрос.Выполнить().Выбрать();

Обратите внимание: знаки процента добавляются к значению параметра, а не пишутся в тексте запроса. Это позволяет один и тот же запрос использовать для поиска «по началу строки», «по окончанию» и «по вхождению в любом месте», просто меняя шаблон параметра.

Шаблонные символы % и _

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

Комбинируя эти символы, можно строить разные сценарии поиска:

  • "Ромашка%" — строка начинается с «Ромашка» (поиск по началу);
  • "%Ромашка" — строка заканчивается на «Ромашка»;
  • "%Ромашка%" — фрагмент встречается в любом месте строки;
  • "А_123" — шесть символов, начинается на «А», далее любой символ, затем «123»;
  • "___" — строка ровно из трёх символов.

Конструкция ПОДОБНО "%" формально истинна для любой непустой строки, но так писать бессмысленно — это не фильтр. А вот проверка на пустую строку через ПОДОБНО не работает: пустые строки и NULL корректнее отбирать через сравнение = "" и ЕСТЬ NULL.

Поиск без учёта регистра

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

Надёжное решение — явно привести обе стороны сравнения к одному регистру с помощью функций языка запросов. В языке запросов 1С нет функции ВРЕГ/НРЕГ в привычном виде, поэтому на практике применяют два подхода. Первый — хранить в базе дополнительное служебное поле с наименованием в верхнем регистре и искать по нему. Второй — выполнять поиск по нескольким вариантам написания, что подходит только для коротких шаблонов.

Если база работает на СУБД, где сравнение регистрозависимо, и требуется гарантированный поиск «Ромашка», «ромашка», «РОМАШКА», самый устойчивый вариант — регистр сведений или дополнительный реквизит с нормализованным значением, заполняемый при записи объекта. Это стандартный приём для полнотекстоподобных сценариев.

Экранирование спецсимволов через СПЕЦСИМВОЛ

Проблема возникает, когда сам искомый текст содержит символы %, _ или квадратные скобки. Например, пользователь ищет товар с наименованием «Скидка 10%», и шаблон "%Скидка 10%%" сработает неверно: процент внутри текста будет воспринят как шаблонный символ, а не как литерал.

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

ГДЕ Номенклатура.Наименование ПОДОБНО "%Скидка 10~%%" СПЕЦСИМВОЛ "~"

Здесь тильда объявлена спецсимволом, поэтому ~% означает литеральный знак процента, а завершающий % без тильды остаётся шаблонным. Если текст вводит пользователь, перед подстановкой в параметр программно замените в нём спецсимволы:

Функция ПодготовитьСтрокуПоиска(Строка)

Результат = СтрЗаменить(Строка, "~", "~~");

Результат = СтрЗаменить(Результат, "%", "~%");

Результат = СтрЗаменить(Результат, "_", "~_");

Возврат "%" + Результат + "%";

КонецФункции

Производительность и индексы

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

Шаблон вида "фрагмент%" (поиск по началу строки) на многих СУБД способен использовать индекс, поэтому выполняется заметно быстрее. Если бизнес-задача позволяет ограничиться поиском по началу наименования или артикула — предпочтите этот вариант.

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

Сравнение вариантов поиска

ПОДОБНО "%текст%"

Подходит для небольших таблиц и редких запросов. Не использует индекс, на больших объёмах медленный.

ПОДОБНО "текст%"

Поиск по началу строки. Может использовать индекс СУБД, работает быстро, но не находит вхождения в середине.

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

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

Типичные ошибки и их диагностика

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

Вторая ошибка — лишние пробелы. Пользователь копирует фрагмент с пробелом в конце, и шаблон "%Ромашка %" уже не совпадает с «ООО Ромашка». Перед подстановкой в параметр применяйте СокрЛП() к введённой строке.

Третья группа ошибок — попытка применить ПОДОБНО к нестроковым полям или к полям составного типа. Запрос либо падает с ошибкой, либо неявно ничего не находит. Для реквизитов составного типа (например, «Значение» в регистре дополнительных сведений) сначала убедитесь, что ищете только по строковым значениям, отфильтровав их через ВЫБОР КОГДА ... ТОГДА или по типу значения.

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

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

Прежде чем встраивать запрос в код, проверьте его в консоли запросов (в типовых конфигурациях на БСП есть встроенный инструмент, для разработки удобна консоль из состава инструментов разработчика). Подставьте реальный фрагмент, который точно присутствует в данных, и убедитесь, что запись находится.

Далее проверьте граничные случаи: фрагмент в другом регистре, фрагмент с пробелами по краям, фрагмент со спецсимволами, слишком короткий фрагмент из одного символа. Последний случай важен: шаблон "%а%" вернёт огромное количество записей, поэтому в пользовательских формах поиска имеет смысл ограничивать минимальную длину строки поиска (обычно 2–3 символа).

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

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

Заведомо существующий фрагмент
Норма

Запись находится за приемлемое время

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

Пустой результат — проверьте % в шаблоне и пробелы

Фрагмент в другом регистре
Норма

Находятся варианты «ромашка» и «Ромашка»

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

Находится только точное совпадение регистра — нужна нормализация

Ввод со спецсимволом % или _
Норма

Ищется буквальный текст

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

Возвращаются все записи — нет экранирования

Время выполнения на рабочей базе
Норма

Доли секунды на типовом объёме

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

Секунды ожидания — нужен индекс или полнотекстовый поиск

Практический порядок внедрения поиска

Соберите всё вместе: функция подготовки строки, параметризованный запрос и ограничения на ввод. Ниже — компактный порядок действий для типовой формы подбора.

Порядок действий
  1. 1
    Напишите запрос с условием ПОДОБНО &Параметр и протестируйте его в консоли запросов
  2. 2
    Добавьте функцию экранирования спецсимволов ~, %, _ и обёртывания в %...%
  3. 3
    Перед вызовом примените СокрЛП к пользовательскому вводу и проверьте минимальную длину
  4. 4
    Добавьте СПЕЦСИМВОЛ "~" в текст запроса
  5. 5
    Проверьте скорость на реальном объёме данных; при нехватке производительности рассмотрите полнотекстовый поиск или поиск по началу строки
В формах динамического списка не обязательно писать запрос вручную: у динамического списка есть свойства произвольного запроса и отбора, а стандартный поиск по строке в таблице формы уже использует механизм поиска по подстроке. Ручной ПОДОБНО нужен там, где требуется особая логика — поиск по нескольким полям сразу или по дополнительным реквизитам.
ПЗ
Практическое замечание
Итог

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

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

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

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

Равенство требует полного посимвольного совпадения строки, включая пробелы. ПОДОБНО сравнивает строку с шаблоном, где % и _ заменяют произвольные символы, поэтому позволяет искать по фрагменту. Без шаблонных символов ПОДОБНО ведёт себя почти как равенство.

Как найти записи, где поле НЕ содержит фрагмент?

Используйте отрицание: ГДЕ НЕ Наименование ПОДОБНО "%фрагмент%". Учтите, что записи со значением NULL в это условие не попадут — при необходимости добавьте обработку NULL через ЕСТЬ NULL.

Можно ли искать по части строки сразу в нескольких полях?

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

Почему запрос с ПОДОБНО работает медленно?

Шаблон, начинающийся с %, не позволяет СУБД использовать индекс, и выполняется полное сканирование таблицы. Варианты ускорения: поиск по началу строки, полнотекстовый поиск, предварительное ограничение выборки другими индексированными условиями.

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

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

Работает ли ПОДОБНО в параметрах виртуальных таблиц?

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