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

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

В практике разработки на платформе 1С:Предприятие 8.3 часто возникает задача: выполнить определенные действия, которые жестко «зашиты» в контексте формы или требуют клиентского окружения, строго по расписанию. Однако стандартный механизм регламентных заданий работает исключительно на стороне сервера (в процессе rphost), где графический интерфейс отсутствует как класс. Проанализируем, почему возникает эта проблема и какие существуют способы её решения.

Почему регламентное задание не может открыть форму напрямую

Разберем архитектурную ситуацию. Когда срабатывает регламентное задание, оно выполняется в фоновом сеансе на сервере 1С. У этого сеанса нет связанного с ним окна, монитора или мыши. Попытка вызвать метод ОткрытьФорму() внутри серверного кода регламентного задания приведет к ошибке, так как этот метод доступен только &НаКлиенте.

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

Решение 1: Использование планировщика задач Windows и параметров запуска

Если код невозможно перенести на сервер (например, из-за использования внешних компонент, работающих только в 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 в модуле формы при открытии (событие ПриОткрытии) следует прописать логику завершения работы, чтобы сеанс не «висел» после выполнения задачи:


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    // Выполняем полезную работу
    ВыполнитьДействие();
    // Закрываем форму и завершаем работу системы
    ЗавершитьРаботуСистемы(Ложь);
КонецПроцедуры

Решение 2: Механизм «Очереди заданий» через регистр сведений

Этот метод считается более «правильным» с точки зрения архитектуры 1С. Рассмотрим его по шагам:

  1. Создаем РегистрСведений.ОчередьЗаданийКВыполнению с измерениями (Команда, Параметры) и ресурсом (Статус).
  2. На сервере: Регламентное задание создает запись в этом регистре, указывая, что нужно сделать.
  3. На клиенте: В системе должен быть запущен один постоянно работающий клиентский сеанс («робот»).
  4. В этом сеансе мы подключаем обработчик ожидания, который раз в минуту проверяет наличие новых записей в регистре.

Проанализируем пример кода для клиентской части:


// В модуле управляемого приложения или в форме обработки-менеджера
Процедура ПриНачалеРаботыСистемы()
    ПодключитьОбработчикОжидания("ПроверитьОчередьЗаданий", 60); // Проверка раз в 60 сек
КонецПроцедуры

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

Решение 3: Система взаимодействия (Collaboration System)

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

Клиентское приложение, получив оповещение о новом сообщении, может мгновенно среагировать и запустить код. Это избавляет систему от постоянных запросов к базе данных (опроса регистра), которые создают лишнюю нагрузку.

Решение 4: COM-соединение (V83.Application)

Рассмотрим вариант внешнего управления. С помощью скрипта на языке VBScript или Python можно создать объект V83.Application. В отличие от COMConnector, этот объект запускает полноценное интерактивное приложение. Вы можете программно вызвать методы глобального модуля, помеченные как Экспорт, которые, в свою очередь, откроют нужную форму.

Однако стоит помнить про проблему Session 0 Isolation в Windows. Службы и планировщик часто работают в «нулевой сессии», где нет графической оболочки. Если ваш код завязан на координаты экрана или работу с экранными формами, в таком режиме он может отработать некорректно.

Рекомендации по «чистке» кода

Проанализируем ситуацию, когда автор говорит о «лютом коде», который невозможно перенести на сервер. В 90% случаев это заблуждение. Даже если форма визуально «двигает элементы», за этим всегда стоит какая-то логика данных.

Попробуем разделить код: Всё, что касается расчетов, записи в регистры и проведения документов, выносим в модуль объекта или менеджер в процедуры с признаком Экспорт. Тогда регламентное задание сможет просто вызвать эти методы напрямую, минуя создание и открытие формы. Помните: пользователю не обязательно видеть, как «двигается элемент», если результатом работы является сформированный отчет или созданный документ.

Если же визуальное перемещение критично (например, для имитации действий пользователя в стороннем ПО), используйте сценарии автоматизированного тестирования. Платформа 1С позволяет записывать и воспроизводить действия пользователя в автоматическом режиме, что может стать отличным «запасным выходом» для автоматизации специфических интерфейсных задач.

← На главную