Разработка и Конфигурация · 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Определите строковое поле, по которому выполняется поиск, и убедитесь, что оно строкового типа.
- 2Напишите запрос с условием Поле ПОДОБНО &Шаблон СПЕЦСИМВОЛ "~".
- 3Добавьте функцию экранирования, заменяющую ~, %, _, [ и ] в пользовательском вводе.
- 4Оберните подготовленную строку символами % с обеих сторон и передайте в параметр.
- 5Проверьте результат на данных, содержащих %, _ и скобки в наименованиях.
Практические сценарии использования
Поиск по части наименования
Самая частая задача — строка поиска в форме списка справочника. Запрос с шаблоном "%текст%" возвращает все записи, где введённый фрагмент встречается в любом месте наименования. Для удобства пользователей поиск часто делают по нескольким полям сразу, объединяя условия через ИЛИ: по наименованию, артикулу и коду.
При объединении через ИЛИ экранируйте шаблон один раз и используйте один и тот же параметр во всех условиях — так запрос остаётся читаемым, а логика экранирования не дублируется.
Фильтрация по префиксу или суффиксу
Шаблон "77%" в условии на код контрагента отберёт записи, код которых начинается с 77. Префиксный шаблон — единственный вариант ПОДОБНО, который на большинстве СУБД способен использовать индекс по строковому полю, поэтому он существенно быстрее шаблона с ведущим процентом на больших таблицах.
Если бизнес-задача позволяет, предпочитайте поиск «с начала строки» поиску «в любом месте»: разница во времени выполнения на справочнике в сотни тысяч записей может быть разительной.
Проверка формата значения
ПОДОБНО удобен для выявления данных, нарушающих формат. Например, найти артикулы, не соответствующие маске «две буквы, дефис, четыре цифры»:
ГДЕ
НЕ Номенклатура.Артикул ПОДОБНО "[А-ЯA-Z][А-ЯA-Z]-[0-9][0-9][0-9][0-9]"
Такой запрос полезен при чистке данных перед обменом с внешними системами, где формат контролируется жёстко. Учитывайте, что шаблон проверяет только структуру, но не смысловую корректность значения.
Если поиск по подстроке выполняется часто и таблица большая, рассмотрите полнотекстовый поиск данных вместо ПОДОБНО: он индексируется и работает быстрее, хотя имеет собственные ограничения по морфологии и длине слов.
Производительность и ограничения
Шаблон с ведущим символом процента ("%текст%") не позволяет СУБД использовать индекс по полю, поэтому выполняется полное сканирование таблицы. На небольших справочниках это незаметно, на таблицах движений документов или больших регистрах сведений — приводит к ощутимым задержкам и блокировкам при параллельной работе.
Оператор применим только к строкам. Если поле имеет составной тип, включающий строку, сравнение выполняется только для строковых значений, остальные дают ложь. Для чисел и дат предварительно приводите значение к строке, понимая, что формат представления зависит от СУБД и такой подход ненадёжен.
Строки неограниченной длины в запросах имеют ограничения на сравнение и группировку; если поле объявлено как строка неограниченной длины, безопаснее явно привести его к строке фиксированной длины через ВЫРАЗИТЬ перед сравнением.
Типичные ошибки и как их проверить
Первая ошибка — отсутствие экранирования пользовательского ввода. Симптом: поиск «50%» возвращает лишние записи или, наоборот, ничего не находит, хотя значение в базе есть. Лечится функцией подготовки шаблона и ключевым словом СПЕЦСИМВОЛ.
Вторая ошибка — лишние пробелы. Пользовательский ввод часто содержит пробелы по краям, а наименования в базе — двойные пробелы внутри. Перед формированием шаблона применяйте СокрЛП к строке поиска; если в данных встречаются неодинарные пробелы, это нужно учитывать отдельно, потому что ПОДОБНО сравнивает строки посимвольно.
Третья ошибка — сравнение нетипизированного параметра. Если параметр шаблона не задан или имеет неожиданный тип, запрос может вернуть пустой результат без сообщения об ошибке. Всегда устанавливайте параметр явно и проверяйте запрос в консоли с теми же значениями, что передаёт код.
Как проверить результат
Находится ровно та запись, где процент встречается буквально
Возвращаются лишние записи или ничего не найдено — экранирование не работает
Запрос выполняется быстро, план показывает использование индекса
Длительное выполнение, полное сканирование таблицы
Запись находится независимо от пробелов во вводе
Запись не находится — не применён СокрЛП
Проверка результата и FAQ
Итоговая проверка сводится к трём шагам: выполнить запрос в консоли с тем же параметром, что формирует код; протестировать поиск на данных со спецсимволами и пробелами; оценить время выполнения на объёме, близком к рабочему. Если все три проверки пройдены, конструкция готова к использованию в прикладном решении.
Что важно запомнить
ПОДОБНО сравнивает строку с шаблоном: % — любые символы, _ — один символ, [ ] — набор. Пользовательский ввод всегда экранируйте через СПЕЦСИМВОЛ, а для больших таблиц предпочитайте префиксные шаблоны или полнотекстовый поиск.
Чем ПОДОБНО отличается от обычного сравнения через равно?
Равенство сравнивает строки посимвольно целиком и требует точного совпадения. ПОДОБНО интерпретирует правую часть как шаблон со служебными символами, что позволяет искать по части строки, по маске начала или конца и по структуре значения.
Почему запрос с ПОДОБНО ничего не находит, хотя данные есть?
Чаще всего причины три: в шаблон попали неэкранированные служебные символы, в строке поиска или данных есть лишние пробелы, либо параметр шаблона не установлен или имеет неверный тип. Проверьте запрос в консоли с тем же значением параметра, что передаёт код.
Работает ли ПОДОБНО с учётом регистра букв?
Это зависит от настроек конкретной СУБД и базы данных. Во многих типовых развёртываниях сравнение регистронезависимое, но гарантии нет. Проверьте поведение на своей базе простым запросом с заведомо другим регистром символов.
Можно ли использовать ПОДОБНО для чисел или дат?
Напрямую — нет, оператор работает только со строками. Теоретически значение можно привести к строке, но формат представления зависит от СУБД, поэтому такой приём ненадёжен. Для чисел и дат используйте диапазонные условия и функции работы с датами.
Как ускорить поиск по подстроке на большой таблице?
Сначала сузьте выборку индексируемыми условиями (период, организация, вид номенклатуры), а ПОДОБНО применяйте к уже отфильтрованному набору. Если поиск «в любом месте строки» нужен постоянно, рассмотрите полнотекстовый поиск данных — он использует собственный индекс.
Что делает ключевое слово СПЕЦСИМВОЛ?
Оно объявляет символ, который в шаблоне отменяет служебное значение следующего за ним знака. Например, при СПЕЦСИМВОЛ \"~\" последовательность ~% ищет буквальный знак процента, а ~_ — буквальное подчёркивание. Без этого найти в данных сами служебные символы затруднительно.