Многие пользователи и администраторы систем 1С столкнулись с крайне неприятной ситуацией в последних релизах 1С:Бухгалтерия предприятия 3.0 (начиная с 171-173 релизов) при работе на платформе версии 8.3.25. Суть проблемы заключается в следующем: вы открываете карточку контрагента, начинаете заполнять данные (например, паспортные данные физического лица или назначение платежа в платежном поручении), и через 20–30 секунд текст просто исчезает, оставляя поле пустым. В данной статье мы подробно проанализируем ситуацию, выясним технические причины и разберем по шагам все доступные способы решения.
Давайте сначала проанализируем ситуацию, чтобы понять, что именно вызывает сбой. В ходе коллективного исследования было замечено, что исчезновение текста происходит не мгновенно, а через определенные промежутки времени. Рассмотрим основные триггеры:
Авто) стало более агрессивным.Проверим это простым экспериментом. Попробуем открыть форму любого регламентного задания, начнем вводить текст в карточке контрагента, а затем в окне заданий нажмем Записать. Мы увидим, что активное поле ввода в карточке контрагента мгновенно очистится. Это подтверждает, что любое внешнее событие или оповещение системы заставляет форму обновлять свои данные из объекта базы, затирая то, что пользователь еще не успел зафиксировать (не нажал Enter или не перешел в другое поле).
Самый быстрый способ исправить поведение конкретного поля — изменить его свойства. Это поможет, если проблема локализована в конкретных реквизитах, таких как ДокументУдостоверяющийЛичность или НазначениеПлатежа. Разберем этот процесс по шагам:
Справочник.Контрагенты.Форма.ФормаЭлемента).ОбновлениеТекстаРедактирования.Авто на Не использовать.Важный момент: Если установить значение Всегда, ситуация может усугубиться, так как платформа будет пытаться синхронизировать текст при каждом изменении связанного реквизита. Значение Не использовать отключает принудительное обновление текста из данных объекта, пока пользователь находится в режиме редактирования этого поля.
Исследование кода показало, что в БП 3.0 проблема часто связана с динамическим изменением заголовков и подсказок (placeholders), таких как текст <не заполнен> в полях адреса. Рассмотрим ситуацию подробнее: когда система пытается программно установить текст-заполнитель, это инициирует обновление всей формы. Выясним причину в модуле формы элемента.
Проанализируем процедуру УправлениеФормой. Там можно встретить строки, которые принудительно устанавливают значения для полей адреса. Попробуем закомментировать их, чтобы проверить гипотезу:
// В модуле формы элемента справочника Контрагенты
// Процедура УправлениеФормой(Форма)
// Форма.ФактАдресКонтрагентаСовпадает = НСтр("ru = '<не заполнен>'");
// Форма.ПочтовыйАдресКонтрагентаСовпадает = НСтр("ru = '<не заполнен>'");
После удаления (комментирования) этих строк механизм постоянного обновления визуального состояния формы успокаивается, и текст перестает исчезать при срабатывании фоновых заданий. Это происходит потому, что система перестает «дергать» реквизиты формы, отвечающие за строковое представление адреса.
Разработчики фирмы «1С» признали существование этой ошибки (номер 000173590). Она классифицируется как «Очистка активного поля ввода при обновлении формы в платформе 8.3.25». Рассмотрим, как правильно применить официальные исправления:
EF_000173590 или аналогичных для текущего релиза БП.Посмотрим на рекомендации вендора по обходу проблемы. Официальный совет — «завершать редактирование данных в поле ввода как можно скорее» — звучит иронично, поэтому для реальной работы лучше использовать метод с изменением свойства ОбновлениеТекстаРедактирования или установку свежего релиза платформы (например, 8.3.25.1394 и выше), где часть проблем с отрисовкой была устранена, хотя и не полностью.
Разберем внутреннюю механику. В управляемом приложении 1С существует разделение между данными объекта (на сервере) и данными формы (на клиенте). Когда пользователь печатает в поле, данные находятся в «буфере» элемента управления и еще не попали в реквизит формы Объект.Наименование.
---
В платформе 8.3.25 был изменен алгоритм обработки события ОбновитьОтображениеДанных. Теперь, если форма получает оповещение (через Оповестить() или системное событие), она пытается синхронизировать состояние элементов. Если платформа считает, что данные в объекте «важнее» или «свежее», она заменяет содержимое буфера ввода данными из реквизита. А поскольку ввод еще не завершен, в реквизите пусто — и текст в поле исчезает.
---
Подводя итог нашей совместной работе по поиску решения, выделим оптимальный алгоритм действий:
ОбновлениеТекстаРедактирования = Не использовать для всех длинных строковых полей.EF_..., которые меняют логику работы обработчиков ожидания.ПодключитьОбработчикОжидания, убедитесь, что в вызываемой процедуре не происходит действий, вызывающих перерисовку формы (например, изменение видимости элементов или работа с РеквизитФормыВЗначение), если метод ВводДоступен() возвращает Ложь.Используя эти методы, мы сможем обеспечить стабильную работу пользователей и исключить потерю данных при вводе важной информации в справочники и документы программы.