Почему при вводе текста в поле формы 1С значения сбрасываются на изначальные и как это исправить?

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

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

Рассмотрим подробно причины такого поведения управляемых форм и разберем способы решения данной проблемы.

Причины сброса вводимого текста

Для понимания механики сбоя проанализируем, как платформа 1С 8.3 обрабатывает интерактивный ввод пользователя в управляемых формах.

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

Если в момент редактирования текста на форме происходят фоновые вызовы сервера или обработка событий, платформа выполняет синхронизацию контекста формы. К сбросу введенного текста обычно приводят следующие факторы:

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

Основное решение: настройка свойств элемента формы

Если проблема не связана с явным переписыванием значения реквизита в программном коде модуля формы, устранить сброс текста можно через конфигуратор в палитре свойств поля ввода.

Разберем порядок действий по шагам:

  1. Откроем управляемую форму нужного объекта (например, форму элемента справочника Контрагенты) в конфигураторе.
  2. Найдем текстовое поле ввода, в котором происходит сброс данных (например, поле с путем к данным Объект.ДокументУдостоверяющийЛичность).
  3. Откроем палитру свойств этого элемента формы.
  4. Найдем свойство ОбновлениеТекстаРедактирования (по умолчанию установлено значение Авто).
  5. Изменим значение свойства на При изменении значения или При смене фокуса.
  6. Сохраним изменения в конфигурации.

После установки параметра ОбновлениеТекстаРедактирования в значение При изменении значения платформа прекратит автоматически стирать незавершенный ввод пользователя при фоновом обновлении контекста формы.

Дополнительное решение: проверка доступности ввода в фоновых процедурах

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

Проанализируем пример кода для фоновой процедуры:


&НаКлиенте
Процедура ОбновитьДанныеФормыФоново()
    
    // Если пользователь в данный момент набирает текст, пропускаем обновление
    Если НЕ ВводДоступен() Тогда
        Возврат;
    КонецЕсли;
    
    // Выполнение серверного обновления данных
    ОбновитьДанныеНаСервере();
    
КонецПроцедуры

Метод ВводДоступен() возвращает Ложь, когда пользователь находится в процессе интерактивного ввода данных в одно из полей формы. Это позволяет избежать нежелательного сброса введенных символов и обеспечивает корректную работу фоновых процессов.

← На главную