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

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

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

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

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

Шаблон задаётся строкой, где специальные символы % (любая последовательность символов, включая пустую) и _ (ровно один произвольный символ) определяют гибкую часть условия. Остальные символы сравниваются буквально. Важно помнить: сравнение в запросах 1С регистронезависимое, поэтому шаблон "%москва%" найдёт и «Москва», и «МОСКВА».

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

Общий вид условия: ГДЕ Поле ПОДОБНО "шаблон". Поле должно иметь строковый тип — применять ПОДОБНО к числам, датам или ссылкам нельзя, запрос завершится ошибкой. Если поле составного типа, сначала приведите его через ВЫРАЗИТЬ(... КАК Строка(N)) или убедитесь, что в выборку попадают только строковые значения.

Шаблон можно задать литералом прямо в тексте запроса или передать параметром. Вариант с параметром предпочтительнее, когда строку поиска вводит пользователь: ГДЕ Контрагенты.Наименование ПОДОБНО &СтрокаПоиска. В этом случае спецсимволы нужно добавить к значению параметра в коде модуля, например: Запрос.УстановитьПараметр("СтрокаПоиска", "%" + СтрокаПоиска + "%");

bsl
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Контрагенты.Ссылка КАК Контрагент,
| Контрагенты.Наименование КАК Наименование
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.Наименование ПОДОБНО &СтрокаПоиска";
Запрос.УстановитьПараметр("СтрокаПоиска", "%" + ВведеннаяСтрока + "%");
Результат = Запрос.Выполнить().Выгрузить();

Спецсимволы шаблона: % и _

Символ процента % заменяет любую последовательность символов любой длины, в том числе пустую. Шаблон "ООО%" найдёт все наименования, начинающиеся с «ООО», "%склад%" — содержащие слово «склад» в любой позиции, "%" — вообще все непустые и пустые строки.

Символ подчёркивания _ заменяет ровно один любой символ. Шаблон "АБ-_" найдёт значения «АБ-1», «АБ-В», но не «АБ-12» и не «АБ-». Это удобно для проверки форматов кодов фиксированной длины: например, шаблон из восьми подчёркиваний "________" отберёт строки строго из восьми символов.

"%кабель%"Подстрока в любом месте

Кабель ВВГ, Провод и кабель, КАБЕЛЬ 3х2.5

"ООО %"Начало строки

ООО Ромашка, ООО Гарант — но не ЗАО

"%_-_"Минимум 3 символа, дефис в конце

Строки, где последние три символа — любой, любой, дефис... проверяйте на тестовых данных

"____"Ровно 4 символа

Артикулы фиксированной длины

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

Если в искомом тексте сам встречается знак процента или подчёркивание (например, наименование «Скидка 10%»), обычный шаблон сработает неверно: % будет воспринят как подстановка. Для таких случаев в языке запросов есть ключевое слово СПЕЦСИМВОЛ (ESCAPE), которое объявляет символ экранирования.

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

Отрицание: НЕ ПОДОБНО

Для обратного отбора используется конструкция НЕ ПОДОБНО — либо НЕ (Поле ПОДОБНО "шаблон"). Например, отобрать всех контрагентов, кроме тех, чьё наименование начинается с «ИП»: ГДЕ НЕ Контрагенты.Наименование ПОДОБНО "ИП%".

Учитывайте тонкость с NULL: если поле может принимать значение NULL (например, при левом соединении), то и ПОДОБНО, и НЕ ПОДОБНО дадут неопределённый результат, и строка не попадёт в выборку ни в одном из вариантов. Чтобы включить NULL в отбор «не подходит», добавьте условие ИЛИ Поле ЕСТЬ NULL.

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

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

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

Чем заменить ПОДОБНО в разных задачах

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

Подходит для поиска по словам в длинных текстах и больших таблицах; требует включения индекса и его обновления, не ищет по «куску» слова

Поиск по началу строки ("Текст%")

Быстрее за счёт индекса; подходит, когда известно начало значения — артикул, префикс номера

Точное равенство или список В()

Максимально быстро, но требует точного значения; используйте, когда вариантов немного

ПОДОБНО с "%...%"

Универсально для подстроки, но медленно на больших таблицах — применяйте с дополнительными фильтрами

Практические примеры

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

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

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

Типичные ошибки и как их избежать

Самая частая ошибка — применение ПОДОБНО к нестроковому полю: запрос падает с ошибкой несоответствия типов. Вторая по распространённости — забытые символы % в параметре: разработчик передаёт чистое значение пользователя, и поиск работает как точное сравнение, а не как поиск подстроки. Третья — неэкранированные спецсимволы в пользовательском вводе, из-за чего результат «плывёт».

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

Типичные ошибки
01
ПОДОБНО к числовому или ссылочному полю — запрос завершается ошибкой; приведите значение к строке через ВЫРАЗИТЬ
02
Параметр без % — поиск превращается в точное сравнение и ничего не находит
03
Неэкранированные % и _ из ввода пользователя — лишние результаты в выборке
04
Шаблон "%...%" на таблице в миллионы записей без дополнительных фильтров — таймауты и нагрузка на сервер
05
Ожидание регистрозависимого сравнения — в запросах 1С регистр не учитывается
Контрольные точки

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

Состав выборки
Норма

Найдены все ожидаемые записи, включая разный регистр букв

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

Часть очевидных совпадений отсутствует — проверьте % в шаблоне

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

Поиск «10%» находит именно строки со знаком процента

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

Находит любые строки с «10» — экранирование не настроено

Скорость выполнения
Норма

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

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

Заметная задержка — добавьте фильтры по индексированным полям или полнотекстовый поиск

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

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

ПОДОБНО сравнивает строку с шаблоном посимвольно и ищет точное вхождение подстроки, но не использует индекс при шаблоне «%...%». Полнотекстовый поиск работает по словам с учётом морфологии и словарей, быстр на больших объёмах, но не найдёт произвольный фрагмент в середине слова.

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

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

Учитывается ли регистр букв при сравнении?

Нет, сравнение строк в запросах 1С регистронезависимое. Шаблон «%москва%» найдёт «Москва», «МОСКВА» и «мОсКвА». Регистрозависимое сравнение в языке запросов недоступно.

Как найти записи, где поле пустое?

ПОДОБНО для этого не нужно: используйте сравнение с пустой строкой Поле = "" или проверку Поле ЕСТЬ NULL для незаполненных значений в соединениях.

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

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

Как отобрать строки строго заданной длины?

Используйте шаблон из символов подчёркивания: например, ПОДОБНО "______" (шесть подчёркиваний) отберёт строки ровно из шести символов. Альтернатива — условие на длину через функцию ДЛИНАСТРОКИ в пакете запроса с вычисляемым полем.

Итог

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

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