Почему в 1С исчезает текст сразу после ввода в поле и как это исправить?

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

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

Выясним причину: почему платформа «стирает» данные?

Проблема кроется в механизме синхронизации данных между клиентом и сервером в управляемых формах на платформе 8.3.23, 8.3.24 и 8.3.25. Рассмотрим типичный сценарий: вы начинаете вводить текст, но в этот момент форма решает обновиться. Это может быть вызвано:

  1. Срабатыванием обработчика ожидания.
  2. Фоновым обновлением динамического списка.
  3. Появлением рекламных или информационных баннеров (например, «1С:Финансовая отчетность»).
  4. Автоматическим формированием наименования, которое перебивает ручной ввод.

В момент обновления формы значение в поле ввода, которое еще не было «зафиксировано» (не нажат Enter или не совершен переход к другому полю), сбрасывается к тому состоянию, которое хранится в объекте на сервере. Платформа считает, что серверные данные приоритетнее текущего редактируемого текста.

Программное решение: используем метод обхода

Для решения этой проблемы фирма «1С» применяет специальный патч (например, EF_60023407), суть которого заключается в принудительном изменении режима обновления текста. Разберем по шагам, как внедрить это решение в свою конфигурацию. Нам необходимо создать общую процедуру, которая будет менять свойство ОбновлениеТекстаРедактирования с режима «Авто» на «При изменении значения». Кстати, проверить эффект от этого изменения вручную, без изменения кода, можно с помощью инструмента «Редактор форм в режиме предприятия».

Посмотрим на пример кода, который можно разместить в общем модуле или модуле формы:


Процедура ПредотвратитьСбросРедактируемогоЗначения(Форма) Экспорт
    
    // Обход особенности платформы, когда затирается редактируемое значение
    // в текущем элементе при изменении формы.
    Если НЕ ОбщегоНазначенияКлиентСервер.ЭтоВебКлиент() Тогда
        Если ТипЗнч(Форма.ТекущийЭлемент) = Тип("ПолеФормы") 
            И Форма.ТекущийЭлемент.Вид = ВидПоляФормы.ПолеВвода Тогда
            
            Форма.ТекущийЭлемент.ОбновлениеТекстаРедактирования = ОбновлениеТекстаРедактирования.ПриИзмененииЗначения;
            
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры

Важный момент: это свойство ОбновлениеТекстаРедактирования.ПриИзмененииЗначения заставляет платформу игнорировать серверные обновления текста до тех пор, пока пользователь сам не закончит редактирование поля.

Где и когда вызывать это решение?

Проанализируем ситуации, в которых вызов этой процедуры наиболее эффективен. Чаще всего текст пропадает в справочниках БанковскиеСчета и Контрагенты. Мы рекомендуем вставлять вызов данной процедуры в начало обработчиков событий, связанных с изменением или началом выбора, например, в ПриИзменении проблемного поля, а для анализа поведения формы при отладке использовать специализированные инструменты разработчика.

Если вы заметили, что текст пропадает в отчетах (например, в ОСВ при вводе номера счета), попробуйте найти процедуру, отвечающую за вывод баннеров или длительные операции на форме, и интегрируйте вызов метода туда. Это предотвратит потерю фокуса и данных при асинхронном обновлении элементов формы.

Проблема 11-й позиции в выпадающих списках

Рассмотрим еще один связанный баг: при выборе элемента из выпадающего списка (например, контрагента в платежном поручении) на 11-й позиции часто пропадает фокус или возможность выбора клавишей «Вниз». Это связано с механизмом «ленивой загрузки» данных. Платформа подгружает первые 10 элементов, а при попытке перейти к следующему происходит запрос к серверу, который может «разорвать» связь с текущим списком выбора.

В данной ситуации помогает либо использование описанной выше процедуры, либо настройка более точного полнотекстового поиска — один из приемов построения эффективных интерфейсов, — чтобы нужный элемент попадал в первую десятку результатов.

Подведем итоги

Если вы столкнулись с «исчезающим текстом», выполните следующие действия:

  1. Проверьте версию платформы и наличие установленных исправлений (патчей) от 1С.
  2. Проверьте, установлены ли в форме динамические баннеры или обработчики ожидания, которые обновляют данные.
  3. Используйте установку свойства ОбновлениеТекстаРедактирования в значение ПриИзмененииЗначения для проблемных полей ввода.

Такой подход позволит обеспечить стабильную работу пользователей без потери вводимых данных даже при активном фоновом взаимодействии клиента с сервером.

← На главную