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