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