В практике разработки на платформе 1С:Предприятие 8.3 часто возникает задача: выполнить определенные действия, которые жестко «зашиты» в контексте формы или требуют клиентского окружения, строго по расписанию. Однако стандартный механизм регламентных заданий работает исключительно на стороне сервера (в процессе rphost), где графический интерфейс отсутствует как класс. Проанализируем, почему возникает эта проблема и какие существуют способы её решения.
Разберем архитектурную ситуацию. Когда срабатывает регламентное задание, оно выполняется в фоновом сеансе на сервере 1С. У этого сеанса нет связанного с ним окна, монитора или мыши. Попытка вызвать метод ОткрытьФорму() внутри серверного кода регламентного задания приведет к ошибке, так как этот метод доступен только &НаКлиенте.
Проанализируем аналогию, приведенную участниками сообщества: сервер — это исполнитель в другом городе. Он получает команду «выполнить приказ», но он понятия не имеет, что происходит на мониторах пользователей в вашем офисе. Он не видит контекста форм и не может ими управлять. Именно поэтому нам требуются механизмы-посредники.
Если код невозможно перенести на сервер (например, из-за использования внешних компонент, работающих только в 32-битной клиентской среде, или сложной визуальной логики), мы можем воспользоваться планировщиком операционной системы. Рассмотрим, как настроить запуск 1С в режиме клиента с автоматическим выполнением обработки.
Для этого создадим исполняемый файл (батник), в котором пропишем параметры запуска. Ключевым моментом здесь является использование ключа /Execute для внешних обработок или комбинации ключей /C и кода в модуле управляемого приложения.
Пример логики запуска через командную строку:
В планировщике Windows прописываем команду запуска:
"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /S"ServerName\BaseName" /N"RobotUser" /P"Password" /Execute "C:\Scripts\MyTask.epf"
В самой обработке MyTask.epf в модуле формы при открытии (событие ПриОткрытии) следует прописать логику завершения работы, чтобы сеанс не «висел» после выполнения задачи:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// Выполняем полезную работу
ВыполнитьДействие();
// Закрываем форму и завершаем работу системы
ЗавершитьРаботуСистемы(Ложь);
КонецПроцедуры
Этот метод считается более «правильным» с точки зрения архитектуры 1С. Рассмотрим его по шагам:
РегистрСведений.ОчередьЗаданийКВыполнению с измерениями (Команда, Параметры) и ресурсом (Статус).Проанализируем пример кода для клиентской части:
// В модуле управляемого приложения или в форме обработки-менеджера
Процедура ПриНачалеРаботыСистемы()
ПодключитьОбработчикОжидания("ПроверитьОчередьЗаданий", 60); // Проверка раз в 60 сек
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьОчередьЗаданий()
Задание = ПолучитьНовоеЗаданиеИзРегистра(); // Вызов серверной функции
Если Задание <> Неопределено Тогда
Обработка = ВнешниеОбработки.Создать(Задание.Путь);
Форма = Обработка.ПолучитьФорму("Форма");
Форма.Открыть();
КонецЕсли;
КонецПроцедуры
Выясним преимущества современного событийного подхода. Если в вашей базе настроена Система взаимодействия, регламентное задание на сервере может отправить программное сообщение пользователю или специальному боту.
Клиентское приложение, получив оповещение о новом сообщении, может мгновенно среагировать и запустить код. Это избавляет систему от постоянных запросов к базе данных (опроса регистра), которые создают лишнюю нагрузку.
Рассмотрим вариант внешнего управления. С помощью скрипта на языке VBScript или Python можно создать объект V83.Application. В отличие от COMConnector, этот объект запускает полноценное интерактивное приложение. Вы можете программно вызвать методы глобального модуля, помеченные как Экспорт, которые, в свою очередь, откроют нужную форму.
Однако стоит помнить про проблему Session 0 Isolation в Windows. Службы и планировщик часто работают в «нулевой сессии», где нет графической оболочки. Если ваш код завязан на координаты экрана или работу с экранными формами, в таком режиме он может отработать некорректно.
Проанализируем ситуацию, когда автор говорит о «лютом коде», который невозможно перенести на сервер. В 90% случаев это заблуждение. Даже если форма визуально «двигает элементы», за этим всегда стоит какая-то логика данных.
Попробуем разделить код:
Всё, что касается расчетов, записи в регистры и проведения документов, выносим в модуль объекта или менеджер в процедуры с признаком Экспорт. Тогда регламентное задание сможет просто вызвать эти методы напрямую, минуя создание и открытие формы. Помните: пользователю не обязательно видеть, как «двигается элемент», если результатом работы является сформированный отчет или созданный документ.
Если же визуальное перемещение критично (например, для имитации действий пользователя в стороннем ПО), используйте сценарии автоматизированного тестирования. Платформа 1С позволяет записывать и воспроизводить действия пользователя в автоматическом режиме, что может стать отличным «запасным выходом» для автоматизации специфических интерфейсных задач.