При разработке фоновых обработок и регламентных заданий в типовых конфигурациях (1С:ЗУП 3, 1С:ERP, 1С:КА) разработчики часто сталкиваются с ситуацией, когда алгоритмы интерактивного заполнения и перерасчета документов привязаны к модулю формы. Попытка вызвать аналогичные процедуры из фонового задания на стороне сервера наталкивается на фундаментальные ограничения клиент-серверной архитектуры платформы 1С:Предприятие 8.3.
Разберем, почему получить форму на сервере невозможно, как устроена логика типовых решений и какие существуют способы для реализации серверного перерасчета документов без снятия конфигурации с поддержки.
Проанализируем технические ограничения платформы 1С:Предприятие:
УправляемаяФорма существует исключительно в сеансах с клиентским контекстом (тонкий клиент, веб-клиент, толстый клиент). В сеансах регламентных и фоновых заданий, COM-соединений, а также HTTP- и Web-сервисов клиентский уровень отсутствует. Функции ПолучитьФорму() и ОткрытьФорму() доступны только на клиенте.РеквизитФормыВЗначение(), ЗначениеВРеквизитФормы(), ДанныеФормыВЗначение() и ЗначениеВДанныеФормы() работают строго внутри контекста исполняемого модуля управляемой формы при вызовах с директивами &НаСервере или &НаСервереБезКонтекста. Вызвать их в общем модуле или модуле менеджера произвольного регламентного задания напрямую невозможно.Посмотрим на пример кода, который успешно отрабатывает в интерактивной внешней обработке на стороне клиента:
Для Каждого СсылкаНаДокумент Из МассивДокументов Цикл
ПараметрыФормы = Новый Структура("Ключ", СсылкаНаДокумент);
ФормаДокумента = ПолучитьФорму("Документ.НачислениеЗарплаты.Форма.ФормаДокумента", ПараметрыФормы);
ФормаДокумента.ПерезаполнитьДанныеФормыНаСервере();
ФормаДокумента.Записать();
КонецЦикла;
Данный код прост и понятен, однако он не может быть перенесен в регламентное задание, так как обращение к объекту ФормаДокумента на сервере вызовет исключительную ситуацию. Выясним, как обойти эту проблему на уровне серверной логики.
В современных конфигурациях модули форм выступают лишь контроллерами интерфейса. Фактическая математика расчета зарплаты и налогов вынесена в общие серверные модули и менеджеры объектов.
Рассмотрим по шагам, как выполнить расчет на сервере:
СсылкаНаДокумент.ПолучитьОбъект().РасчетЗарплатыРасширенный).ДополнительныеПараметрыЗаполненияТаблицДокумента()), не обращаясь к реквизитам формы.Записать(РежимЗаписиДокумента.Проведение).Если серверный метод в типовом общем модуле жестко требует структуру, совпадающую по составу с реквизитами формы (тип ДанныеФормыСтруктура), мы можем собрать аналогичную обычную структуру данных на сервере вручную:
Структура с именами ключей, идентичными реквизитам формы документа.Важно: Этот подход требует детального анализа состава реквизитов формы, но позволяет выполнять расчет полностью на стороне сервера без изменения типового кода конфигурации.
Если логика расчета тесно переплетена с модулем формы и ее трудно отделить от интерфейсных процедур, оптимальным решением без снятия конфигурации с поддержки является механизм расширений:
В ситуациях, когда типовая конфигурация часто обновляется, а переписывание сложных формул расчета нецелесообразно из-за трудоемкости сопровождения, можно использовать архитектурный обходной путь:
1cv8c.exe ENTERPRISE /F "ПутьКБазе" /N "Робот" /P "Пароль" /Execute "C:\Scripts\RecalculateDocs.epf"
Такой подход сохраняет 100% совместимость с логикой типовых форм и избавляет от необходимости вручную поддерживать серверные аналоги интерфейсного кода.