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