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

Вчера попалась задача, связанная с реализацией бизнес-процесса. Нужно было, чтобы через определенное время после создания задачи бизнес-процесс переходил к следующему этапу. Сначала я мыслил в направлении новых объектов, появившихся в 1С 8.1 - это подписки на события и регламентные задания, однако в подписках на события каких-либо явных способов задать задержку я не обнаружил, ну а вместо регламентных заданий я нашел способ, совместимый и с 8.0.

Для этого достаточно воспользоваться процедурой глобального контекста (либо методом формы) ПодключитьОбработчикОжидания и определить, собственно говоря, обработчик ожидания. В случае использование метода глобального контекста, эта процедура должна располагаться в глобальном (для 1С 8.1) общем модуле или модуле приложения и быть экспортной, а в случае метода формы - обычная процедура в самой форме. К сожалению, передача параметров в обработчик ожидания, по всей видимости, не предусматривается. Так что в случае чего придется использовать глобальные переменные или параметры сеанса (или еще что-нибудь в этом роде).

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

В случае регулярного вызова обработчика, возникает вопрос - а как его отключить? Очень просто: ОтключитьОбработчикОжидания(<Имя процедуры>), разумеется, имя процедуры кавычится.

И, наконец, небольшой пример, связанный как раз с решением моей задачи по бизнес-процессу (для целей статьи немного упростил). Сначала я объявил числовую константу, чтобы можно было настраивать тайм-аут. Далее в модуле объекта бизнес-процесса я написал обработчик создания задачи (задача у меня называется "утверждение"):

Процедура УтверждениеПриСозданииЗадач(ТочкаМаршрутаБизнесПроцесса, ФормируемыеЗадачи, Отказ)
  ТаймАут = Константы.ТаймАут.Получить();//*60;
  Если ТаймАут = 0 Тогда
    Сообщить("Не установлено время ожидания. Задача не будет автоматически перенаправлена.");
  Иначе
    ПодключитьОбработчикОжидания("ПеренаправитьЗадачу", ТаймАут, Истина);
  КонецЕсли;
КонецПроцедуры

Здесь можно видеть закомментированное умножение на 60 - для отладки я интерпретировал значение константы как секунды, в то время как изначально речь шла о минутах.

А вот что у меня получилось в общем модуле:

Процедура ПеренаправитьЗадачу() Экспорт
  Запрос = Новый Запрос;
  Запрос.Текст="ВЫБРАТЬ
    | Задача.Ссылка
    |ИЗ
    | Задача.Задача КАК Задача
    |ГДЕ
    |  Задача.ТочкаМаршрута = &ТочкаМаршрута
    |  И Задача.Дата <= &Дата
    |  И (НЕ Задача.Выполнена)";
  Запрос.УстановитьПараметр("ТочкаМаршрута", БизнесПроцессы.Оплата.ТочкиМаршрута.Утверждение);
  Дата = ТекущаяДата() - Константы.ТаймАут.Получить();//*60;
  Запрос.УстановитьПараметр("Дата", Дата);
  Результат = Запрос.Выполнить();
  Если Не Результат.Пустой() Тогда  
    Выборка = Результат.Выбрать();
    Пока Выборка.Следующий() Цикл
      Задача = Выборка.Ссылка.ПолучитьОбъект();
      Задача.Просрочена = Истина;
      Задача.ВыполнитьЗадачу();
    КонецЦикла;
  КонецЕсли;
КонецПроцедуры

Запросом я получаю невыполненные задачи, время которых меньше текущего за вычетом тайм-аута. В задаче я создал реквизит "Просрочена", который, в принципе, может использоваться для принятия каких-либо решений на последующих этапах бизнес-процесса (хотя, возможно, было бы удобнее использовать реквизит самого бизнес-процесса). Также необходимо отметить, что отбор по конкретному бизнес-процессу (или даже по ссылке на задачу) у меня не происходит (в немалой степени из-за отсутствия возможности непосредственно передавать параметры), поэтому данная процедура "закрывает" все просроченные задачи. Зато данную процедуру можно, например, вызывать при старте системы.

Вот, пожалуй, и все, единственное, что я не упомянул - не стоит ждать от вызова процедуры по таймеру астрономической точности - обработчики вызываются по мере возможности, т.е. лишь приблизительно через указанное количество секунд.


Категория: Программирование, 1С | Опубликовано 24.03.2009 | Редакция от 08.01.2017

Похожие материалы:


Комментарии, обсуждение

комментарии простроенны на платформе Disqus