В процессе работы с управляемыми формами 1С программисты иногда сталкиваются с крайне неприятным поведением интерфейса: пользователь начинает вводить данные (например, номер телефона), и в какой-то момент весь набранный текст внезапно выделяется. Если пользователь не заметит этого и нажмет следующую клавишу, весь предыдущий ввод удаляется. Это создает серьезные неудобства, особенно в высоконагруженных формах регистрации. В этой статье мы подробно разберем, почему это происходит и как устранить данную проблему.
Первым делом нам необходимо исключить стандартное поведение платформы. У элемента формы ПолеВвода существует специфическое свойство — Выделять текст при входе (в англоязычном варианте SelectOnEntry). Рассмотрим, как оно может влиять на процесс ввода, даже если пользователь уже находится внутри поля.
Проанализируем ситуацию: если в форме происходят какие-либо фоновые события, которые заставляют форму кратковременно перерисовываться или обновлять состояние элементов, платформа может ошибочно интерпретировать это как «повторный вход» в элемент управления. В этом случае срабатывает настройка выделения, и текст подсвечивается целиком.
Что нужно сделать:
Это самое простое решение, которое помогает в большинстве случаев, когда проблема вызвана особенностями отрисовки интерфейса «Такси».
Если изменение свойств элемента не помогло, перейдем к более глубокому анализу. Часто проблема кроется в коде, который выполняется неявно для разработчика. Это могут быть обработчики ожидания или оповещения, зашитые в логику конфигурации (особенно если используется Библиотека стандартных подсистем — БСП).
Разберем, как выявить скрытую активность системы. Нам поможет Замер производительности. Выполним следующие шаги:
Проанализируем полученную таблицу. Нас интересуют методы, которые вызываются часто или в моменты изменения текста. Обратим внимание на такие процедуры, как ОбработкаОповещения, ПодключитьОбработчикОжидания или методы БСП, связанные с проверкой контактной информации. Если в момент выделения срабатывает какой-то серверный вызов, это почти наверняка приводит к обновлению контекста формы и сбросу позиции курсора.
Рассмотрим ситуацию, когда форма кажется «чистой», но на ней присутствуют динамические списки или элементы, связанные с контактной информацией. В конфигурациях вроде «Больница 1.4» или «Управление торговлей» часто работают механизмы автоматического форматирования номера телефона.
Выясним причину через механизмы БСП. Система может пытаться в фоновом режиме проверить номер на дубли или привести его к международному стандарту. В момент выполнения серверного вызова фокус может «дрогнуть». Если на форме есть ДинамическийСписок с автоматическим обновлением (периодом обновления), это также может провоцировать перерисовку элементов ввода.
Рекомендация: попробуем временно отключить на форме все динамические списки и проверить, сохраняется ли проблема. Если выделение прекратилось, значит, причина в обновлении данных списка, которое прерывает фокус ввода пользователя.
Если причину найти не удается, а работать пользователям нужно сейчас, можно прибегнуть к программному управлению границами выделения. Хотя это считается «костылем», в критических ситуациях метод оправдан.
Рассмотрим пример кода, который сбрасывает выделение при изменении текста. Мы можем использовать событие АвтоПодбор или ПриИзменении, но лучше всего контролировать ситуацию через установку границ выделения. Посмотрим на пример реализации:
&НаКлиенте
Процедура НомерТелефонаАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)
// Сбрасываем выделение, устанавливая курсор в конец текста
Элемент.УстановитьГраницыВыделения(СтрДлина(Текст) + 1, СтрДлина(Текст) + 1);
КонецПроцедуры
Также можно попробовать принудительно устанавливать границы выделения в ноль в обработчике ожидания, если выделение происходит из-за внешних событий, которые мы не можем контролировать.
Нельзя игнорировать версию платформы. Версия 8.3.12.1595 является достаточно старой и имеет известные проблемы с отрисовкой интерфейса в режиме «Такси». Разберем внешние факторы, которые могут влиять на поведение 1С на конкретных рабочих местах:
Shift.Выясним причину через обновление: Если есть возможность, проверим работу формы на более свежем релизе платформы (например, ветки 8.3.15 или 8.3.20). Во многих случаях ошибки фокуса были исправлены разработчиками «1С» в последующих обновлениях.
Подводя итог, можно сказать, что самопроизвольное выделение текста — это комплексная проблема. Для ее решения мы рекомендуем придерживаться следующего алгоритма:
SelectOnEntry у элемента формы.УстановитьГраницыВыделения для программного контроля позиции курсора.Следуя этим шагам, мы сможем обеспечить комфортную работу пользователей без случайных потерь введенных данных.