Как получить доступ к реквизитам формы из модуля менеджера обработки в 1С?

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

При разработке функционала обработок в среде 1С:Предприятие 8.3 начинающие разработчики нередко сталкиваются с необходимостью использовать введенные пользователем данные формы внутри процедур и функций модуля менеджера. При попытке прямого обращения к реквизитам формы платформа выдает ошибку. Проанализируем, почему возникает эта ситуация с точки зрения клиент-серверной архитектуры, и подробно рассмотрим правильные способы решения задачи.

Главная архитектурная причина ограничения: Модуль менеджера (ОбработкаМенеджер.<ИмяОбработки>) исполняется исключительно на стороне сервера и относится ко всему типу метаданных в целом. Он не привязан ни к конкретному экземпляру объекта в памяти (ЭтотОбъект), ни тем более к конкретной форме (ЭтаФорма, Элементы). Форма же представляет собой динамический клиент-серверный объект со своим собственным жизненным циклом и собственным хранилищем данных формы (ДанныеФормыСтруктура, ДанныеФормыКоллекция). Прямого контекстного доступа к элементам или реквизитам управляемой формы из модуля менеджера не существует.

Способ 1. Явная передача значений формы через параметры экспортных методов менеджера

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

Разберем реализацию по шагам:

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

Способ 2. Перенос реквизитов на уровень объекта и использование модуля объекта

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

Посмотрим на алгоритм действий:

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

Способ 3. Передача больших объемов данных через Временное хранилище

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

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

Особенности работы с внешними обработками по стандартам БСП

Если обработка подключается через подсистему «Дополнительные отчеты и обработки» библиотеки стандартных подсистем (БСП), модуль менеджера обычно содержит экспортную процедуру ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполненияКоманды).

Важно помнить:

  1. Если дополнительная обработка открывает собственную форму (вариант запуска ОткрытиеФормы), то модуль менеджера используется только для регистрации метаданных команды, а вся пользовательская работа с реквизитами формы должна происходить непосредственно в модуле этой формы.
  2. Если команда выполняется в контексте формы внешнего объекта (документа или справочника), БСП автоматически помещает в структуру ПараметрыВыполненияКоманды ссылки на исходные данные — например, свойство ПараметрыВыполненияКоманды.МассивОбъектов или ПараметрыВыполненияКоманды.ЭтаФорма, из которых можно прочитать контекст вызывающей формы.
← На главную