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

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

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

Ограничения контекста исполнения управляемых форм

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

Из-за этого возникают следующие ограничения:

  1. Вызов метода ПолучитьФорму() в серверном контексте приведет к ошибке выполнения, так как платформа не может инициализировать визуальный интерфейс без клиента.
  2. Интерактивные методы, такие как Предупреждение(), Вопрос() или ПоказатьЗначение(), не работают на сервере.
  3. Данные формы (например, ДанныеФормыСтруктура или ДанныеФормыКоллекция) и сама форма не сериализуются для передачи в фоновые задания на сервер.

Способ 1. Прямая работа с объектами базы данных на сервере

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

Рассмотрим пример внесения изменений в регистр сведений на сервере без участия формы. Для этого сформируем набор записей и установим необходимые отборы:


// Создаем набор записей регистра сведений
НаборЗаписей = РегистрыСведений.МойРегистрСведений.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Измерение1.Установить(ЗначениеИзмерения1);

// Заполняем записи
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Измерение1 = ЗначениеИзмерения1;
НоваяЗапись.Ресурс1 = НовоеЗначение;

// Записываем данные в базу
НаборЗаписей.Записать();

Если требуется изменить объектный документ или справочник, выполним считывание объекта по ссылке через метод ПолучитьОбъект(), изменим реквизиты и вызовем метод Записать().

Способ 2. Эмуляция данных формы с помощью объекта Структура

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

Посмотрим на пример подготовки данных для серверного вызова:


ПараметрыОбработки = Новый Структура;
ПараметрыОбработки.Вставить("Организация", СсылкаНаОрганизацию);
ПараметрыОбработки.Вставить("Период", ТекущаяДата());
ПараметрыОбработки.Вставить("Сумма", 10000);

// Передаем структуру в процедуру общего модуля
МойОбщийМодульСервер.ОбработатьДанные(ПараметрыОбработки);

Способ 3. Использование расширений конфигурации

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

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

← На главную