среда, 15 января 2014 г.

Переопределение процедуры ввода по строке в управляемом приложении

Для того, чтобы определить свой набор данных, которые формируются при вводе по строке нужно использовать событие АвтоПодбор() элемента формы.
Справка из синтаксис-помощника:
АвтоПодбор (AutoComplete)
Синтаксис:
АвтоПодбор(<Текст>, <ДанныеВыбора>, <Ожидание>, <СтандартнаяОбработка>)
Параметры:
<Текст>
Тип: Строка.
Строка текста, введенная в поле ввода.
<ДанныеВыбора>
Тип: СписокЗначений.
Содержит список значений, который будет использован при стандартной обработке события.

Список может содержать как конкретное значение, так и структуру, в которой может быть указана следующая информация (по именам ключей в структуре):
  • Значение (Value) - собственно значение;
  • ПометкаУдаления (DeletionMark) - пометка удаления;
  • Предупреждение (Warning) - текст предупреждения, который будет выбран при выборе элемента и списка значений.
Значение по умолчанию: Неопределено
<Ожидание>
Тип: Число.
Интервал в секундах после ввода текста, через который произошло событие. Если 0, то это означает, что событие было вызвано не по поводу ввода текста, а для формирования списка быстрого выбора.
<СтандартнаяОбработка>
Тип: Булево.
В данный параметр передается признак выполнения стандартной (системной) обработки события. Если в теле процедуры-обработчика установить данному параметру значение Ложь, стандартная обработка события производиться не будет.
Параметр позволяет отменить стандартное заполнение системой ДанныеВыбора. При этом все действия (отображение списка, предупреждения) выполняются системой на основе возвращенного значения параметра <ДанныеВыбора> независимо от значения параметра <СтандартнаяОбработка>.
Значение по умолчанию: Истина
Описание:
Возникает во время начала ожидания ввода текста (в процессе набора текста сделана пауза). Также возникает при нажатии клавиши "Стрелка вниз" после ввода текста (или части текста).
При стандартной отработке события происходит поиск в порядке полей, определенном при конфигурировании в свойстве объекта метаданных "Ввод по строке".
Если найдено найдено одно или более значений, то будет показан список с найденными значениями. Если значений найдено больше 50, то список показан не будет.
Примечание:
В обработчике данного события нельзя использовать серверные методы формы с директивой компиляции НаСервере.

Переопределять мы будем список значений ДанныеВыбора, который заменим на свой - сформированный запросом:

&НаКлиенте
Процедура РайонАвтоПодбор(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка)

    Если
ЗначениеЗаполнено(Текст) И НЕ ТипЗнч(Район) = Тип("Строка") Тогда
       
СтандартнаяОбработка = Ложь;

       
ДанныеВыбора = ПолучитьДанныеВыбораГородов(Текст, Истина, ПредопределенноеЗначение("Справочник.Города.ПустаяСсылка"));

    КонецЕсли;

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

Функция
ПолучитьДанныеВыбораГородов(Текст, ЭтоРайон, Родитель)

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

    Если
ЗначениеЗаполнено(Область) И НЕ ТипЗнч(Область) = Тип("Строка")Тогда
       
Отбор = Построитель.Отбор.Добавить("Область");
       
Отбор.Использование = Истина;
       
Отбор.ВидСравнения  = ВидСравнения.Равно;
       
Отбор.Значение = Область;
    КонецЕсли;

   
Отбор = Построитель.Отбор.Добавить("ВидНаселенногоПункта");
   
Отбор.Использование = Истина;

    Если
ЭтоРайон Тогда
       
Отбор.ВидСравнения  = ВидСравнения.Равно;
       
Отбор.Значение = Справочники.ВидыНаселенныхПунктов.Район;
    Иначе
       
Отбор.ВидСравнения  = ВидСравнения.НеРавно;
       
Отбор.Значение = Справочники.ВидыНаселенныхПунктов.Район;
    КонецЕсли;

   
Построитель.Выполнить();
   
Таблица = Построитель.Результат.Выгрузить();

    Для Каждого
Строка Из Таблица Цикл
       
ДанныеВыбора.Добавить(Строка.Ссылка, Строка.Наименование);
    КонецЦикла;

    Возврат
ДанныеВыбора;

КонецФункции

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



Добавить комментарий

Комментариев нет :

Отправить комментарий