Разработка и Конфигурация · 10 мин
Как использовать ПОДОБНО в запросе 1С
Как использовать оператор ПОДОБНО в запросе 1С: синтаксис, спецсимволы % и _, СПЕЦСИМВОЛ, примеры поиска по подстроке и типичные ошибки.
Оператор ПОДОБНО (в английском синтаксисе — LIKE) в языке запросов 1С позволяет отбирать строковые значения по шаблону: найти контрагентов по части наименования, документы по фрагменту номера, товары по артикулу с определённой маской. Это основной инструмент «неточного» поиска в запросах, когда точное равенство не подходит.
Шаблон задаётся строкой, где специальные символы % (любая последовательность символов, включая пустую) и _ (ровно один произвольный символ) определяют гибкую часть условия. Остальные символы сравниваются буквально. Важно помнить: сравнение в запросах 1С регистронезависимое, поэтому шаблон "%москва%" найдёт и «Москва», и «МОСКВА».
Синтаксис оператора ПОДОБНО
Общий вид условия: ГДЕ Поле ПОДОБНО "шаблон". Поле должно иметь строковый тип — применять ПОДОБНО к числам, датам или ссылкам нельзя, запрос завершится ошибкой. Если поле составного типа, сначала приведите его через ВЫРАЗИТЬ(... КАК Строка(N)) или убедитесь, что в выборку попадают только строковые значения.
Шаблон можно задать литералом прямо в тексте запроса или передать параметром. Вариант с параметром предпочтительнее, когда строку поиска вводит пользователь: ГДЕ Контрагенты.Наименование ПОДОБНО &СтрокаПоиска. В этом случае спецсимволы нужно добавить к значению параметра в коде модуля, например: Запрос.УстановитьПараметр("СтрокаПоиска", "%" + СтрокаПоиска + "%");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Контрагенты.Ссылка КАК Контрагент,
| Контрагенты.Наименование КАК Наименование
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.Наименование ПОДОБНО &СтрокаПоиска";
Запрос.УстановитьПараметр("СтрокаПоиска", "%" + ВведеннаяСтрока + "%");
Результат = Запрос.Выполнить().Выгрузить();Спецсимволы шаблона: % и _
Символ процента % заменяет любую последовательность символов любой длины, в том числе пустую. Шаблон "ООО%" найдёт все наименования, начинающиеся с «ООО», "%склад%" — содержащие слово «склад» в любой позиции, "%" — вообще все непустые и пустые строки.
Символ подчёркивания _ заменяет ровно один любой символ. Шаблон "АБ-_" найдёт значения «АБ-1», «АБ-В», но не «АБ-12» и не «АБ-». Это удобно для проверки форматов кодов фиксированной длины: например, шаблон из восьми подчёркиваний "________" отберёт строки строго из восьми символов.
Кабель ВВГ, Провод и кабель, КАБЕЛЬ 3х2.5
ООО Ромашка, ООО Гарант — но не ЗАО
Строки, где последние три символа — любой, любой, дефис... проверяйте на тестовых данных
Артикулы фиксированной длины
Экранирование спецсимволов через СПЕЦСИМВОЛ
Если в искомом тексте сам встречается знак процента или подчёркивание (например, наименование «Скидка 10%»), обычный шаблон сработает неверно: % будет воспринят как подстановка. Для таких случаев в языке запросов есть ключевое слово СПЕЦСИМВОЛ (ESCAPE), которое объявляет символ экранирования.
Пример: ГДЕ Товары.Наименование ПОДОБНО "%10~%%" СПЕЦСИМВОЛ "~". Здесь тильда объявлена спецсимволом, поэтому последовательность ~% означает буквальный знак процента, а не подстановку. Аналогично экранируется подчёркивание: ~_. Сам символ экранирования, если он встречается в данных, тоже нужно удвоить: ~~.
Отрицание: НЕ ПОДОБНО
Для обратного отбора используется конструкция НЕ ПОДОБНО — либо НЕ (Поле ПОДОБНО "шаблон"). Например, отобрать всех контрагентов, кроме тех, чьё наименование начинается с «ИП»: ГДЕ НЕ Контрагенты.Наименование ПОДОБНО "ИП%".
Учитывайте тонкость с NULL: если поле может принимать значение NULL (например, при левом соединении), то и ПОДОБНО, и НЕ ПОДОБНО дадут неопределённый результат, и строка не попадёт в выборку ни в одном из вариантов. Чтобы включить NULL в отбор «не подходит», добавьте условие ИЛИ Поле ЕСТЬ NULL.
Производительность и ограничения
Главное ограничение ПОДОБНО — производительность. Шаблон, начинающийся с % (поиск подстроки в середине), не может использовать индекс по полю и приводит к полному перебору таблицы. На справочнике в сотни тысяч элементов такой запрос выполняется заметно дольше, чем поиск по началу строки "ООО%", где индекс частично работает.
Если поиск по подстроке нужен регулярно и по большим таблицам, рассмотрите альтернативы: полнотекстовый поиск данных (работает быстро и ищет по словам с учётом морфологии), механизм «поиска по строке» в динамических списках или предварительную фильтрацию по другим индексированным полям, чтобы уменьшить объём сканируемых данных.
Чем заменить ПОДОБНО в разных задачах
Подходит для поиска по словам в длинных текстах и больших таблицах; требует включения индекса и его обновления, не ищет по «куску» слова
Быстрее за счёт индекса; подходит, когда известно начало значения — артикул, префикс номера
Максимально быстро, но требует точного значения; используйте, когда вариантов немного
Универсально для подстроки, но медленно на больших таблицах — применяйте с дополнительными фильтрами
Практические примеры
Типовые сценарии, где ПОДОБНО применяется чаще всего: подбор контрагента по введённому фрагменту названия, поиск номенклатуры по части артикула, отбор документов по номеру без префикса, поиск «дублей» в справочнике по похожим наименованиям, фильтрация служебных элементов (например, наименований, начинающихся с «Удалить»).
Пример отбора документов по фрагменту номера: ГДЕ РеализацияТоваровУслуг.Номер ПОДОБНО "%0042" — найдёт документы, номер которых заканчивается на «0042», независимо от префикса базы. Для поиска дублей можно сравнивать наименование с шаблоном, построенным из ключевого слова, но помните, что ПОДОБНО не умеет нечёткий поиск с опечатками — для этого нужны другие механизмы.
- 1Определите строковое поле для поиска и убедитесь, что оно не составного типа
- 2Напишите условие ГДЕ Поле ПОДОБНО &СтрокаПоиска
- 3В коде добавьте к значению параметра % с нужных сторон и экранируйте спецсимволы из ввода пользователя
- 4Добавьте СПЕЦСИМВОЛ "~" в текст запроса, если экранирование используется
- 5Выполните запрос на тестовой копии и проверьте, что найдены ожидаемые записи, включая граничные случаи
Типичные ошибки и как их избежать
Самая частая ошибка — применение ПОДОБНО к нестроковому полю: запрос падает с ошибкой несоответствия типов. Вторая по распространённости — забытые символы % в параметре: разработчик передаёт чистое значение пользователя, и поиск работает как точное сравнение, а не как поиск подстроки. Третья — неэкранированные спецсимволы в пользовательском вводе, из-за чего результат «плывёт».
Ещё одна ловушка — ожидание регистрозависимого поиска: в запросах 1С сравнение строк регистронезависимо, и отдельного «регистрозависимого ПОДОБНО» не существует. Если нужно различать регистр, придётся обрабатывать результат в коде после выборки.
Как проверить результат
Найдены все ожидаемые записи, включая разный регистр букв
Часть очевидных совпадений отсутствует — проверьте % в шаблоне
Поиск «10%» находит именно строки со знаком процента
Находит любые строки с «10» — экранирование не настроено
Запрос отрабатывает за приемлемое время на реальном объёме данных
Заметная задержка — добавьте фильтры по индексированным полям или полнотекстовый поиск
Частые вопросы
Чем ПОДОБНО отличается от полнотекстового поиска?
ПОДОБНО сравнивает строку с шаблоном посимвольно и ищет точное вхождение подстроки, но не использует индекс при шаблоне «%...%». Полнотекстовый поиск работает по словам с учётом морфологии и словарей, быстр на больших объёмах, но не найдёт произвольный фрагмент в середине слова.
Можно ли использовать ПОДОБНО в консоли запросов для проверки?
Да, оператор полностью поддерживается в консоли запросов. Это удобный способ отладить шаблон: подставьте литерал вместо параметра и проверьте выборку до переноса запроса в код.
Учитывается ли регистр букв при сравнении?
Нет, сравнение строк в запросах 1С регистронезависимое. Шаблон «%москва%» найдёт «Москва», «МОСКВА» и «мОсКвА». Регистрозависимое сравнение в языке запросов недоступно.
Как найти записи, где поле пустое?
ПОДОБНО для этого не нужно: используйте сравнение с пустой строкой Поле = "" или проверку Поле ЕСТЬ NULL для незаполненных значений в соединениях.
Работает ли ПОДОБНО с полями неограниченной длины?
Да, оператор применим и к строкам неограниченной длины, но такие поля не индексируются, поэтому любой шаблон будет выполняться перебором. На больших таблицах это может быть медленно.
Как отобрать строки строго заданной длины?
Используйте шаблон из символов подчёркивания: например, ПОДОБНО "______" (шесть подчёркиваний) отберёт строки ровно из шести символов. Альтернатива — условие на длину через функцию ДЛИНАСТРОКИ в пакете запроса с вычисляемым полем.
Что важно запомнить
ПОДОБНО сравнивает строку с шаблоном: % — любая последовательность, _ — один символ, регистр не учитывается. Спецсимволы из пользовательского ввода экранируйте через СПЕЦСИМВОЛ, а шаблоны вида "%...%" на больших таблицах дополняйте индексируемыми фильтрами или заменяйте полнотекстовым поиском.