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