Рассмотрим распространенную техническую задачу: необходимо по расписанию автоматически создавать документ «Установка цен номенклатуры» и пересчитывать цены по вычисляемым формулам. В конфигурации «Управление торговлей» (начиная с релизов 11.0–11.4) основной расчет цен и обработка формул исторически завязаны на клиентские процедуры и контекст формы документа (например, вызовы метода УстановкаЦенКлиент.РассчитатьВычисляемыеЦены()).
При попытке запустить подобный код в регламентном или фоновом задании разработчики сталкиваются с технической невозможностью открыть форму или вызвать клиентский модуль на сервере. Проанализируем, почему возникает эта ошибка и какими способами можно правильно решить задачу.
Разберем архитектурные особенности платформы «1С:Предприятие 8.3» в режиме управляемого приложения. Фоновые и регламентные задания всегда выполняются исключительно в серверном контексте.
В серверном контексте полностью отсутствуют:
ПолучитьФорму() на сервере недоступен).Попытка обратиться к форме или клиентскому модулю из кода регламентного задания приводит к критической ошибке выполнения. Рассмотрим проверенные варианты решения этой проблемы.
Это наиболее правильный и архитектурно чистый подход с точки зрения разработки. Если вычисление цен должно выполняться без участия пользователя по расписанию, алгоритмы расчета необходимо полностью отвязать от контекста формы.
Для этого выделим математические вычисления из клиентского модуля УстановкаЦенКлиент и вынесем их в модуль объекта внешней обработки или в отдельный серверный общий модуль.
Посмотрим на пример вызова метода из модуля объекта внешней обработки в регламентном задании:
// Выполнение в контексте регламентного задания на сервере
ОбработкаОбъект = ВнешниеОбработки.Создать("C:\Обработки\РасчетЦен.epf", Ложь);
ОбработкаОбъект.РассчитатьИЗаписатьЦеныНаСервере();
Внутри процедуры РассчитатьИЗаписатьЦеныНаСервере() программно создается документ установки цен, заполняются его табличные части и выполняется проведение без обращения к клиентским вызовам:
НовыйДокумент = Документы.УстановкаЦенНоменклатуры.СоздатьДокумент();
НовыйДокумент.Дата = ТекущаяДата();
// Серверный расчет цен по регистрам или курсам валют
// Заполнение табличных частей "ВидыЦен", "Товары"
НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);
Если код расчета цен в форме или клиентском модуле слишком сложен для переработки и часто меняется при обновлениях типовой конфигурации, можно организовать работу через автозапуск тонкого клиента внешним планировщиком задач ОС.
Разберем порядок настройки такой схемы:
RobotUser) с правами на проведение документов ценообразования./C:
1cv8.exe ENTERPRISE /F "D:\Bases\UT" /N "RobotUser" /P "Password" /C "АвтоРасчетЦен"
Процедура ПриНачалеРаботыСистемы()
Если ПараметрЗапуска = "АвтоРасчетЦен" Тогда
// В клиентском контексте доступно открытие формы
Форма = ПолучитьФорму("ВнешняяОбработка.РасчетЦен.Форма.ФормаОбработки");
Форма.Открыть();
Форма.ВыполнитьАвтоматическийРасчет();
// Завершаем сеанс робота
ЗавершитьРаботуСистемы(Ложь);
КонецЕсли;
КонецПроцедуры;
В отличие от 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С не поддерживается. Архитектурно верным решением является перенос алгоритмов вычисления цен в серверные модули. В ситуациях, когда перенос кода слишком трудоемок, следует задействовать автономный клиентский сеанс робота по расписанию ОС.