При работе в управляемом приложении 1С:Предприятие разработчики и пользователи иногда сталкиваются с неприятным поведением элементов формы. В процессе набора текста в поле ввода вносимые символы неожиданно сбрасываются и заменяются изначальным значением, которое находилось в реквизите при открытии формы. При этом сброс может происходить как непосредственно во время нажатия клавиш, так и через некоторое время, если оставить форму открытой.
Рассмотрим подробно причины такого поведения управляемых форм и разберем способы решения данной проблемы.
Для понимания механики сбоя проанализируем, как платформа 1С 8.3 обрабатывает интерактивный ввод пользователя в управляемых формах.
Во время набора текста в поле ввода набранные символы временно сохраняются в буфере редактирования на стороне клиента. Связанный реквизит объекта при этом еще не обновлен на сервере — это происходит только после завершения ввода (например, при нажатии клавиши Enter или переходе на другой элемент формы).
Если в момент редактирования текста на форме происходят фоновые вызовы сервера или обработка событий, платформа выполняет синхронизацию контекста формы. К сбросу введенного текста обычно приводят следующие факторы:
ПодключитьОбработчикОжидания приводит к периодическому обращению к серверу. Если на сервере значение реквизита еще не изменилось, платформа считывает исходное значение и перезаписывает текущий текстовый буфер на клиенте.ОбработкаОповещения или фоновый обмен данными форма может выполнять перезагрузку или обновление данных (например, вызов ОбновитьЭлементыДополнительныхРеквизитов или метод Прочитать()). Это заставляет платформу обновить элементы формы до их актуального серверного состояния.ОбновлениеТекстаРедактирования установлено в значение Авто, платформа при любом фоновом обновлении контекста принудительно приводит текст в поле ввода к значению связанного реквизита.Если проблема не связана с явным переписыванием значения реквизита в программном коде модуля формы, устранить сброс текста можно через конфигуратор в палитре свойств поля ввода.
Разберем порядок действий по шагам:
Контрагенты) в конфигураторе.Объект.ДокументУдостоверяющийЛичность).Авто).После установки параметра ОбновлениеТекстаРедактирования в значение При изменении значения платформа прекратит автоматически стирать незавершенный ввод пользователя при фоновом обновлении контекста формы.
Если на форме используются обработчики ожидания, запускающие периодические серверные процедуры, рекомендуется защитить фоновый код от вмешательства в процесс редактирования. Для этого в коде модуля формы применяют метод ВводДоступен().
Проанализируем пример кода для фоновой процедуры:
&НаКлиенте
Процедура ОбновитьДанныеФормыФоново()
// Если пользователь в данный момент набирает текст, пропускаем обновление
Если НЕ ВводДоступен() Тогда
Возврат;
КонецЕсли;
// Выполнение серверного обновления данных
ОбновитьДанныеНаСервере();
КонецПроцедуры
Метод ВводДоступен() возвращает Ложь, когда пользователь находится в процессе интерактивного ввода данных в одно из полей формы. Это позволяет избежать нежелательного сброса введенных символов и обеспечивает корректную работу фоновых процессов.