Многие разработчики и пользователи сталкиваются с крайне раздражающей ситуацией: при заполнении наименования банковского счета, контрагента или при наборе номера счета в оборотно-сальдовой ведомости введенный текст внезапно исчезает или заменяется старым значением прямо в процессе печати. Проанализируем, почему это происходит и как программно победить эту особенность платформы.
Проблема кроется в механизме синхронизации данных между клиентом и сервером в управляемых формах на платформе 8.3.23, 8.3.24 и 8.3.25. Рассмотрим типичный сценарий: вы начинаете вводить текст, но в этот момент форма решает обновиться. Это может быть вызвано:
В момент обновления формы значение в поле ввода, которое еще не было «зафиксировано» (не нажат Enter или не совершен переход к другому полю), сбрасывается к тому состоянию, которое хранится в объекте на сервере. Платформа считает, что серверные данные приоритетнее текущего редактируемого текста.
Для решения этой проблемы фирма «1С» применяет специальный патч (например, EF_60023407), суть которого заключается в принудительном изменении режима обновления текста. Разберем по шагам, как внедрить это решение в свою конфигурацию. Нам необходимо создать общую процедуру, которая будет менять свойство ОбновлениеТекстаРедактирования с режима «Авто» на «При изменении значения». Кстати, проверить эффект от этого изменения вручную, без изменения кода, можно с помощью инструмента «Редактор форм в режиме предприятия».
Посмотрим на пример кода, который можно разместить в общем модуле или модуле формы:
Процедура ПредотвратитьСбросРедактируемогоЗначения(Форма) Экспорт
// Обход особенности платформы, когда затирается редактируемое значение
// в текущем элементе при изменении формы.
Если НЕ ОбщегоНазначенияКлиентСервер.ЭтоВебКлиент() Тогда
Если ТипЗнч(Форма.ТекущийЭлемент) = Тип("ПолеФормы")
И Форма.ТекущийЭлемент.Вид = ВидПоляФормы.ПолеВвода Тогда
Форма.ТекущийЭлемент.ОбновлениеТекстаРедактирования = ОбновлениеТекстаРедактирования.ПриИзмененииЗначения;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Важный момент: это свойство ОбновлениеТекстаРедактирования.ПриИзмененииЗначения заставляет платформу игнорировать серверные обновления текста до тех пор, пока пользователь сам не закончит редактирование поля.
Проанализируем ситуации, в которых вызов этой процедуры наиболее эффективен. Чаще всего текст пропадает в справочниках БанковскиеСчета и Контрагенты. Мы рекомендуем вставлять вызов данной процедуры в начало обработчиков событий, связанных с изменением или началом выбора, например, в ПриИзменении проблемного поля, а для анализа поведения формы при отладке использовать специализированные инструменты разработчика.
Если вы заметили, что текст пропадает в отчетах (например, в ОСВ при вводе номера счета), попробуйте найти процедуру, отвечающую за вывод баннеров или длительные операции на форме, и интегрируйте вызов метода туда. Это предотвратит потерю фокуса и данных при асинхронном обновлении элементов формы.
Рассмотрим еще один связанный баг: при выборе элемента из выпадающего списка (например, контрагента в платежном поручении) на 11-й позиции часто пропадает фокус или возможность выбора клавишей «Вниз». Это связано с механизмом «ленивой загрузки» данных. Платформа подгружает первые 10 элементов, а при попытке перейти к следующему происходит запрос к серверу, который может «разорвать» связь с текущим списком выбора.
В данной ситуации помогает либо использование описанной выше процедуры, либо настройка более точного полнотекстового поиска — один из приемов построения эффективных интерфейсов, — чтобы нужный элемент попадал в первую десятку результатов.
Если вы столкнулись с «исчезающим текстом», выполните следующие действия:
ОбновлениеТекстаРедактирования в значение ПриИзмененииЗначения для проблемных полей ввода.Такой подход позволит обеспечить стабильную работу пользователей без потери вводимых данных даже при активном фоновом взаимодействии клиента с сервером.