При работе с деревом значений на управляемой форме пользователи часто сталкиваются с неудобством: при попытке быстро найти нужный элемент путем ввода текста с клавиатуры платформа активирует режим редактирования текущей ячейки вместо перехода к искомой строке. Проанализируем, почему возникает такое поведение платформы и как правильно настроить свойства элементов формы для обеспечения удобной навигации.
По умолчанию для элементов таблицы управляемой формы включен интерактивный режим ввода данных. Если у текстовой колонки свойство РежимРедактирования установлено в значение Вход при вводе, а флаг ТолькоПросмотр сброшен, любое нажатие буквенных или цифровых клавиш воспринимается платформой как команда начать редактирование содержимого ячейки. В результате вместо смены активной строки происходит изменение текста в текущем узле дерева.
Чтобы нажатие клавиш на клавиатуре вызывало стандартный поиск по строке, разберем по шагам порядок изменения свойств элемента формы в конфигураторе:
Поле формы (колонку таблицы дерева, по которой должен выполняться поиск).Режим редактирования и установим его значение в Вход (вместо значения по умолчанию Вход при вводе). Это позволит запускать редактирование ячейки только по явным командам (нажатие клавиш Enter или F2), а ввод символов перенаправит на поиск.Редактирование текста переведем в значение Ложь. Данная настройка полностью запрещает прямой ввод текста в ячейку при печати с клавиатуры.Поиск при вводе и установим его в значение Использовать.Рассмотрим альтернативный вариант: если редактирование узлов дерева пользователем вовсе не требуется, достаточно для колонки или всей таблицы установить свойство ТолькоПросмотр в значение Истина. В этом случае платформа автоматически заблокирует изменение данных и переключит клавиатурный ввод на режим позиционирования по строке.
Проанализируем особенности работы штатного поиска при вводе, о которых важно помнить при проектировании интерфейса:
Если штатного поиска при вводе недостаточно и требуется искать данные по всем уровням иерархии (включая свёрнутые узлы) или выполнять отбор элементов, рассмотрим два распространенных подхода.
Вариант 1. Использование отдельного поля поиска и программная обработка
На форму добавляется отдельное поле ввода со строковым реквизитом (например, ТекстПоиска). В событии ИзменениеТекстаРедактирования или ПриИзменении вызывается программный код, который ищет совпадения и разворачивает найденные ветки дерева.
Посмотрим на пример программной реализации такого поиска:
&НаКлиенте
Процедура ТекстПоискаИзменениеТекстаРедактирования(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка)
Если Не ЗначениеЗаполнено(Текст) Тогда
Возврат;
КонецЕсли;
// Выполняем поиск совпадений в дереве
ПараметрыОтбора = Новый Структура("Наименование", Текст);
НайденныеСтроки = ДеревоЗначений.ПолучитьЭлементы().НайтиСтроки(ПараметрыОтбора, Истина);
// Разворачиваем родительские узлы для найденных элементов
Для Каждого СтрокаИзНайденных Из НайденныеСтроки Цикл
Элементы.ТаблицаДерево.Развернуть(СтрокаИзНайденных.ПолучитьИдентификатор(), Истина);
КонецЦикла;
Если НайденныеСтроки.Количество() > 0 Тогда
Элементы.ТаблицаДерево.ТекущаяСтрока = НайденныеСтроки[0].ПолучитьИдентификатор();
КонецЕсли;
КонецПроцедуры
Вариант 2. Использование динамического списка
Если данные дерева формируются из иерархического справочника базы данных, вместо реквизита ДеревоЗначений рекомендуется использовать ДинамическийСписок с включенным иерархическим просмотром. Динамический список из коробки поддерживает стандартный элемент «Строка поиска», который умеет фильтровать и отображать данные по всем уровням иерархии без дополнительного программирования.