Как открыть форму внешней обработки и рассчитать цены в регламентном задании 1С

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

Рассмотрим распространенную техническую задачу: необходимо по расписанию автоматически создавать документ «Установка цен номенклатуры» и пересчитывать цены по вычисляемым формулам. В конфигурации «Управление торговлей» (начиная с релизов 11.0–11.4) основной расчет цен и обработка формул исторически завязаны на клиентские процедуры и контекст формы документа (например, вызовы метода УстановкаЦенКлиент.РассчитатьВычисляемыеЦены()).

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

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

Разберем архитектурные особенности платформы «1С:Предприятие 8.3» в режиме управляемого приложения. Фоновые и регламентные задания всегда выполняются исключительно в серверном контексте.

В серверном контексте полностью отсутствуют:

  1. Объекты управляемых форм и элементов интерфейса (метод ПолучитьФорму() на сервере недоступен).
  2. Общие модули с признаком «Клиент (управляемое приложение)».
  3. Интерактивные методы взаимодействия с пользователем.

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

Способ 1. Перенос логики расчета в серверный модуль или модуль объекта

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

Для этого выделим математические вычисления из клиентского модуля УстановкаЦенКлиент и вынесем их в модуль объекта внешней обработки или в отдельный серверный общий модуль.

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


// Выполнение в контексте регламентного задания на сервере
ОбработкаОбъект = ВнешниеОбработки.Создать("C:\Обработки\РасчетЦен.epf", Ложь);
ОбработкаОбъект.РассчитатьИЗаписатьЦеныНаСервере();

Внутри процедуры РассчитатьИЗаписатьЦеныНаСервере() программно создается документ установки цен, заполняются его табличные части и выполняется проведение без обращения к клиентским вызовам:


НовыйДокумент = Документы.УстановкаЦенНоменклатуры.СоздатьДокумент();
НовыйДокумент.Дата = ТекущаяДата();

// Серверный расчет цен по регистрам или курсам валют
// Заполнение табличных частей "ВидыЦен", "Товары"

НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);

Способ 2. Запуск выделенного клиентского сеанса (клиентский робот)

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

Разберем порядок настройки такой схемы:

  1. В базе создается служебный пользователь (например, RobotUser) с правами на проведение документов ценообразования.
  2. Планировщик задач Windows по расписанию запускает сеанс 1С с передачей ключа /C:

    1cv8.exe ENTERPRISE /F "D:\Bases\UT" /N "RobotUser" /P "Password" /C "АвтоРасчетЦен"

  3. В модуле управляемого приложения обрабатывается параметр запуска при старте системы:

Процедура ПриНачалеРаботыСистемы()
    Если ПараметрЗапуска = "АвтоРасчетЦен" Тогда
        // В клиентском контексте доступно открытие формы
        Форма = ПолучитьФорму("ВнешняяОбработка.РасчетЦен.Форма.ФормаОбработки");
        Форма.Открыть();
        Форма.ВыполнитьАвтоматическийРасчет();
        
        // Завершаем сеанс робота
        ЗавершитьРаботуСистемы(Ложь);
    КонецЕсли;
КонецПроцедуры;

Способ 3. Использование Automation-сервера (V83.Application)

В отличие от V83.COMConnector, который работает строго в серверном контексте и также не имеет доступа к интерактивным объектам, использование Automation-сервера V83.Application позволяет поднять полноценный клиентский процесс прямо из серверного кода регламентного задания.

Рассмотрим пример подключения к базе через OLE-соединение:


V83 = Новый COMОбъект("V83.Application");
Открытие = V83.Connect("File=""D:\Bases\UT""; Usr=""RobotUser""; Pwd=""Password"";");

Если Открытие Тогда
    // Внутри OLE-сеанса доступен клиентский контекст
    Обработка = V83.ВнешниеОбработки.Создать("C:\Обработки\РасчетЦен.epf");
    Форма = Обработка.ПолучитьФорму();
    Форма.Открыть();
    Форма.РассчитатьВычисляемыеЦены();
КонецЕсли;

Обратите внимание: данный метод требует настройки прав на запуск COM/OLE-компонентов на сервере 1С и задействует отдельную клиентскую лицензию на время работы процесса.

Резюме

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

← На главную