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