Как отложить выполнение внешней обработки в 1С при запуске из планировщика задач?

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

При автоматизации рутинных операций часто возникает задача запуска внешних обработок по расписанию через планировщик задач Windows (Task Scheduler). Однако в реальной практике может потребоваться универсальное решение: когда эта же обработка запускается автоматически по ночам, но при ручном открытии пользователем в дневное время система дает возможность приостановить выгрузку, проверить настройки или просмотреть подготовленные данные.

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

Способ 1. Использование обработчика ожидания на форме

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

Проанализируем алгоритм работы формы:

  1. При открытии формы взводится флаг Автовыполнение = Истина и подключается обработчик ожидания.
  2. Если пользователь не совершает никаких действий за отведенный таймаут, вызывается процедура запуска обмена/выгрузки.
  3. Если пользователь вручную снимает флаг Автовыполнение, обработчик ожидания отключается, а выполнение фоновой задачи отменяется.
  4. Если пользователь снова устанавливает флаг, таймер запускается повторно.

Посмотрим на пример реализации кода в модуле формы:


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    Если Автовыполнение Тогда
        // Подключаем процедуру, которая сработает через 10 секунд однократно
        ПодключитьОбработчикОжидания("ВыполнитьАвтоматическийЗапуск", 10, Истина);
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура АвтовыполнениеПриИзменении(Элемент)
    Если Автовыполнение Тогда
        ПодключитьОбработчикОжидания("ВыполнитьАвтоматическийЗапуск", 10, Истина);
    Иначе
        ОтключитьОбработчикОжидания("ВыполнитьАвтоматическийЗапуск");
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьАвтоматическийЗапуск()
    Если Автовыполнение Тогда
        ВыполнитьОсновнойАлгоритм();
    КонецЕсли;
КонецПроцедуры

Важно знать: метод ПодключитьОбработчикОжидания выполняется только в момент «состояния покоя» клиентского приложения (когда на клиенте не выполняются другие длительные вычисления). При закрытии формы обработчики ожидания, привязанные к ней, отключаются автоматически.

Способ 2. Запрос подтверждения с таймаутом через диалог

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

Выясним, как это выглядит в коде процедуры обработки:


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

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

Способ 3. Альтернативный подход через параметр командной строки (/C)

Если задача заключается только в том, чтобы разделить автоматический запуск планировщика и обычный интерактивный запуск пользователем, наибоее надежным и архитектурно правильным решением является использование параметра командной строки /C.

Разберем по шагам, как это настроить:

  1. В планировщике задач Windows в параметрах запуска 1С указывается аргумент: /C "AutoStart".
  2. В коде внешней обработки при открытии выполняется проверка свойства глобального контекста ПараметрЗапуска.
  3. Если параметр равен "AutoStart", обработка выполняется в фоновом режиме без задержек и завершает работу сеанса.
  4. Если обработку зашел открыть пользователь вручную из меню 1С, параметр запуска будет пустым — форма откроется в обычном режиме для настройки без срабатывания таймеров.

Пример кода для модуля формы с проверкой параметра запуска:


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

Рекомендации по автоматическому запуску обработок

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

1. Завершение сеанса: Всегда вызывайте метод ЗавершитьРаботуСистемы(Ложь) после выполнения алгоритма при автозапуске, иначе процессы 1cv8c.exe останутся висеть в диспетчере задач Windows.

2. Сохранение настроек: Для сохранения состояний флажков и реквизитов формы между запусками используйте встроенные свойства формы СохранятьДанныеНастроек и АвтоматическоеСохранениеДанныхВНастройках либо храните параметры в формате JSON с помощью объектов ЗаписьJSON и ЧтениеJSON.

← На главную