Как снять выделение текста и сдвинуть курсор в конец поля ввода в 1С?

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

Разберем распространенную задачу при разработке управляемых форм в 1С:Предприятие 8. При программном переходе к элементу (например, через установка свойства ЭтаФорма.ТекущийЭлемент = Элементы.ИмяПоля) платформа по умолчанию выделяет весь текст в поле ввода. Это поведение заложено разработчиками для быстрого редактирования или перезаписи значения.

Однако в некоторых сценариях требуется снять автоматическое выделение и переместить каретку (курсор) в самый конец строки — так, словно пользователь сам активировал поле и нажал клавишу End.

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

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

  1. Стандартное поведение платформы: При получении фокуса однострочным текстовым полем 1С всегда выделяет всё его содержимое.
  2. Асинхронность отрисовки: Если вызвать метод УстановитьГраницыВыделения() в момент смены фокуса, платформенный механизм отрисовки выполнит ваш программный код, а затем завершит активизацию элемента и повторно выделит весь текст.

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

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

Рассмотрим пример кода на клиенте:


&НаКлиенте
Процедура УстановитьКурсорВКонец()
    ДлинаТекста = СтрДлина(Объект.Реквизит1);
    Элементы.Реквизит1.УстановитьГраницыВыделения(ДлинаТекста, ДлинаТекста);
КонецПроцедуры

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

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

Способ 2. Включение многострочного режима

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

В этом случае метод УстановитьГраницыВыделения() отрабатывает корректно даже без задержек по времени:


&НаКлиенте
Процедура Реквизит2ИзменениеТекстаРедактирования(Элемент, Текст, СтандартнаяОбработка)
    ДлинаСтроки = СтрДлина(Текст);
    Элементы.Реквизит2.УстановитьГраницыВыделения(ДлинаСтроки, ДлинаСтроки);
КонецПроцедуры

Способ 3. Работа со свойством ВыделенныйТекст

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

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

Способ 4. Симуляция нажатия клавиши End через WSH

Посмотрим на вариант с использованием внешнего сценария Windows Script Host. Этот метод позволяет напрямую сгенерировать нажатие клавиши End в активном окне приложения:


&НаКлиенте
Процедура НажатьКлавишуEnd()
    WSH = Новый COMОбъект("WScript.Shell");
    WSH.SendKeys("{END}");
КонецПроцедуры

Важно: Вариант с WScript.Shell подходит только для тонкого и толстого клиентов под управлением ОС Windows. Для кроссплатформенных решений рекомендуется использовать методы платформы с обработчиком ожидания.

← На главную