Каталог решений - Добавление функционала поиск по строке для динамического списка управляемого приложения на основе Подбора в УНФ

Добавление функционала поиск по строке для динамического списка управляемого приложения на основе Подбора в УНФ

Добавление функционала поиск по строке для динамического списка управляемого приложения на основе Подбора в УНФ

В наличии

Пример реализации "поиска по строке" для любой колонки динамического списка управляемого приложения на основе использования Отбора и сортировки списка.

Категория:

Описание

Одним из  неприятных моментов при работе с динамическими списками управляемого приложения является невозможность  использования такой привычной для  обычного приложения опции, как «поиск по строке».  Предлагаю один из вариантов реализации поиска по первым буквам  в динамическом списке на основе общей Формы Подбора из типовой конфигурации УНФ.

В описанном ниже примере поиск  вместе с сортировкой по полю реализован для колонок Код, Артикул, Наименование.

Добавляем  Реквизиты формы ПоискКод, ПоискАртикул, ПоискНаименование с типом «Строка».Вносим их в Группу Поиск на форме.

Программируем  события поля ввода АвтоПодбор:

поле ввода ПоискАртикул

 

 &НаКлиенте
Процедура ПоискАртикулАвтоПодбор(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка)
   
// Вставить содержимое обработчика.
   
ПоискКод = «»;
   
ПоискНаименование = «»;
     Если
СокрЛП(Текст) = «» Тогда
         
СписокЗапасов.Отбор.Элементы.Очистить();
          возврат;
     КонецЕсли;
    
Установитьпорядок(«Артикул»);
    
УстановитьПоискПоСтрокеНаСервере(Текст, «Артикул»);
КонецПроцедуры

 процедура Установитьпорядок(ИмяПоля)
     Если НЕ (
СписокЗапасов.Порядок.элементы.количество() = 1 и СписокЗапасов.Порядок.элементы[0].поле = Новый ПолеКомпоновкиДанных(ИмяПоля))  тогда
        
СписокЗапасов.Порядок.элементы.очистить();
        
НЭлемент = СписокЗапасов.Порядок.Элементы.Добавить(Тип(«ЭлементПорядкаКомпоновкиДанных»));
        
НЭлемент.Использование = Истина;
        
НЭлемент.Поле = Новый ПолеКомпоновкиДанных(ИмяПоля);
        
НЭлемент.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Возр;
        
НЭлемент.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный;
     конецЕсли;
 КонецПроцедуры

&НаСервере
Процедура УстановитьПоискПоСтрокеНаСервере(Текст, ИмяКолонки)
    
ПостроительЗапроса = новый построительЗапроса;
    
ПостроительЗапроса.Текст = «ВЫБРАТЬ
                                |   Номенклатура.Ссылка
                                |ИЗ
                                |   Справочник.Номенклатура КАК Номенклатура
                                |ГДЕ
                                |   ПОДСТРОКА(Номенклатура.»
+ ИмяКолонки + » , 1, &Длина) = &Зн
                                |{ГДЕ
                                |   Номенклатура.Ссылка.*}»
;
   
ПостроительЗапроса.Параметры.Вставить(«Длина», СтрДлина(Текст));
   
ПостроительЗапроса.Параметры.Вставить(«Зн», Текст);

    Если Не СписокЗапасов.Параметры.элементы[2].Значение = Справочники.Номенклатура.ПустаяСсылка() тогда
       
НЭлемент = ПостроительЗапроса.Отбор.Добавить(«Ссылка»);
       
НЭлемент.ВидСравнения = ВидСравнения.ВИерархии;
       
НЭлемент.Значение = СписокЗапасов.Параметры.элементы[2].Значение;
       
НЭлемент.Использование = Истина;
    КонецЕсли;
   
ПостроительЗапроса.Выполнить();
   
ТЗ = Построительзапроса.Результат.Выгрузить();
   
Сп = новый СписокЗначений;
   
Сп.ЗагрузитьЗначения(ТЗ.ВыгрузитьКолонку(«Ссылка»));

    СписокЗапасов.Отбор.Элементы.Очистить();
    
НЭлемент = СписокЗапасов.Отбор.Элементы.добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));
    
Нэлемент.левоеЗначение = новый ПолекомпоновкиДанных(«Номенклатура»);
    
НЭлемент.ВидСравнения  = ВидСравненияКомпоновкиДанных.ВСписке;
    
НЭлемент.ПравоеЗначение = Сп;
    
НЭлемент.Использование  = истина;
КонецПроцедуры

&НаКлиенте
Процедура ПоискАртикулОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, СтандартнаяОбработка)
   
// Вставить содержимое обработчика.
   
Этаформа.ТекущийЭлемент = Элементы.СписокЗапасов;
КонецПроцедуры

Таким образом получаем , что при наборе первых букв искомого варианта в поле «по артикулу» , например,  группы поиска,  происходит сортировка списка по колонке Артикул и отбор тех строк, артикул которых начинается с набранных символов. 

результат работы кода

Тут , конечно, был бы удачнее не отбор, а позиционирование на первом найденном в списке элементе .  Т.е.  мне бы хотелось в тексте запроса Построителя  добавить «Первые 1» и дальше просто позиционироваться на найденной ссылке, но как найти позицию в динамическом списке ? Ответа на этот вопрос  не нашла.

Буду рада любым предложениям по оптимизации этого варианта решения вопроса или ссылкам на другой вариант решения.

has been added to your cart:
Оформление заказа