Почему не работает поиск по любой части строки при вводе в поле и как это исправить программно

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

Часто разработчики и администраторы 1С сталкиваются с ситуацией: в свойствах справочника (например, «Номенклатура») в конфигураторе честно выставлено значение «Способ поиска строки — Любая часть», обновлен индекс полнотекстового поиска, но в режиме «Предприятие» при попытке подобрать товар в документ поиск по-прежнему упорно работает только «по началу строки». Рассмотрим, почему стандартные настройки метаданных могут игнорироваться, и разберем по шагам, как заставить систему искать данные правильно.

Выясняем причину: почему настройки в конфигураторе не помогают?

Проанализируем ситуацию. В современных типовых конфигурациях (УТ 11, ERP, КА, БП 3.0) платформа 1С часто передает управление подбором данных программному коду. Это делается для того, чтобы реализовать сложную логику: фильтрацию по остаткам, учет иерархии, поиск по дополнительным реквизитам или артикулам с игнорированием спецсимволов. Когда в модуле менеджера справочника описано специальное событие, настройки, указанные «мышкой» в окне свойств объекта, могут терять приоритет.

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

Способ 1: Программная установка способа поиска

Если в вашем справочнике используется стандартный механизм получения данных, но платформа по каким-то причинам (например, из-за режима совместимости или специфики БСП) сбрасывает настройки поиска, мы можем принудительно указать способ поиска прямо в коде. Посмотрим на пример реализации в модуле менеджера справочника:


Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
    
    // Принудительно устанавливаем способ поиска по любой части
    Параметры.СпособПоискаСтроки = СпособПоискаСтрокиПриВводеПоСтроке.ЛюбаяЧасть;
    
    // Оставляем СтандартнаяОбработка = Истина, чтобы платформа сама выполнила поиск,
    // но уже с учетом нашего измененного параметра
    
КонецПроцедуры

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

Способ 2: Корректировка запроса в обработчике (для типовых конфигураций)

Проанализируем ситуацию, часто встречающуюся в ERP 2.1 или УТ 11. В этих системах внутри ОбработкаПолученияДанныхВыбора обычно вызываются функции общих модулей, которые формируют сложный SQL-запрос к базе данных. В этом случае настройка Параметры.СпособПоискаСтроки вообще не влияет на результат, так как поиск выполняет не платформа, а конкретный Запрос.

Выясним, как модифицировать такой запрос. Обычно поиск строится с использованием оператора ПОДОБНО. Чтобы поиск стал работать «по любой части», необходимо в параметрах запроса добавить символы процента % с обеих сторон искомой строки.

Рассмотрим пример кода, который может находиться внутри модуля менеджера:


Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
    
    // Отменяем стандартную обработку, так как будем формировать список сами
    СтандартнаяОбработка = Ложь;
    
    // Подготавливаем строку поиска
    ТекстПоиска = "%" + Параметры.СтрокаПоиска + "%";
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 30
        |	Номенклатура.Ссылка КАК Ссылка,
        |	Номенклатура.Наименование КАК Наименование
        |ИЗ
        |	Справочник.Номенклатура КАК Номенклатура
        |ГДЕ
        |	Номенклатура.Наименование ПОДОБНО &ТекстПоиска
        |	И НЕ Номенклатура.ПометкаУдаления";
    
    Запрос.УстановитьПараметр("ТекстПоиска", ТекстПоиска);
    
    ТаблицаРезультатов = Запрос.Выполнить().Выгрузить();
    
    // Формируем список выбора для пользователя
    СписокДанных = Новый СписокЗначений;
    Для Каждого Строка Из ТаблицаРезультатов Цикл
        СписокДанных.Добавить(Строка.Ссылка, Строка.Наименование);
    КонецЦикла;
    
    ДанныеВыбора = СписокДанных;

КонецПроцедуры

В данном примере мы явно указываем СУБД, что искомая подстрока может находиться в любом месте поля Наименование. Обратите внимание, что использование символа % в начале строки поиска ("%Текст") отключает использование индексов в SQL-базе, что может привести к замедлению работы при огромных объемах справочника Номенклатура.

Влияние полнотекстового поиска (ПП)

Разберем еще один важный момент. 1С:Предприятие 8.3 активно использует Полнотекстовый поиск для ускорения подбора. Если полнотекстовый поиск включен, платформа может игнорировать программные настройки и настройки метаданных, пытаясь найти данные через индекс ПП.

Проверим следующие настройки:

  1. Перейдем в раздел Администрирование — Обслуживание — Управление полнотекстовым поиском.
  2. Убедимся, что статус индекса — «Обновлен». Если нет — выполним обновление.
  3. В конфигураторе проверим свойство ПолнотекстовыйПоиск у конкретных реквизитов (Наименование, Артикул). Оно должно быть установлено в значение Использовать.

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

Режим совместимости и кэширование

Проанализируем ситуацию с режимом совместимости. В старых версиях платформы (ниже 8.3.8) поведение свойства «Любая часть» имело свои особенности и не всегда адекватно интерпретировалось управляемыми формами. Если ваша конфигурация работает в режиме совместимости 8.2 или ранних 8.3, программное переопределение через ОбработкаПолученияДанныхВыбора является единственным надежным способом.

Также не стоит забывать о локальном кэше конфигурации. Если вы внесли изменения в конфигураторе, а пользователь по-прежнему видит старое поведение, выполните следующие действия:

Итоги и рекомендации

Посмотрим на общую стратегию исправления проблемы:

  1. Сначала проверяем модуль менеджера справочника на наличие процедуры ОбработкаПолученияДанныхВыбора. Если она есть — проблема на 99% в ней.
  2. Если используется типовой вызов функций БСП внутри этой процедуры, проверяем общие настройки программы в режиме «Предприятие». Иногда там есть галочка «Поиск по любой части строки», которая управляет поведением общих модулей.
  3. Если мы пишем свой код, всегда помним про производительность. Поиск ПОДОБНО "%...%" по справочнику в миллион записей может «положить» сервер. В таких случаях лучше настраивать качественный полнотекстовый поиск.
  4. Используйте СтандартнаяОбработка = Ложь только тогда, когда вам действительно нужно полностью изменить алгоритм подбора данных.

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

← На главную