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