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

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

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

Почему свойства «АктивизироватьПоУмолчанию» и «ПодсказкаВвода» не решают задачу

Рассмотрим стандартные механизмы платформы и выясним причину, почему они не подходят для данного сценария:

  1. Свойство элемента «АктивизироватьПоУмолчанию». Данный флаг указывает платформе, какой именно элемент формы должен получить фокус при первичном отображении окна. Однако платформа лишь позиционирует курсор в элементе, не выполняя автоматического выделения уже заполненного текста.
  2. Свойство «ПодсказкаВвода». Подсказка ввода отображается только тогда, когда поле ввода абсолютно пустое. Как только в реквизит помещается значение по умолчанию либо элемент активизируется пользователем, подсказка ввода исчезает и не заменяет реальный текст.

Использование метода «УстановитьГраницыВыделения»

Для программного управления выделением текста в поле ввода платформой 1С предусмотрен метод элемента формы УстановитьГраницыВыделения(). Данный метод работает исключительно в клиентском контексте (Тонкий клиент, Толстый клиент, Веб-клиент) и принимает два обязательных параметра: начальную позицию выделения (нумерация начинается с 1) и конечную позицию.

Посмотрим на пример вызова при внешнем открытии формы:


Форма = ПолучитьФорму("ОбщаяФорма.ПрисоединенныйФайл", ПараметрыФормы, , ПрисоединенныйФайл);
Форма.Открыть();
Форма.ТекущийЭлемент = Форма.Элементы.Описание;
// Устанавливаем границы выделения от первого символа до конца строки
Форма.Элементы.Описание.УстановитьГраницыВыделения(1, СтрДлина(Форма.Объект.Описание) + 1);

Полезный прием: Чтобы не вычислять точную длину текста через строковые функции и не делать лишних серверных вызовов, вторым параметром в метод УстановитьГраницыВыделения() можно передать заведомо большое число (например, 99999). Платформа автоматически ограничит выделение фактической длиной текста в поле ввода:

Форма.Элементы.Описание.УстановитьГраницыВыделения(1, 99999);

Гарантированная установка выделения через обработчик ожидания

Проанализируем поведение управляемых форм при открытии. При установке выделения непосредственно в событии ПриОткрытии или сразу после вызова метода Открыть() возможны ситуации, когда платформа в момент окончательной отрисовки интерфейса (особенно в Веб-клиенте) сбрасывает фокус или снимает выделение.

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

  1. В модуле открываемой формы в процедуре ПриОткрытии подключаем однократный обработчик ожидания.
  2. В отдельной экспортной процедуре модуля формы устанавливаем свойство ТекущийЭлемент и вызываем УстановитьГраницыВыделения().

Посмотрим на пример реализации внутри модуля формы:


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    // Подключаем однократный обработчик с задержкой 0.1 секунды
    ПодключитьОбработчикОжидания("УстановитьФокусИВыделение", 0.1, Истина);
КонецПроцедуры

&НаКлиенте
Процедура УстановитьФокусИВыделение() Экспорт
    // Проверяем доступность элемента формы
    Если Элементы.Описание.Видимость И Элементы.Описание.Доступность Тогда
        ТекущийЭлемент = Элементы.Описание;
        Элементы.Описание.УстановитьГраницыВыделения(1, 99999);
    КонецЕсли;
КонецПроцедуры

Альтернативный подход: очистка значения реквизита

Если значение по умолчанию не несет смысловой нагрузки для пользователя и в 100% случаев должно быть переписано, проанализируем архитектурную альтернативу: передавать в форму специальный параметр (например, ОчищатьОписаниеПриОткрытии) и просто очищать реквизит перед показом. В таком случае фокус через АктивизироватьПоУмолчанию сразу встанет в пустое поле, где пользователь сможет без лишних кликов и выделений ввести нужный текст с клавиатуры.

← На главную