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

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

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

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

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

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

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

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

Общий вид условия выглядит так: Поле ПОДОБНО "шаблон". Шаблон может быть строковым литералом или параметром запроса. Оператор возвращает ИСТИНА, если значение поля соответствует шаблону, и ЛОЖЬ в противном случае.

Пример простого запроса, который находит контрагентов, чьё наименование начинается со слова «ООО»:

ВЫБРАТЬ

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

ИЗ

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

ГДЕ

Контрагенты.Наименование ПОДОБНО "ООО%"

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

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

Шаблон ПОДОБНО строится из обычных символов и служебных знаков, каждый из которых имеет строгое значение:

  • % — любая последовательность символов любой длины, включая пустую;
  • _ (подчёркивание) — ровно один произвольный символ;
  • [...] — один символ из перечисленного набора или диапазона, например [0-9] или [АБВ];
  • [^...] — один символ, не входящий в указанный набор.

Примеры шаблонов и их смысл:

ШаблонЧто находит
"ООО%"Строки, начинающиеся с «ООО»
"%склад%"Строки, содержащие подстроку «склад» в любом месте
"%" + ".xls"Строки, заканчивающиеся на «.xls»
"Т-_-_-_"Строки вида «Т-» и три произвольных символа через дефисы
"[0-9][0-9][0-9]%"Строки, начинающиеся с трёх цифр
"%[^0-9]"Строки, последний символ которых — не цифра

Частая ошибка — забыть % в начале или конце шаблона. Шаблон "склад" без спецсимволов означает точное совпадение всей строки, а не поиск вхождения подстроки. Для поиска подстроки обязательно нужны оба знака процента: "%склад%".

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

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

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

Пример: найти все наименования, содержащие подстроку «10%» (например, «Скидка 10%»). Без экранирования знак процента был бы воспринят как служебный. Решение:

ГДЕ

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

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

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

Передача шаблона через параметр запроса

На практике шаблон почти всегда строится динамически и передаётся параметром. Типичный пример поиска контрагентов по фрагменту наименования:

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

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

"ВЫБРАТЬ

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

|ИЗ

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

|ГДЕ

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

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

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

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

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

ПОДОБНО с полями неограниченной длины и составными типами

Поля типа «строка неограниченной длины» имеют ограничения при использовании в запросах: их нельзя напрямую сравнивать в некоторых ситуациях, и поведение ПОДОБНО может зависеть от СУБД. Надёжный приём — привести значение к строке фиксированной длины функцией ВЫРАЗИТЬ(Поле КАК СТРОКА(200)) и уже к результату применить ПОДОБНО.

Для полей составного типа (например, комментарий, который может быть строкой или ссылкой) сначала ограничьте тип через ВЫРАЗИТЬ или проверку ТИПЗНАЧЕНИЯ, иначе запрос может завершиться ошибкой на записях с нестроковым значением.

Пример безопасного варианта:

ГДЕ

ВЫРАЗИТЬ(Документы.Комментарий КАК СТРОКА(200)) ПОДОБНО "%срочно%"

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

Альтернативы ПОДОБНО и выбор подхода

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

  • Точное сравнение = — когда нужно полное совпадение строки; работает быстрее и использует индекс;
  • Полнотекстовый поиск — для поиска по словам в длинных текстах, описаниях, комментариях в больших базах;
  • Функции ПОДСТРОКА и сравнение — когда нужно проверить фиксированную позицию символов;
  • Обработка результата запроса в коде — когда логику шаблона невозможно выразить средствами ПОДОБНО.

Сравнение вариантов

ПОДОБНО с шаблоном

Подходит для простых шаблонов по коротким строковым полям: наименования, артикулы, коды. Ограничение — не использует индекс при ведущем %

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

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

Точное сравнение =

Самый быстрый вариант при известном полном значении строки, но не ищет по части строки

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

Как проверить, что запрос с ПОДОБНО работает правильно

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

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

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

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

Строка с искомой подстрокой в середине
Норма

Присутствует в выборке при шаблоне %подстрока%

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

Отсутствует — проверьте, не забыты ли знаки %

Строка со служебным символом, например «Скидка 5%»
Норма

Находится при экранировании через СПЕЦСИМВОЛ

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

Не находится или найдены лишние строки — экранирование не настроено

Записи со значением NULL в поле
Норма

Осознанно исключены из выборки

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

Ожидались в результате — добавьте обработку NULL через ЕСТЬNULL

Итог

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

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

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

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

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

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

Поведение определяется collation базы данных. В типовых настройках MS SQL и PostgreSQL для 1С сравнение обычно регистронезависимое, то есть «%склад%» найдёт и «СКЛАД», и «Склад». Если нужен строгий учёт регистра, это решается настройками СУБД, а не самого запроса.

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

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

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

Наиболее частые причины: забыты знаки % по краям шаблона, поле имеет нестроковый тип или содержит NULL, в искомой строке есть служебные символы, искажающие шаблон. Проверьте тип поля, обработайте NULL через ЕСТЬNULL и экранируйте спецсимволы.

Можно ли использовать ПОДОБНО с параметром-списком?

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

Когда вместо ПОДОБНО лучше использовать полнотекстовый поиск?

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