Как отключить автоматическое редактирование ячеек и настроить поиск по строке в дереве на управляемой форме 1С?

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

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

Выясним причину автоматического начала редактирования

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

Настройка свойств колонки и таблицы для активации поиска при вводе

Чтобы нажатие клавиш на клавиатуре вызывало стандартный поиск по строке, разберем по шагам порядок изменения свойств элемента формы в конфигураторе:

  1. Откроем нужную управляемую форму и выделим элемент типа Поле формы (колонку таблицы дерева, по которой должен выполняться поиск).
  2. В палитре свойств колонки найдем свойство Режим редактирования и установим его значение в Вход (вместо значения по умолчанию Вход при вводе). Это позволит запускать редактирование ячейки только по явным командам (нажатие клавиш Enter или F2), а ввод символов перенаправит на поиск.
  3. Свойство колонки Редактирование текста переведем в значение Ложь. Данная настройка полностью запрещает прямой ввод текста в ячейку при печати с клавиатуры.
  4. Для самой таблицы формы проверим свойство Поиск при вводе и установим его в значение Использовать.

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

Ограничения штатного механизма поиска в дереве значений

Проанализируем особенности работы штатного поиска при вводе, о которых важно помнить при проектировании интерфейса:

  1. Область поиска: стандартный поиск позиционирует курсор только по активной колонке и только среди тех ветвей дерева, которые развернуты на экране на момент ввода. Свёрнутые узлы платформа автоматически не раскрывает.
  2. Навигация вместо фильтрации: штатный поиск при вводе не скрывает строки, а лишь перемещает фокус на первую подходящую строку.

Альтернативные решения для поиска по иерархии

Если штатного поиска при вводе недостаточно и требуется искать данные по всем уровням иерархии (включая свёрнутые узлы) или выполнять отбор элементов, рассмотрим два распространенных подхода.

Вариант 1. Использование отдельного поля поиска и программная обработка

На форму добавляется отдельное поле ввода со строковым реквизитом (например, ТекстПоиска). В событии ИзменениеТекстаРедактирования или ПриИзменении вызывается программный код, который ищет совпадения и разворачивает найденные ветки дерева.

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


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

Вариант 2. Использование динамического списка

Если данные дерева формируются из иерархического справочника базы данных, вместо реквизита ДеревоЗначений рекомендуется использовать ДинамическийСписок с включенным иерархическим просмотром. Динамический список из коробки поддерживает стандартный элемент «Строка поиска», который умеет фильтровать и отображать данные по всем уровням иерархии без дополнительного программирования.

← На главную