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