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

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

При доработке типовых конфигураций (таких как 1С:ERP, 1С:Комплексная автоматизация или 1С:Управление торговлей) разработчики часто сталкиваются с ситуацией: в справочник Номенклатура добавляется новый реквизит (например, КодДляАртикула), для него включается индексирование, а в свойствах справочника реквизит указывается в списке Ввод по строке. Однако при попытке ввести значение в документах автоподбор по новому полю не срабатывает, в то время как по стандартному артикулу или наименованию поиск функционирует корректно.

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

Причины, почему не срабатывает стандартный «Ввод по строке»

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

  1. Программное переопределение стандартного ввода: В типовых конфигурациях на платформе 1С:Предприятие 8.3 стандартный механизм поиска платформы отключен на уровне кода. В модуле менеджера справочника Номенклатура переопределено событие ОбработкаПолученияДанныхВыбора, где в самом начале устанавливается флаг СтандартнаяОбработка = Ложь;. После этого платформа полностью перестает опрашивать список реквизитов, указанный в свойстве метаданных «Ввод по строке».
  2. Формирование выборки через запросы в общих модулях: Логика поиска номенклатуры делегирована специализированным серверным процедурам и функциям. В них жестко прописан текст запроса к полям Артикул, Код, Наименование, а также к характеристикам и штрихкодам. Новые реквизиты, добавленные в метаданные, в этот запрос автоматически не попадают.
  3. Использование полнотекстового поиска (ППД): Если механизм подбора опирается на полнотекстовый поиск, новый реквизит не будет участвовать в выдаче до тех пор, пока для него не будет включено свойство «Полнотекстовый поиск» и не обновится индекс.

Способ 1. Доработка события ОбработкаПолученияДанныхВыбора в модуле менеджера

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

Разберем по шагам, как переопределить получение данных выбора:

  1. Откроем модуль менеджера справочника Номенклатура или создадим расширение с аннотацией для процедуры ОбработкаПолученияДанныхВыбора.
  2. Найдем процедуру формирования запроса или добавим собственный алгоритм выборки.
  3. Добавим проверку по нашему реквизиту КодДляАртикула в условие ГДЕ.

Посмотрим на пример реализации обработки:


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

Способ 2. Настройка полнотекстового поиска (ППД)

Если в вашей конфигурации подбор номенклатуры реализован через обращение к объекту ПолнотекстовыйПоиск, необходимо убедиться, что новый реквизит индексируется поисковой системой.

Разберем действия для настройки полнотекстового поиска:

  1. В дереве метаданных откроем свойства реквизита КодДляАртикула.
  2. Установим свойство Полнотекстовый поиск в значение Использовать.
  3. Проверим, что у самого справочника Номенклатура свойство Полнотекстовый поиск установлено в значение Использовать.
  4. Выполним обновление индекса полнотекстового поиска программно или через регламентное задание.

Посмотрим на пример программного обновления индекса полнотекстового поиска:


// Выполняем слияние и обновление индекса полнотекстового поиска
ПолнотекстовыйПоиск.Обновить(Ложь, Истина);

Ограничения и рекомендации

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

  1. Тип данных: Реквизит должен иметь строковый или числовой тип ограниченной длины. Поля типа «Строка неограниченной длины» не поддерживаются стандартными механизмами быстрого поиска.
  2. Индексация: Обязательно оставляйте для реквизита свойство Индексировать (или Индексировать с доп. упорядочиванием), чтобы запросы с оператором ПОДОБНО не приводили к падению производительности при больших объемах справочника.
  3. Использование расширений: Чтобы сохранить конфигурацию на поддержке, переопределение процедуры ОбработкаПолученияДанныхВыбора рекомендуется выполнять в расширении с директивой &Вместо или &После.
← На главную