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

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

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

Ограничения платформы 1С при работе с формами на сервере

Ответить на вопрос о создании или открытии формы на сервере можно однозначно: нет, создать или открыть форму на сервере нельзя.

Проанализируем технические причины этого ограничения платформы:

  1. Несериализуемость формы: Объект УправляемаяФорма существует исключительно на клиенте (в тонком, веб-клиенте или толстом клиенте). Преобразовать его в поток данных для передачи между клиентом и сервером невозможно.
  2. Отсутствие интерфейсного контекста: На сервере отсутствуют визуальные элементы управления, коллекции Элементы и обработчики пользовательских событий. В контексте фонового задания, регламентной процедуры или HTTP-сервиса пользовательский интерфейс в принципе не предусмотрен.

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

Решение 1. Рефакторинг функций для разделения интерфейса и данных

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

Вместо передачи объекта формы в качестве параметра передадим целевые коллекции данных или единую структуру контекста. Посмотрим на пример вызова универсальной функции:


// В модуль менеджера или общий серверный модуль выносим чистый алгоритм
Процедура ЗаполнитьДокументПоДанным(ДокументОбъект, ДеревоЗаполнения, ТаблицаПараметров) Экспорт

	// Обработка данных без обращения к интерфейсным элементам
	Для Каждого СсылкаСтрока Из ТаблицаПараметров Цикл
		// Логика заполнения табличной части
	КонецЦикла;

КонецПроцедуры

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

Решение 2. Использование функций конвертации данных формы на сервере

Выясним, как быть, если серверный вызов производится непосредственно из контекста формы. В этом случае на сервере доступны не элементы формы, а реквизиты — ДанныеФормыСтруктура, ДанныеФормыКоллекция и ДанныеФормыДерево.

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

  1. В контекстном серверном вызове переводим данные формы в удобный для обработки прикладной объект ДеревоЗначений или ТаблицаЗначений с помощью функции РеквизитФормыВЗначение:

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

    
    &НаСервереБезКонтекста
    Процедура ЗаполнитьДанныеБезКонтекста(ДанныеКоллекции)
    	
    	Таблица = ДанныеФормыВЗначение(ДанныеКоллекции, Тип("ТаблицаЗначений"));
    	// Логика заполнения таблицы
    	ЗначениеВДанныеФормы(Таблица, ДанныеКоллекции);
    
    КонецПроцедуры
    

Решение 3. Запуск клиентского сеанса в командном режиме

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

В такой ситуации на сервере настраивают запуск отдельного сеанса 1С:Предприятие в режиме тонкого или толстого клиента с использованием ключей командной строки (/C, /Execute). В запущенном клиентском сеансе форма откроется штатным методом ОткрытьФорму() и отработает необходимые интерфейсные функции.

Резюме

Создать или открыть форму непосредственно в серверном контексте невозможно. Наиболее грамотным решением является выделение бизнес-логики из кода формы в модули менеджеров объектов или общие модули с передачей параметров через Структура, ТаблицаЗначений или ДеревоЗначений.

← На главную