Оператор ПОДОБНО в 1С 8.3: полное руководство по гибкому поиску

Подробное руководство по оператору ПОДОБНО в 1С 8.3: синтаксис, спецсимволы, регулярные выражения, оптимизация запросов, типичные ошибки и практические примеры для разработчиков и аналитиков.

Что такое оператор ПОДОБНО и зачем он нужен

Оператор ПОДОБНО в языке запросов 1С:Предприятие предназначен для проверки строки на соответствие заданному шаблону. Результат проверки — булево значение (Истина или Ложь). Это позволяет гибко фильтровать записи по частичному совпадению, что особенно полезно при работе с наименованиями номенклатуры, адресами, номерами документов и другими строковыми данными.

Основные места применения оператора:

  • В условии ГДЕ для отбора записей по частичному совпадению.
  • В конструкции Выбор Когда Тогда Иначе Конец для обработки разных форматов строк.
  • В полях выборки как результат сравнения (например, для вывода признака соответствия).

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

Синтаксис и базовые шаблоны

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

Номенклатура.Наименование ПОДОБНО "%РЕЗЕЦ%"

Шаблон может содержать специальные символы:

  • % — заменяет любое количество символов (включая ноль). Например, "%РЕЗЕЦ%" найдёт все строки, где встречается «РЕЗЕЦ» в любом месте.
  • _ — заменяет ровно один символ. Например, "_ЕЗЕЦ" найдёт строки, где первая буква любая, а далее «ЕЗЕЦ».
  • [abc] — любой один символ из указанного набора или диапазона. Например, [А-Я] означает любую заглавную букву от А до Я.
  • [^abc] — любой один символ, кроме указанных. Например, [^0-9] найдёт любой символ, кроме цифры.

Важно: по умолчанию сравнение нечувствительно к регистру. То есть шаблон "РЕЗЕЦ" найдёт и «Резец», и «резец».

Визуальные примеры поиска с разными шаблонами

Рассмотрим, как работают различные шаблоны на примере справочника номенклатуры:

  • "%РЕЗЕЦ%" — найдёт все позиции, где встречается слово «РЕЗЕЦ» в любом месте: «РЕЗЕЦ токарный», «Резец сплавной», «Держатель резца».
  • "%РЕЗЕЦ" — найдёт строки, где «РЕЗЕЦ» стоит в конце: «Инструмент РЕЗЕЦ».
  • "РЕЗЕЦ%" — найдёт строки, начинающиеся с «РЕЗЕЦ»: «РЕЗЕЦ скоростной».
  • "РЕЗЕЦ" (без %) — только точное совпадение: строка, состоящая ровно из слова «РЕЗЕЦ».

Для поиска по началу строки используйте шаблон "Иван%" — он найдёт «Иван», «Иванов», «Ивановский». Для поиска по концу — "%Иван".

Если нужно найти строки определённой длины, используйте символ _. Например, "____" (четыре подчёркивания) найдёт все строки ровно из четырёх символов.

Работа со спецсимволами и экранирование

Если в данных встречаются сами символы %, _ или [, их нужно экранировать, чтобы они не воспринимались как служебные. Для этого используется ключевое слово СПЕЦСИМВОЛ.

Пример: найти наименования, содержащие символ процента:

ГДЕ Номенклатура.Наименование ПОДОБНО "%#%" СПЕЦСИМВОЛ "#"

Здесь символ # объявлен спецсимволом, поэтому % в шаблоне воспринимается буквально, а не как подстановочный знак. Вместо # можно использовать любой другой символ, который редко встречается в данных.

Без экранирования шаблон "%100%%" будет интерпретирован неверно: первый и последний % — подстановочные знаки, а средний % — тоже подстановочный, что приведёт к неожиданным результатам. Правильный вариант: "%100#%" СПЕЦСИМВОЛ "#".

Параметры и строковые переменные в операторе ПОДОБНО

Часто шаблон формируется динамически с использованием параметров запроса. Например, пользователь вводит часть наименования, и нужно найти все совпадения:

ГДЕ Номенклатура.Наименование ПОДОБНО ("%" + &Поиск + "%")

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

Важные моменты:

  • Параметр должен быть строкового типа. Если передаётся число или дата, необходимо явное приведение к строке.
  • Если параметр может содержать символы %, _ или [, их нужно экранировать с помощью СПЕЦСИМВОЛ или предварительно обрабатывать в коде.
  • Параметр не должен быть NULL — в этом случае условие не сработает.

Пример с экранированием:

ГДЕ Номенклатура.Наименование ПОДОБНО ("%" + &Поиск + "%") СПЕЦСИМВОЛ "#"

При этом в параметре &Поиск символы %, _, [ должны быть заменены на #%, #_, #[ соответственно.

Подводные камни и типичные ошибки

Даже опытные разработчики иногда допускают ошибки при работе с ПОДОБНО. Вот самые распространённые:

  1. Забывают про %. Шаблон без % ищет точное совпадение, что часто не соответствует ожиданиям.
  2. Неправильное экранирование. Если не экранировать служебные символы, запрос может вернуть неверные результаты или не работать вовсе.
  3. Использование для числовых полей. ПОДОБНО работает только со строками. Для чисел используйте =, >, <, МЕЖДУ.
  4. Неучёт длины строки. Если поле имеет тип Строка(10), а шаблон подразумевает больше символов, запрос вернёт пустой результат.
  5. Путаница с регистром. В версиях до 8.3.18 оператор всегда игнорировал регистр. Начиная с 8.3.18 можно использовать ПОДОБНО РАЗЛИЧАЯ РЕГИСТР.
  6. Шаблон % в начале. Запросы, начинающиеся с %, вынуждают СУБД выполнять полное сканирование таблицы, что замедляет работу на больших объёмах данных.

Оптимизация запросов с ПОДОБНО

Неправильное использование ПОДОБНО может существенно замедлить выполнение запросов. Рекомендации по оптимизации:

  1. Избегайте шаблонов, начинающихся с %. Вместо ГДЕ Наименование ПОДОБНО "%Иван%" лучше использовать ГДЕ Наименование ПОДОБНО "Иван%" или оператор В для поиска вхождения подстроки.
  2. Разбивайте сложные шаблоны. Вместо одного сложного шаблона используйте несколько простых условий, соединённых через И/ИЛИ. Это может ускорить выполнение.
  3. Используйте индексы. Если поле, по которому идёт фильтрация, не проиндексировано, запрос будет медленным. Проверьте план выполнения запроса в Консоли запросов 1С.
  4. Комбинируйте с другими условиями. Добавьте фильтры по дате, статусу или другим полям, чтобы сузить выборку до применения ПОДОБНО.
  5. Для регулярных выражений (с версии 8.3.20) используйте шаблоны с ~, которые могут быть оптимизированы платформой.

Пример эффективного запроса:

ГДЕ Артикул ПОДОБНО "A%" И Артикул ПОДОБНО "%123_%"

Вместо:

ГДЕ Артикул ПОДОБНО "A%123_%"

Расширенные возможности: регулярные выражения

Начиная с версии платформы 1С:Предприятие 8.3.20, в операторе ПОДОБНО появилась поддержка регулярных выражений. Для этого шаблон должен начинаться с символа ~.

Примеры полезных regex-шаблонов:

  • "~^[А-Я][а-я]+$" — только кириллица, первая буква заглавная.
  • "~^\d{3}-\d{2}$" — формат "123-45" (например, номера накладных).
  • "~[А-Я]{3}\d{6}" — три заглавные буквы и шесть цифр (артикулы).
  • "~^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$" — проверка email-адресов.

Важные ограничения:

  • Не все возможности стандартных регулярных выражений поддерживаются (например, lookbehind-assertions могут не работать).
  • Регулярные выражения доступны только в версиях 8.3.20 и выше.
  • В облачных версиях 1С (1C:Fresh) поддержка regex может быть ограничена.

Перед использованием regex обязательно тестируйте шаблоны на реальных данных, чтобы избежать неожиданных результатов.

Практические примеры для бухгалтеров и аналитиков

Рассмотрим реальные кейсы, где ПОДОБНО экономит время при формировании отчётов и анализе данных.

Пример 1: Поиск контрагентов с некорректными ИНН

ВЫБРАТЬ Контрагенты.Наименование, Контрагенты.ИНН
ИЗ Справочник.Контрагенты КАК Контрагенты
ГДЕ Контрагенты.ИНН ПОДОБНО "0%" // Начинается с нуля
ИЛИ Контрагенты.ИНН ПОДОБНО "%[^0-9]%" // Содержит не цифры

Пример 2: Анализ номенклатуры по артикулам

ВЫБРАТЬ Номенклатура.Наименование, Номенклатура.Артикул
ИЗ Справочник.Номенклатура КАК Номенклатура
ГДЕ Номенклатура.Артикул ПОДОБНО "TR-______"
И ДЛИНА(Номенклатура.Артикул) = 9

Пример 3: Контроль заполнения реквизитов

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

Пример 4: Поиск товаров по части названия с учётом регистра

ГДЕ Номенклатура.Наименование ПОДОБНО РАЗЛИЧАЯ РЕГИСТР "%СРОЧНО%"

Для анализа больших справочников комбинируйте ПОДОБНО с виртуальными таблицами, например Справочник.Номенклатура.ПоискПоНаименованию.

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

Иногда ПОДОБНО — не лучший выбор. Рассмотрим альтернативы:

  1. Оператор В — для поиска любого вхождения подстроки без учёта позиции. Например, ГДЕ Наименование В "Иван" найдёт все строки, содержащие «Иван».
  2. Функция НАЙТИ — для поиска позиции подстроки с учётом регистра. ГДЕ НАЙТИ(Наименование, "Иван") > 0.
  3. Функция ПОДСТРОКА — для проверки начала или конца строки без подстановочных знаков. ГДЕ ПОДСТРОКА(Артикул, 1, 3) = "ART".
  4. Полнотекстовый поиск — для поиска по нескольким словам с учётом морфологии (например, «дом» = «дома»). Используется с конструкцией ПОЛНЫЙТЕКСТ.
  5. Внешние обработки — для сложных сценариев (поиск по звучанию, нечёткое сравнение) лучше использовать внешние компоненты или Библиотеку стандартных подсистем (БСП).

Когда ПОДОБНО не спасёт:

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

Вопросы и ответы

Как найти строки, содержащие символ процента, с помощью ПОДОБНО?

Используйте экранирование с ключевым словом СПЕЦСИМВОЛ. Например:

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

Здесь # объявлен спецсимволом, поэтому % в шаблоне воспринимается буквально. Вместо # можно использовать любой другой символ.

В чём разница между операторами ПОДОБНО и В в 1С?

Оператор В проверяет любое вхождение подстроки. Например, ГДЕ Наименование В "Альфа" найдёт «Альфа-Банк», «Торговый дом Альфа» и «Бетон-Альфа-Строй». Оператор ПОДОБНО работает с шаблоном, где важны позиции символов. Шаблон "Альфа%" найдёт только строки, начинающиеся с «Альфа», и не найдёт «Мега-Альфа».

Как сделать поиск с учётом регистра в ПОДОБНО?

Начиная с версии платформы 8.3.18, используйте конструкцию ПОДОБНО РАЗЛИЧАЯ РЕГИСТР. Пример:

ГДЕ Наименование ПОДОБНО РАЗЛИЧАЯ РЕГИСТР "Иван%"

В более ранних версиях регистр всегда игнорировался.

Почему запрос с ПОДОБНО выполняется медленно и как это исправить?

Основная причина — шаблон, начинающийся с %, что вызывает полное сканирование таблицы. Рекомендации:

  • По возможности используйте шаблоны, начинающиеся с конкретных символов (например, "Иван%").
  • Разбивайте сложные шаблоны на несколько простых условий.
  • Убедитесь, что поле проиндексировано.
  • Комбинируйте ПОДОБНО с другими фильтрами (по дате, статусу) для сужения выборки.
Можно ли использовать регулярные выражения в ПОДОБНО?

Да, начиная с версии платформы 8.3.20. Для этого шаблон должен начинаться с символа ~. Например:

ГДЕ Наименование ПОДОБНО "~^[А-Я][а-я]+$"

Обратите внимание, что не все возможности regex поддерживаются, и в облачных версиях 1С функциональность может быть ограничена.

Как передать параметр в шаблон ПОДОБНО?

Используйте конкатенацию строк в тексте запроса:

ГДЕ Наименование ПОДОБНО ("%" + &Поиск + "%")

Параметр &Поиск должен быть строкового типа. Если он может содержать служебные символы (%, _, [), их необходимо экранировать с помощью СПЕЦСИМВОЛ.

Какие типичные ошибки допускают при использовании ПОДОБНО?

Самые частые ошибки:

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