Как очистить дерево значений в модуле менеджера обработки в 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке управляемых форм в платформах 1С:Предприятие часто возникает задача передачи интерфейсных данных в модуль менеджера для серверной обработки. Однако при попытке очистить или изменить реквизит формы с типом ДанныеФормыДерево вне контекста самой формы разработчики сталкиваются с ошибками. Проанализируем, почему возникает эта проблема и какими способами её можно решить.

Выясним причину проблемы и особенности типов данных

В управляемом приложении иерархическое дерево на форме представляет собой объект типа ДанныеФормыДерево, а не привычное прикладное ДеревоЗначений. У объекта ДанныеФормыДерево отсутствует свойство Строки, поэтому вызов конструкции вида Объект.Дерево.Строки.Очистить() вызывает синтаксическую или контекстную ошибку.

Кроме того, в модуле менеджера нет прямого контекста управляемой формы. Это значит, что метод РеквизитФормыВЗначение там недоступен, так как он требует указания строкового имени реквизита контекстной формы.

Рассмотрим способы решения этой задачи в зависимости от того, требуется ли просто очистить дерево или выполнить с ним сложную бизнес-логику.

Способ 1. Прямая очистка элементов коллекции

Если в модуль менеджера передан реквизит формы (или сама форма/обработка как объект данных формы), для очистки дерева не требуется конвертировать его в прикладной тип. Достаточно использовать метод ПолучитьЭлементы(), который доступен у объекта ДанныеФормыДерево.

Разберем пример кода экспортной процедуры в модуле менеджера:


Процедура ОчиститьДеревоНаСервере(ДеревоФормы) Экспорт
    
    // Прямое обращение к коллекции элементов
    ДеревоФормы.ПолучитьЭлементы().Очистить();
    
КонецПроцедуры

Данный способ является самым быстрым, так как не производит накладных расходов на создание копии объекта в памяти и его обратную трансформацию.

Способ 2. Преобразование через ДанныеФормыВЗначение и ЗначениеВДанныеФормы

Если помимо очистки необходимо выполнить обход узлов, поиск или другие манипуляции, доступные только для прикладного типа ДеревоЗначений, следует применить метод ДанныеФормыВЗначение.

В отличие от РеквизитФормыВЗначение, глобальная функция ДанныеФормыВЗначение принимает сам объект данных формы (а не его строковое имя) и доступна на сервере вне контекста формы.

Рассмотрим пошагово процесс конвертации и обратной записи в модуле менеджера:

  1. Передаем реквизит формы ДанныеФормыДерево в процедуру модуля менеджера.
  2. Преобразуем его во временный объект ДеревоЗначений.
  3. Выполняем требуемые операции (очистку, добавление или изменением строк).
  4. Записываем результат обратно в исходный реквизит формы с помощью ЗначениеВДанныеФормы.

Пример реализации в модуле менеджера:


Процедура ОбработатьИОчиститьДерево(ДеревоФормы) Экспорт
    
    // Преобразуем данные формы в полноценное ДеревоЗначений
    ВременноеДерево = ДанныеФормыВЗначение(ДеревоФормы, Тип("ДеревоЗначений"));
    
    // Теперь доступны все свойства и методы ДереваЗначений, включая Строки
    ВременноеДерево.Строки.Очистить();
    
    // Возвращаем измененные данные обратно в реквизит формы
    ЗначениеВДанныеФормы(ВременноеДерево, ДеревоФормы);
    
КонецПроцедуры

Важные рекомендации по архитектуре

При проектировании взаимодействия между формой и модулем менеджера рекомендуем придерживаться следующих правил:

  1. Разделение интерфейса и серверной логики: В модуль менеджера передавайте только целевые коллекции (например, конкретный реквизит дерева), а не весь объект формы без необходимости.
  2. Использование временных хранилищ: Если дерево содержит большой объем данных, эффективнее передавать между контекстами адрес во временном хранилище, где помещен объект ДеревоЗначений.
  3. Выбор правильного метода: Для работы с реквизитами формы вне контекста самой формы всегда используйте ДанныеФормыВЗначение вместо РеквизитФормыВЗначение.
← На главную