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