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