При разработке внешних обработок в управляемом приложении 1С:Предприятие 8 часто возникает ситуация, когда программно установленное значение реквизита объекта в модуле обработки «исчезает» при возврате исполнения кода в модуль формы. Давайте разберем, почему это происходит и как правильно организовать передачу данных.
Основная причина заключается в том, что в управляемом приложении форма и объект — это разные сущности. Когда мы работаем в модуле формы, мы взаимодействуем с ДаннымиФормы. Когда выполнение кода переходит в модуль объекта, платформа создает экземпляр объекта, который является копией данных из формы.
Если мы изменяем значение реквизита в модуле объекта, эти изменения не попадают автоматически обратно в форму. Более того, если при возвращении на клиентскую сторону платформа выполняет обновление формы, она может «затереть» ваши изменения исходными данными из формы, в которых реквизит остался пустым. Именно поэтому после выполнения методов объекта необходимо явно передать данные обратно в форму.
Для корректного взаимодействия между модулем формы и объектом обработки используйте стандартный алгоритм «преобразования». Чтобы изменения, внесенные в модуле объекта, отразились в форме, необходимо выполнить следующие действия:
РеквизитФормыВЗначение("Объект").ЗначениеВРеквизитФормы(Объект, "Объект").Рассмотрим пример реализации:
&НаСервере
Процедура ВыполнитьДействиеНаСервере()
// 1. Получаем объект из данных формы
ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
// 2. Выполняем логику в модуле объекта
ОбработкаОбъект.ЗаполнитьРеквизит("1234");
// 3. Возвращаем измененный объект в форму
ЗначениеВРеквизитФормы(ОбработкаОбъект, "Объект");
КонецПроцедуры
Иногда, несмотря на правильную архитектуру, разработчики сталкиваются с ситуацией, когда значение не записывается в реквизит с первого раза. В таких случаях, если вы уверены в логике, можно применить метод повторного присвоения, который часто выручает при чтении данных из внешних источников (например, XBase).
Разберем пример кода для обхода такой проблемы:
// При работе с внешними файлами или сложными объектами,
// если наблюдается «пропадание» значения, попробуйте следующее:
Процедура ЗаполнитьРеквизитыДанными()
// Первое присвоение
Объект.РеквизитА = ЗначениеИзФайла;
// Если после отладки значение сбросилось в «0» или пусто,
// выполните повторную запись
Объект.РеквизитА = ЗначениеИзФайла;
КонецПроцедуры
Чтобы окончательно разобраться, почему пропадает значение, рекомендуем предпринять следующие шаги:
ПриЧтенииНаСервере или обработчики ПриИзменении, которые могут принудительно очищать ваш реквизит при обновлении состояния формы.Модифицированность: Проверьте значение свойства ЭтаФорма.Модифицированность. Если оно остается Ложь после изменения данных, значит, платформа не «видит» ваших изменений, и синхронизация не произошла.ИмяНакладной_Тест).Помните: ДанныеФормыСтруктура — это не объект ОбработкаОбъект. Всегда следите за тем, в каком контексте вы находитесь, и используйте методы РеквизитФормыВЗначение и ЗначениеВРеквизитФормы как связующее звено.