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