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

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

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

Как использовать ПОДОБНО в запросах 1С: синтаксис, спецсимволы %, _, [ ], спецсимвол СПЕЦСИМВОЛ, примеры поиска по подстроке и типичные ошибки.

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

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

Ниже разобраны синтаксис оператора, правила построения шаблонов, экранирование спецсимволов, практические примеры для типовых задач и типичные ошибки, которые приводят к пустым или неверным результатам выборки.

Синтаксис оператора ПОДОБНО

Общий вид конструкции в секции ГДЕ выглядит так:

ВЫБРАТЬ

Номенклатура.Наименование

ИЗ

Справочник.Номенклатура КАК Номенклатура

ГДЕ

Номенклатура.Наименование ПОДОБНО &Шаблон

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

Для инверсии условия используется отрицание: НЕ Номенклатура.Наименование ПОДОБНО &Шаблон. Такая запись выберет все записи, которые не соответствуют шаблону. Учитывайте, что отрицание обычно мешает оптимизатору использовать индекс, и на больших таблицах запрос может выполняться заметно дольше.

Оператор применим и в других местах запроса: в условиях соединения таблиц, в параметрах виртуальных таблиц, в условии конструкции ВЫБОР. Однако на практике чаще всего его размещают именно в секции ГДЕ, потому что там он фильтрует итоговую выборку и проще контролируется.

Спецсимволы шаблона: %, _ и квадратные скобки

Символ процента (%) заменяет любую последовательность символов любой длины, включая пустую. Шаблон "%кабель%" найдёт «Кабель ВВГ 3х2,5», «Провод и кабель», «кабель-канал». Шаблон "Металл%" — только строки, начинающиеся со слова «Металл», а "%склад" — только заканчивающиеся на «склад».

Символ подчёркивания (_) заменяет ровно один произвольный символ. Шаблон "Т-1_" найдёт «Т-10», «Т-11», «Т-1А», но не найдёт «Т-100», потому что там после «Т-1» два символа. Подчёркивания можно ставить подряд: "___" соответствует любой строке длиной ровно три символа.

Квадратные скобки задают набор допустимых символов для одной позиции. Шаблон "[0-9]" — одна цифра, "[АБВ]%" — строка, начинающаяся с А, Б или В. Внутри скобок можно использовать диапазоны через дефис и перечисления. Символы внутри скобок трактуются буквально, поэтому "[%]" — это способ найти сам знак процента без экранирования.

ШаблонЧто находитПример совпадения
%текст%Подстрока в любом месте«Болт текстовый М6»
АВ-%Начало строки«АВ-1024»
%_Строка минимум из одного символаЛюбое непустое значение
___-____Фиксированная структура«102-4567»
[0-9][0-9]%Начинается с двух цифр«25 шт»

Как передать шаблон через параметр

В прикладном коде шаблон почти всегда формируется из строки поиска, которую вводит пользователь. Базовый приём — обернуть введённый текст символами процента с обеих сторон:

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

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

"ВЫБРАТЬ

| Номенклатура.Ссылка

|ИЗ

| Справочник.Номенклатура КАК Номенклатура

|ГДЕ

| Номенклатура.Наименование ПОДОБНО &Шаблон";

Запрос.УстановитьПараметр("Шаблон", "%" + СтрокаПоиска + "%");

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

Такой подход работает, пока пользователь не ввёл собственные служебные символы. Если в строке поиска встречается %, _, [ или ], запрос воспримет их как часть шаблона, и результат окажется неверным: например, поиск товара «Скидка 10%» найдёт гораздо больше записей, чем ожидалось, потому что % внутри шаблона превратится в «любые символы».

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

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

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

ГДЕ

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

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

Экранирование удобно выполнять в коде перед установкой параметра — последовательной заменой символов в строке пользователя:

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

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

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

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

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

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

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

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

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

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

Практические сценарии использования

Поиск по части наименования

Самая частая задача — строка поиска в форме списка справочника. Запрос с шаблоном "%текст%" возвращает все записи, где введённый фрагмент встречается в любом месте наименования. Для удобства пользователей поиск часто делают по нескольким полям сразу, объединяя условия через ИЛИ: по наименованию, артикулу и коду.

При объединении через ИЛИ экранируйте шаблон один раз и используйте один и тот же параметр во всех условиях — так запрос остаётся читаемым, а логика экранирования не дублируется.

Фильтрация по префиксу или суффиксу

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

Если бизнес-задача позволяет, предпочитайте поиск «с начала строки» поиску «в любом месте»: разница во времени выполнения на справочнике в сотни тысяч записей может быть разительной.

Проверка формата значения

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

ГДЕ

НЕ Номенклатура.Артикул ПОДОБНО "[А-ЯA-Z][А-ЯA-Z]-[0-9][0-9][0-9][0-9]"

Такой запрос полезен при чистке данных перед обменом с внешними системами, где формат контролируется жёстко. Учитывайте, что шаблон проверяет только структуру, но не смысловую корректность значения.

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

Производительность и ограничения

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

Оператор применим только к строкам. Если поле имеет составной тип, включающий строку, сравнение выполняется только для строковых значений, остальные дают ложь. Для чисел и дат предварительно приводите значение к строке, понимая, что формат представления зависит от СУБД и такой подход ненадёжен.

Строки неограниченной длины в запросах имеют ограничения на сравнение и группировку; если поле объявлено как строка неограниченной длины, безопаснее явно привести его к строке фиксированной длины через ВЫРАЗИТЬ перед сравнением.

Типичные ошибки и как их проверить

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

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

Третья ошибка — сравнение нетипизированного параметра. Если параметр шаблона не задан или имеет неожиданный тип, запрос может вернуть пустой результат без сообщения об ошибке. Всегда устанавливайте параметр явно и проверяйте запрос в консоли с теми же значениями, что передаёт код.

Типичные ошибки
01
Шаблон без экранирования: символы % и _ из пользовательского ввода искажают условие поиска.
02
Шаблон "%текст%" на большой таблице без других ограничений: полное сканирование и медленный запрос.
03
Сравнение поля нестрокового типа через ПОДОБНО: ошибка запроса или пустой результат.
04
Отладка только в консоли запросов с литералом: в коде шаблон собирается иначе, и поведение отличается.
Контрольные точки

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

Поиск значения с символом % в тексте
Норма

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

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

Возвращаются лишние записи или ничего не найдено — экранирование не работает

Поиск по префиксу на большой таблице
Норма

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

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

Длительное выполнение, полное сканирование таблицы

Поиск строки с пробелами по краям
Норма

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

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

Запись не находится — не применён СокрЛП

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

Итоговая проверка сводится к трём шагам: выполнить запрос в консоли с тем же параметром, что формирует код; протестировать поиск на данных со спецсимволами и пробелами; оценить время выполнения на объёме, близком к рабочему. Если все три проверки пройдены, конструкция готова к использованию в прикладном решении.

Итог

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

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

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

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

Почему запрос с ПОДОБНО ничего не находит, хотя данные есть?

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

Работает ли ПОДОБНО с учётом регистра букв?

Это зависит от настроек конкретной СУБД и базы данных. Во многих типовых развёртываниях сравнение регистронезависимое, но гарантии нет. Проверьте поведение на своей базе простым запросом с заведомо другим регистром символов.

Можно ли использовать ПОДОБНО для чисел или дат?

Напрямую — нет, оператор работает только со строками. Теоретически значение можно привести к строке, но формат представления зависит от СУБД, поэтому такой приём ненадёжен. Для чисел и дат используйте диапазонные условия и функции работы с датами.

Как ускорить поиск по подстроке на большой таблице?

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

Что делает ключевое слово СПЕЦСИМВОЛ?

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