Как получить управляемую форму на сервере в 1С 8.3 и пересчитать документы в регламентном задании?

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

При разработке фоновых обработок и регламентных заданий в типовых конфигурациях (1С:ЗУП 3, 1С:ERP, 1С:КА) разработчики часто сталкиваются с ситуацией, когда алгоритмы интерактивного заполнения и перерасчета документов привязаны к модулю формы. Попытка вызвать аналогичные процедуры из фонового задания на стороне сервера наталкивается на фундаментальные ограничения клиент-серверной архитектуры платформы 1С:Предприятие 8.3.

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

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

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

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

Как выглядит клиентский вызов перерасчета

Посмотрим на пример кода, который успешно отрабатывает в интерактивной внешней обработке на стороне клиента:


Для Каждого СсылкаНаДокумент Из МассивДокументов Цикл
    ПараметрыФормы = Новый Структура("Ключ", СсылкаНаДокумент);
    ФормаДокумента = ПолучитьФорму("Документ.НачислениеЗарплаты.Форма.ФормаДокумента", ПараметрыФормы);
    ФормаДокумента.ПерезаполнитьДанныеФормыНаСервере();
    ФормаДокумента.Записать();
КонецЦикла;

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

Способ 1. Использование штатных серверных механизмов и менеджера расчета

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

Рассмотрим по шагам, как выполнить расчет на сервере:

  1. Инициализируем объект документа на сервере через СсылкаНаДокумент.ПолучитьОбъект().
  2. Используем серверную подсистему расчета (например, обработку Менеджер расчета зарплаты или функции общего модуля РасчетЗарплатыРасширенный).
  3. Формируем параметры расчета с помощью служебных методов (например, ДополнительныеПараметрыЗаполненияТаблицДокумента()), не обращаясь к реквизитам формы.
  4. Вызываем процедуры расчета табличных частей документа, передавая в них объект документа и структуры параметров.
  5. Записываем и проводим готовый объект методом Записать(РежимЗаписиДокумента.Проведение).

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

Если серверный метод в типовом общем модуле жестко требует структуру, совпадающую по составу с реквизитами формы (тип ДанныеФормыСтруктура), мы можем собрать аналогичную обычную структуру данных на сервере вручную:

  1. Создаем объект Структура с именами ключей, идентичными реквизитам формы документа.
  2. Заполняем структуру данными из реквизитов объекта документа и регистров сведений.
  3. Передаем сформированную структуру в экспортную расчетную процедуру общего модуля.
  4. Переносим рассчитанные таблицы и показатели обратно в объект документа перед его записью.

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

Способ 3. Перенос логики через расширение конфигурации (.cfe)

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

  1. Создаем собственное расширение конфигурации.
  2. Добавляем в расширение собственный общий модуль с признаками Сервер и Вызов сервера.
  3. Адаптируем необходимые алгоритмы расчета из формы, исключая из них клиентские вызовы и элементы интерфейса.
  4. В расширении создаем регламентное задание, которое будет циклически вызывать созданный серверный модуль по установленному расписанию.

Способ 4. Запуск выделенного клиентского сеанса по расписанию

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

  1. На сервере регламентное задание формирует только очередь документов, требующих перерасчета (например, записывает ссылки в специальный регистр сведений).
  2. На отдельной выделенной рабочей станции или сервере настраивается запуск 1С в режиме тонкого клиента через планировщик задач операционной системы с ключом запуска обработки:
    
    1cv8c.exe ENTERPRISE /F "ПутьКБазе" /N "Робот" /P "Пароль" /Execute "C:\Scripts\RecalculateDocs.epf"
    
  3. Внешняя обработка в клиентском сеансе последовательно открывает формы документов из очереди, вызывает штатные экспортные процедуры перерасчета, записывает документы и завершает работу сеанса.

Такой подход сохраняет 100% совместимость с логикой типовых форм и избавляет от необходимости вручную поддерживать серверные аналоги интерфейсного кода.

← На главную