Как получить и использовать объект формы на сервере в 1С 8.3

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

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

Почему нельзя получить форму на сервере

В документации платформы указано, что программный объект формы может существовать как на клиенте, так и на сервере. Однако это утверждение часто интерпретируют неверно. Выясним причину такого ограничения:

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

Правильное архитектурное решение: вынос логики из формы

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

Рассмотрим, как правильно организовать программный код для повторного использования на сервере:

  1. Инкапсуляция в модуле объекта: создадим экспортные методы пересчета и заполнения в модуле самого объекта (документа или справочника).
  2. Использование модуля менеджера или общего модуля: универсальные алгоритмы обработки табличных частей вынесем в серверный общий модуль.

Посмотрим на пример выноса расчета в модуль объекта документа:


// В Модуле объекта документа:
Процедура РассчитатьСуммуСтроки(СтрокаТЧ) Экспорт
    СтрокаТЧ.Сумма = СтрокаТЧ.Количество * СтрокаТЧ.Цена;
    СтрокаТЧ.СуммаНДС = СтрокаТЧ.Сумма * (СтрокаТЧ.СтавкаНДС / 100);
КонецПроцедуры

Процедура ЗаполнитьРеквизитыПоУмолчанию() Экспорт
    // Логика инициализации и пересчетов
    Для Каждого Стр Из Товары Цикл
        РассчитатьСуммуСтроки(Стр);
    КонецЦикла;
КонецПроцедуры

Теперь этот код можно вызвать как из серверных процедур формы при интерактивной работе пользователя, так и в серверном коде загрузки данных без создания формы:


// Вызов из серверного контекста (фоновое задание, HTTP-сервис, внешняя обработка)
ДокументОбъект = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
// Заполнение базовых реквизитов...
ДокументОбъект.ЗаполнитьРеквизитыПоУмолчанию();
ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);

Как поступить, если конфигурация типовая и закрыта от изменений

Проанализируем ситуации, когда изменить исходный код модулей конфигурации нельзя:

  1. Использование расширений конфигурации: создадим расширение, подключим к нему нужный объект и перенесем расчетные процедуры в модуль объекта или менеджер расширения с аннотацией &Вместо или &После.
  2. Использование API типовых решений: в большинстве типовых конфигураций (1С:ERP, 1С:Комплексная автоматизация, 1С:Управление торговлей) алгоритмы интерактивного пересчета уже вынесены в специализированные общие модули обработки табличных частей. Рекомендуется использовать методы этих модулей вместо попыток эмуляции форм.
  3. Automation-клиент (V83.Application): если требуется воспроизвести работу интерактивных механизмов без изменения конфигурации, можно программно запустить клиентский сеанс через COM-объект V83.Application, в котором методы создания форм доступны. Однако этот способ требует дополнительной клиентской лицензии, доступен только под управлением Windows и ресурсоемок.

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

← На главную