При разработке интерфейсов в 1С часто возникает задача ускорить ввод информации пользователем. Типичный сценарий: в поле ввода строкового реквизита при открытии формы подставляется значение по умолчанию, но в большинстве случаев пользователю необходимо заменить его на собственное значение. Если просто передать фокус на элемент, курсор встанет в начало или конец строки, вынуждая пользователя вручную стирать старый текст или выделять его сочетанием клавиш. Разберем, как программно активизировать поле ввода и выделить весь его текст при открытии управляемой формы.
Рассмотрим стандартные механизмы платформы и выясним причину, почему они не подходят для данного сценария:
Для программного управления выделением текста в поле ввода платформой 1С предусмотрен метод элемента формы УстановитьГраницыВыделения(). Данный метод работает исключительно в клиентском контексте (Тонкий клиент, Толстый клиент, Веб-клиент) и принимает два обязательных параметра: начальную позицию выделения (нумерация начинается с 1) и конечную позицию.
Посмотрим на пример вызова при внешнем открытии формы:
Форма = ПолучитьФорму("ОбщаяФорма.ПрисоединенныйФайл", ПараметрыФормы, , ПрисоединенныйФайл);
Форма.Открыть();
Форма.ТекущийЭлемент = Форма.Элементы.Описание;
// Устанавливаем границы выделения от первого символа до конца строки
Форма.Элементы.Описание.УстановитьГраницыВыделения(1, СтрДлина(Форма.Объект.Описание) + 1);
Полезный прием: Чтобы не вычислять точную длину текста через строковые функции и не делать лишних серверных вызовов, вторым параметром в метод УстановитьГраницыВыделения() можно передать заведомо большое число (например, 99999). Платформа автоматически ограничит выделение фактической длиной текста в поле ввода:
Форма.Элементы.Описание.УстановитьГраницыВыделения(1, 99999);
Проанализируем поведение управляемых форм при открытии. При установке выделения непосредственно в событии ПриОткрытии или сразу после вызова метода Открыть() возможны ситуации, когда платформа в момент окончательной отрисовки интерфейса (особенно в Веб-клиенте) сбрасывает фокус или снимает выделение.
Для гарантированного выделения текста правильнее инкапсулировать логику внутри модуля самой открываемой формы и вызывать установку границ через однократный обработчик ожидания с минимальной задержкой. Разберем по шагам, как это реализовать:
ПриОткрытии подключаем однократный обработчик ожидания.ТекущийЭлемент и вызываем УстановитьГраницыВыделения().Посмотрим на пример реализации внутри модуля формы:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// Подключаем однократный обработчик с задержкой 0.1 секунды
ПодключитьОбработчикОжидания("УстановитьФокусИВыделение", 0.1, Истина);
КонецПроцедуры
&НаКлиенте
Процедура УстановитьФокусИВыделение() Экспорт
// Проверяем доступность элемента формы
Если Элементы.Описание.Видимость И Элементы.Описание.Доступность Тогда
ТекущийЭлемент = Элементы.Описание;
Элементы.Описание.УстановитьГраницыВыделения(1, 99999);
КонецЕсли;
КонецПроцедуры
Если значение по умолчанию не несет смысловой нагрузки для пользователя и в 100% случаев должно быть переписано, проанализируем архитектурную альтернативу: передавать в форму специальный параметр (например, ОчищатьОписаниеПриОткрытии) и просто очищать реквизит перед показом. В таком случае фокус через АктивизироватьПоУмолчанию сразу встанет в пустое поле, где пользователь сможет без лишних кликов и выделений ввести нужный текст с клавиатуры.