Как эффективно организовать поиск по множеству строковых шаблонов в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе разработки часто возникает задача реализовать поиск по списку текстовых значений, используя оператор ПОДОБНО. Однако при попытке объединить логику массивов и шаблонов поиска разработчики сталкиваются с ограничениями платформы 1С:Предприятие. Давайте разберем, почему «простой» путь не работает и какие архитектурные подходы позволят реализовать такую функциональность без потери производительности.

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

Многие разработчики задаются вопросом: можно ли передать массив масок в условие ГДЕ Реквизит ПОДОБНО (&МассивМасок)? Ответ однозначен — нет, это невозможно. Платформа 1С требует, чтобы операндом в операторе ПОДОБНО выступал либо строковый литерал, либо параметр запроса, содержащий готовую строку шаблона. Использование динамически сформированных строк или конкатенации прямо в тексте запроса категорически не рекомендуется стандартизацией разработки 1С.

Основная причина запрета заключается в обеспечении кроссплатформенности. Разные СУБД (например, MS SQL Server и PostgreSQL) по-разному интерпретируют символы шаблонов (%, _, [ ]). Формирование шаблона на уровне СУБД через конкатенацию может привести к непредсказуемым результатам, ошибкам в работе индексов и различиям в выдаче данных в файловом и клиент-серверном вариантах.

Варианты оптимизации и реализации поиска

Если перед вами стоит задача искать по «тысячам трекеров» или другим идентификаторам, простые переборы через ИЛИ приведут к деградации производительности. Рассмотрим методы, которые помогут заставить поиск «летать».

Метод 1: Использование временных таблиц

Один из наиболее производительных способов — создание временной таблицы, содержащей ваши маски. Вместо попытки «впихнуть» массив в ПОДОБНО, мы делаем следующее:

  1. Создаем временную таблицу ТаблицаМасок с колонкой Шаблон.
  2. Помещаем в нее все значения из массива масок.
  3. Выполняем соединение основной таблицы с этой временной таблицей.

ВЫБРАТЬ
    Т.Ссылка
ИЗ
    Документ.МойДокумент КАК Т
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Маски КАК Маски
    ПО Т.МойРеквизит ПОДОБНО Маски.Шаблон

Важное примечание: Хотя этот метод технически позволяет использовать оператор ПОДОБНО в условии соединения, помните, что наличие символа % в начале шаблона (например, %123) делает невозможным использование индексов, что приведет к полному сканированию таблицы (Full Table Scan).

Метод 2: Объединение запросов (UNION ALL)

В некоторых случаях, согласно теории оптимизации запросов, использование оператора ОБЪЕДИНИТЬ (или ОБЪЕДИНИТЬ ВСЕ) работает эффективнее, чем громоздкое условие ГДЕ А ИЛИ Б ИЛИ В. Это позволяет оптимизатору запросов СУБД обрабатывать каждую ветку по отдельности.


ВЫБРАТЬ Данные ИЗ Регистр КАК Р ГДЕ Р.Поле ПОДОБНО &Шаблон1
ОБЪЕДИНИТЬ
ВЫБРАТЬ Данные ИЗ Регистр КАК Р ГДЕ Р.Поле ПОДОБНО &Шаблон2
...

Однако этот метод подходит только для небольшого количества шаблонов. При поиске по сотням значений этот подход станет неэффективным.

Метод 3: Смена архитектуры хранения

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

Рекомендации по реализации

При организации поиска для пользователей разделите задачу на два этапа:

  1. Точное совпадение: Сначала отфильтруйте данные по точному совпадению (через = или оператор В). Это самый быстрый путь, который покроет 90% корректных запросов.
  2. Нечеткий поиск: Только для тех данных, которые не были найдены первым шагом, применяйте ПОДОБНО с шаблонами.

Помните, что архитектурно правильным решением является валидация ввода. Если пользователи «вносят всякую хрень» в поле, ограничьте их возможности через РегулярныеВыражения или маски ввода, чтобы в систему попадали только данные в корректном формате. Это избавит вас от необходимости изобретать сложные алгоритмы для поиска по «кривым» строкам в будущем.

← На главную