Как реализовать поиск элемента справочника по неточному совпадению в запросе 1С?

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

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

Решение задачи с помощью оператора ПОДОБНО

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

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


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ФизическиеЛица.Ссылка КАК Ссылка
    |ИЗ
    |	Справочник.ФизическиеЛица КАК ФизическиеЛица
    |ГДЕ
    |	ФизическиеЛица.Наименование ПОДОБНО &ШаблонНаименования
    |	И ФизическиеЛица.Телефон ПОДОБНО &ШаблонТелефона
    |
    |СГРУППИРОВАТЬ ПО
    |	ФизическиеЛица.Ссылка";

// Формируем шаблоны поиска в коде
СтрокаПоискаИмени = "Иванов";
СтрокаПоискаТелефона = "999";

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

РезультатЗапроса = Запрос.Выполнить();

В данном примере символ процента (%) в шаблоне означает любую последовательность произвольных символов (включая пустую). Шаблон %Иванов% найдет строки "Иванов", "Иванов Иван Иванович", "Сидоров Александр Иванович" и так далее.

Ограничения платформы и правила составления запросов

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

  1. Работа со строками неограниченной длины. Напрямую применить оператор ПОДОБНО к реквизиту с типом "Строка (неограниченной длины)" в запросе нельзя — платформа вернет ошибку. Чтобы обойти это ограничение, мы должны предварительно ограничить длину поля с помощью конструкции ВЫРАЗИТЬ. Например:
    ГДЕ ВЫРАЗИТЬ(ФизическиеЛица.ДополнительнаяИнформация КАК Строка(1000)) ПОДОБНО &Шаблон.
  2. Правила формирования шаблона в коде. По стандартам разработки фирмы "1С" настоятельно рекомендуется собирать строку шаблона со спецсимволами в самом коде (как в примере выше) и передавать её в запрос в качестве готового параметра. Не следует конструировать шаблон внутри текста запроса путем сложения строк (например, ПОДОБНО &Параметр + "%").
  3. Экранирование служебных символов. Если пользователь введет в строке поиска символы, которые имеют в шаблонах 1С служебное значение (такие как %, _, [, ]), это нарушит логику выборки или приведет к ошибкам СУБД (особенно в PostgreSQL). Для предотвращения подобных ситуаций спецсимволы в поисковой строке необходимо экранировать, указав в запросе ключевое слово СПЕЦСИМВОЛ. Например:
    ГДЕ ФизическиеЛица.Наименование ПОДОБНО &Шаблон СПЕЦСИМВОЛ "~" (в данном случае символ "~" будет указывать СУБД, что следующий за ним спецсимвол нужно трактовать как обычный текст).
  4. Совместимость различных СУБД. Некоторые СУБД накладывают ограничения на синтаксис шаблонов. Например, конструкция диапазона символов в квадратных скобках ([А-Я]%) не поддерживается базой данных IBM DB2. Также помните об ограничении на максимальную длину строки самого шаблона (в MS SQL Server оно составляет 1024 символа).

Проблемы производительности при неточном поиске

Несмотря на простоту реализации, использование оператора ПОДОБНО таит в себе серьезную опасность для производительности вашей информационной базы:

Альтернативные варианты неточного поиска в 1С

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

Полнотекстовый поиск (ПТС)

Для работы с большими таблицами (от сотен тысяч записей и более) рекомендуется использовать штатный механизм полнотекстового поиска платформы 1С. Он работает на основе отдельного индекса, который автоматически обновляется системой в фоновом режиме.
ПТС поддерживает сложную поисковую логику, поиск по словоформам, синонимам и части слова (с использованием символа * в конце слова), при этом скорость выполнения такого поиска в разы выше обычного SQL-запроса.

Параметры ввода по строке в формах

Если неточный поиск необходим для удобного интерактивного автоподбора при вводе данных пользователем в полях формы, мы можем настроить это без написания сложных ручных запросов. В свойствах поля ввода или программно в коде формы (через параметры получения данных выбора) мы можем:

  1. Установить способ поиска "Любая часть" с помощью свойства СпособПоискаСтрокиПриВводеПоСтроке.ЛюбаяЧасть.
  2. Включить использование полнотекстового поиска для данного поля ввода.
  3. Активировать фоновый режим получения данных выбора, чтобы длительный поиск выполнялся в фоновом задании платформы и не блокировал интерфейс для пользователя.
← На главную