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