Разберем распространенную задачу при разработке управляемых форм в 1С:Предприятие 8. При программном переходе к элементу (например, через установка свойства ЭтаФорма.ТекущийЭлемент = Элементы.ИмяПоля) платформа по умолчанию выделяет весь текст в поле ввода. Это поведение заложено разработчиками для быстрого редактирования или перезаписи значения.
Однако в некоторых сценариях требуется снять автоматическое выделение и переместить каретку (курсор) в самый конец строки — так, словно пользователь сам активировал поле и нажал клавишу End.
Выясним, почему стандартный вызов метода УстановитьГраницыВыделения() непосредственно при смене фокуса или в событии редактирования текста не всегда срабатывает сразу:
УстановитьГраницыВыделения() в момент смены фокуса, платформенный механизм отрисовки выполнит ваш программный код, а затем завершит активизацию элемента и повторно выделит весь текст.Разберем наиболее надежный способ решения проблемы. Чтобы метод позиционирования курсора сработал после того, как платформа завершит установку фокуса и автовыделение, его вызов следует вынести в обработчик ожидания с небольшим интервалом (0.1 секунды).
Рассмотрим пример кода на клиенте:
&НаКлиенте
Процедура УстановитьКурсорВКонец()
ДлинаТекста = СтрДлина(Объект.Реквизит1);
Элементы.Реквизит1.УстановитьГраницыВыделения(ДлинаТекста, ДлинаТекста);
КонецПроцедуры
&НаКлиенте
Процедура ПерейтиКПолюВвода()
ЭтаФорма.ТекущийЭлемент = Элементы.Реквизит1;
ПодключитьОбработчикОжидания("УстановитьКурсорВКонец", 0.1, Истина);
КонецПроцедуры
Параметр Истина в методе ПодключитьОбработчикОжидания() означает однократное выполнение процедура, что идеально подходит для сброса выделения.
Проанализируем работу свойства элемента формы МногострочныйРежим. Если у элемента управления установить свойство МногострочныйРежим = Истина, платформа изменяет стандартный сценарий и отключает автоматическое выделение всего текста при получении фокуса.
В этом случае метод УстановитьГраницыВыделения() отрабатывает корректно даже без задержек по времени:
&НаКлиенте
Процедура Реквизит2ИзменениеТекстаРедактирования(Элемент, Текст, СтандартнаяОбработка)
ДлинаСтроки = СтрДлина(Текст);
Элементы.Реквизит2.УстановитьГраницыВыделения(ДлинаСтроки, ДлинаСтроки);
КонецПроцедуры
Рассмотрим еще один способ снять выделение. При записи значения в свойство элемента ВыделенныйТекст платформа заменяет текущий выделенный фрагмент и перемещает курсор в конец вставленного текста.
Если присвоить этому свойству выделенную часть строки или повторно перезаписать текущее значение, автовыделение снимется, а курсор окажется в конце строки.
Посмотрим на вариант с использованием внешнего сценария Windows Script Host. Этот метод позволяет напрямую сгенерировать нажатие клавиши End в активном окне приложения:
&НаКлиенте
Процедура НажатьКлавишуEnd()
WSH = Новый COMОбъект("WScript.Shell");
WSH.SendKeys("{END}");
КонецПроцедуры
Важно: Вариант с WScript.Shell подходит только для тонкого и толстого клиентов под управлением ОС Windows. Для кроссплатформенных решений рекомендуется использовать методы платформы с обработчиком ожидания.