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

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

Оператор ПОДОБНО в запросах 1С: синтаксис и практические примеры

Как использовать оператор ПОДОБНО в запросах 1С: синтаксис, спецсимволы, примеры поиска по части строки, экранирование, типичные ошибки и альтернативы.

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

Типичные сценарии применения: поиск контрагентов по фрагменту наименования, отбор номенклатуры по части артикула, фильтрация документов по комментарию, проверка кодов на соответствие маске. Оператор работает в предложении ГДЕ, а также в условиях соединений и параметрах виртуальных таблиц.

Важно понимать ограничения: ПОДОБНО работает только со строковыми полями, чувствителен к регистру в зависимости от настроек СУБД и может заметно замедлять запрос на больших таблицах, особенно при шаблоне, начинающемся с символа %. Ниже разобраны синтаксис, спецсимволы, практические примеры и типичные ошибки.

Синтаксис оператора ПОДОБНО и спецсимволы шаблона

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

Поддерживаемые спецсимволы шаблона:

  • % — любая последовательность любых символов, включая пустую;
  • _ (подчёркивание) — ровно один произвольный символ;
  • [...] — один символ из перечисленных в скобках (например, [абв]);
  • [^...] — один символ, отсутствующий в перечне;
  • [а-я] — один символ из диапазона.

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

Базовые примеры запросов с ПОДОБНО

Поиск по вхождению подстроки — самый частый сценарий. Запрос отбирает контрагентов, в наименовании которых есть слово «строй»:

ВЫБРАТЬ

Контрагенты.Ссылка,

Контрагенты.Наименование

ИЗ

Справочник.Контрагенты КАК Контрагенты

ГДЕ

Контрагенты.Наименование ПОДОБНО "%строй%"

Поиск по началу строки — шаблон "ООО %" найдёт наименования, начинающиеся с «ООО ». Поиск по окончанию — шаблон "%розница". Поиск по точной структуре, например артикул из двух букв и трёх цифр:

ГДЕ Номенклатура.Артикул ПОДОБНО "__[0-9][0-9][0-9]"

На практике шаблон почти всегда передаётся параметром, чтобы запрос можно было переиспользовать и не редактировать текст:

Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Справочник.Контрагенты

|ГДЕ Наименование ПОДОБНО &Шаблон";

Запрос.УстановитьПараметр("Шаблон", "%" + СтрокаПоиска + "%");

При передаче шаблона параметром удобно формировать символы % в коде, а не в тексте запроса: так пользователь вводит просто слово, а программист контролирует, ищется вхождение в любом месте, только в начале или только в конце строки.
ПЗ
Практическое замечание

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

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

ГДЕ Наименование ПОДОБНО "%10^%%" СПЕЦСИМВОЛ "^"

Здесь ^% означает литеральный знак процента, а завершающий % — обычный спецсимвол шаблона. Без экранирования запрос ПОДОБНО "%10%%" нашёл бы любые строки, содержащие «10», что далеко от задуманного.

Аналогично экранируется подчёркивание: шаблон "%^_^%" СПЕЦСИМВОЛ "^" ищет строки, содержащие символ подчёркивания как данные. Это актуально для кодов и артикулов, где подчёркивание встречается часто.

ПОДОБНО с параметрами, регистр и особенности СУБД

Чувствительность к регистру зависит от используемой СУБД и её настроек. В файловом варианте 1С сравнение обычно регистронезависимо, в клиент-серверном варианте на Microsoft SQL Server поведение определяется колlation базы данных, а на PostgreSQL — настройками кластера. Поэтому один и тот же запрос может вернуть разный результат на разных базах.

Если нужен гарантированно регистронезависимый поиск, надёжнее приводить обе стороны к одному регистру. В запросе это не всегда удобно, поэтому частый приём — хранить в регистре сведений или дополнительном реквизите копию строки в верхнем регистре и искать по ней.

Производительность — отдельный вопрос. Шаблон вида "%слово%" не может использовать индекс по полю, и СУБД выполняет полное сканирование таблицы. На справочнике в несколько сотен тысяч записей такой запрос может выполняться секундами и блокировать работу пользователей.

Контрольные точки

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

Количество записей в результате
Норма

Найдены ожидаемые записи, лишних с похожими фрагментами нет

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

В выборку попали записи без искомого слова или пропущены очевидные совпадения

Время выполнения запроса
Норма

Запрос отрабатывает быстро на рабочем объёме данных

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

Заметная пауза, растущая с ростом таблицы

Поведение на разных базах
Норма

Результат одинаков в файловом и клиент-серверном варианте

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

На серверной базе регистр влияет на результат

Типичные ошибки при использовании ПОДОБНО

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

Вторая частая проблема — сравнение с полем ограниченной длины или полем неограниченной длины (тип Строка без указания длины). С полями неограниченной длины ПОДОБНО в ряде случаев работает с ограничениями в зависимости от СУБД; надёжнее хранить поисковые данные в реквизите фиксированной длины.

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

Типичные ошибки
01
ПОДОБНО применяется к числу или ссылке — запрос падает с ошибкой или возвращает пустой результат
02
Шаблон "%слово%" на большой таблице без ограничений выборки — полное сканирование и медленная работа
03
Пользовательский ввод попадает в шаблон без экранирования % и _ — результат поиска искажается
04
Не учтён регистр на клиент-серверной базе — на SQL Server и в файловой базе результат различается
05
Поиск по полю неограниченной длины — ограничения СУБД и нестабильное поведение

Альтернативы ПОДОБНО и когда их выбирать

ПОДОБНО — не единственный способ поиска по части строки в 1С. В зависимости от задачи лучше подходят другие механизмы:

  • Полнотекстовый поиск — для поиска по словам в длинных текстах, наименованиях, комментариях. Индексирует данные и работает быстро на больших объёмах, поддерживает морфологию и нечёткий поиск.
  • Динамический список с произвольным запросом — для интерактивного поиска в формах списка, где условие ПОДОБНО формируется по мере ввода пользователя.
  • Точное сравнение и В ИЕРАРХИИ — когда подстрока не нужна и достаточно равенства или отбора по группе; такие условия используют индексы и работают быстрее.
  • Программная обработка выборки — когда логика поиска сложнее шаблонов (регулярные выражения, транслитерация): выбираются кандидаты запросом, затем фильтруются в коде.

Правило выбора простое: для коротких строк и редких запросов достаточно ПОДОБНО; для массового поиска по текстам — полнотекстовый индекс; для отбора по структуре данных — точные условия.

Сравнение вариантов

ПОДОБНО в запросе

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

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

Подходит для поиска слов в больших объёмах текста; ограничение — требует включения и обновления полнотекстового индекса

Точное сравнение

Подходит, когда известно полное значение; самый быстрый вариант, но не ищет по части строки

Порядок действий при написании запроса с ПОДОБНО

Чтобы запрос работал корректно с первого раза, придерживайтесь последовательности: определите, что именно ищете (вхождение, начало, конец, маску), выберите спецсимволы, решите вопрос с экранированием пользовательского ввода и проверьте результат на тестовых данных с граничными случаями — пустая строка, спецсимволы в данных, разный регистр.

Проверку удобно выполнять в консоли запросов на копии базы: сначала запрос с жёстко заданным шаблоном, затем с параметром, затем — замер времени на рабочем объёме данных.

Порядок действий
  1. 1
    Определите тип поиска: вхождение (%слово%), начало (слово%), конец (%слово) или маска с _ и скобками
  2. 2
    Напишите запрос с условием ГДЕ Поле ПОДОБНО &Шаблон и проверьте его в консоли запросов с литеральным шаблоном
  3. 3
    Добавьте экранирование спецсимволов в пользовательском вводе и при необходимости СПЕЦСИМВОЛ в тексте запроса
  4. 4
    Проверьте результат на граничных данных: пробелы, регистр, символы % и _ в значениях
  5. 5
    Замерьте время выполнения на рабочем объёме; при медленной работе рассмотрите полнотекстовый поиск

FAQ: частые вопросы о ПОДОБНО в запросах 1С

Чем ПОДОБНО отличается от сравнения через равно?

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

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

Используйте отрицание: ГДЕ НЕ Поле ПОДОБНО "%слово%". Учтите, что записи со значением NULL в это условие не попадут — при необходимости добавьте проверку ЕСТЬ NULL.

Работает ли ПОДОБНО с параметром-списком или массивом?

Нет, ПОДОБНО сравнивает поле с одним шаблоном. Для нескольких шаблонов объединяйте условия через ИЛИ либо собирайте текст запроса программно с отдельным параметром на каждый шаблон.

Почему запрос с ПОДОБНО работает медленно?

Шаблон, начинающийся с %, не позволяет СУБД использовать индекс по полю, поэтому выполняется полное сканирование таблицы. Сократите выборку другими условиями, уберите ведущий %, если ищется начало строки, или перейдите на полнотекстовый поиск.

Как искать по части строки без учёта регистра?

Поведение зависит от СУБД: в файловой базе сравнение обычно регистронезависимо, на серверных базах — определяется настройками сортировки. Надёжное решение — хранить копию значения в одном регистре в отдельном реквизите или использовать полнотекстовый поиск.

Можно ли использовать ПОДОБНО в параметрах виртуальных таблиц?

Да, условие с ПОДОБНО допустимо в параметре Условие виртуальных таблиц (например, остатков и оборотов регистров), что позволяет отфильтровать данные до их выборки и уменьшить объём обрабатываемых записей.

Итог

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

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