Таймер в 1С: Предприятии 8
Как выполнить какой-либо программный код спустя определенное время (разово), либо регулярно через определенные промежутки времени.
Вчера попалась задача, связанная с реализацией бизнес-процесса. Нужно было, чтобы через определенное время после создания задачи бизнес-процесс переходил к следующему этапу. Сначала я мыслил в направлении новых объектов, появившихся в 1С 8.1 - это подписки на события и регламентные задания, однако в подписках на события каких-либо явных способов задать задержку я не обнаружил, ну а вместо регламентных заданий я нашел способ, совместимый и с 8.0.
Для этого достаточно воспользоваться процедурой глобального контекста (либо методом формы) ПодключитьОбработчикОжидания
и определить, собственно говоря, обработчик ожидания. В случае использование метода глобального контекста, эта процедура должна располагаться в глобальном (для 1С 8.1) общем модуле или модуле приложения и быть экспортной, а в случае метода формы - обычная процедура в самой форме. К сожалению, передача параметров в обработчик ожидания, по всей видимости, не предусматривается. Так что в случае чего придется использовать глобальные переменные или параметры сеанса (или еще что-нибудь в этом роде).
Параметры процедуры очень простые: сначала указывается имя процедуры-обработчика (в кавычках), вторым параметром - интервал в секундах (с точностью до 1/10, если верить синтаксис-помощнику, при этом для интервалов меньше секунды поддерживается только однократный вызов), и, наконец, третий параметр - это как раз признак однократности вызова обработчика. По умолчанию обработчик будет вызываться регулярно.
В случае регулярного вызова обработчика, возникает вопрос - а как его отключить? Очень просто: ОтключитьОбработчикОжидания(<Имя процедуры>)
, разумеется, имя процедуры кавычится.
И, наконец, небольшой пример, связанный как раз с решением моей задачи по бизнес-процессу (для целей статьи немного упростил). Сначала я объявил числовую константу, чтобы можно было настраивать тайм-аут. Далее в модуле объекта бизнес-процесса я написал обработчик создания задачи (задача у меня называется "утверждение"):
Процедура УтверждениеПриСозданииЗадач(ТочкаМаршрутаБизнесПроцесса, ФормируемыеЗадачи, Отказ) ТаймАут = Константы.ТаймАут.Получить();//*60; Если ТаймАут = 0 Тогда Сообщить("Не установлено время ожидания. Задача не будет автоматически перенаправлена."); Иначе ПодключитьОбработчикОжидания("ПеренаправитьЗадачу", ТаймАут, Истина); КонецЕсли; КонецПроцедуры
Здесь можно видеть закомментированное умножение на 60 - для отладки я интерпретировал значение константы как секунды, в то время как изначально речь шла о минутах.
А вот что у меня получилось в общем модуле:
Процедура ПеренаправитьЗадачу() Экспорт Запрос = Новый Запрос; Запрос.Текст="ВЫБРАТЬ | Задача.Ссылка |ИЗ | Задача.Задача КАК Задача |ГДЕ | Задача.ТочкаМаршрута = &ТочкаМаршрута | И Задача.Дата <= &Дата | И (НЕ Задача.Выполнена)"; Запрос.УстановитьПараметр("ТочкаМаршрута", БизнесПроцессы.Оплата.ТочкиМаршрута.Утверждение); Дата = ТекущаяДата() - Константы.ТаймАут.Получить();//*60; Запрос.УстановитьПараметр("Дата", Дата); Результат = Запрос.Выполнить(); Если Не Результат.Пустой() Тогда Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл Задача = Выборка.Ссылка.ПолучитьОбъект(); Задача.Просрочена = Истина; Задача.ВыполнитьЗадачу(); КонецЦикла; КонецЕсли; КонецПроцедуры
Запросом я получаю невыполненные задачи, время которых меньше текущего за вычетом тайм-аута. В задаче я создал реквизит "Просрочена", который, в принципе, может использоваться для принятия каких-либо решений на последующих этапах бизнес-процесса (хотя, возможно, было бы удобнее использовать реквизит самого бизнес-процесса). Также необходимо отметить, что отбор по конкретному бизнес-процессу (или даже по ссылке на задачу) у меня не происходит (в немалой степени из-за отсутствия возможности непосредственно передавать параметры), поэтому данная процедура "закрывает" все просроченные задачи. Зато данную процедуру можно, например, вызывать при старте системы.
Вот, пожалуй, и все, единственное, что я не упомянул - не стоит ждать от вызова процедуры по таймеру астрономической точности - обработчики вызываются по мере возможности, т.е. лишь приблизительно через указанное количество секунд.
Категория: Программирование, веб | Опубликовано 24.03.2009 | Редакция от 08.01.2017
Похожие материалы
1С Управление торговлей 10.3. Ошибка при печати этикеток: V8 - не хватает памяти
Очень простое решение неочевидной проблемы с нехваткой памяти при печати этикеток. В моем случае - 1С: Предприятие 8.1, Управление торговлей 10.3, Windows 7 (или 8) x64, принтер этикеток Godex EZ-DT-2.
Максимальная длина строкового реквизита 1С: Предприятия 8
Как узнать длину строкового реквизита, указанную в конфигураторе, на примере дополнения числа ведущими нулями.
Проверка типа ссылки в запросах 1С: Предприятия 8
Очередная краткая заметка по не вполне очевидному оператору языка запросов 1С: Предприятия 8.
Особенности распределения Комплексной конфигурации 4.5 (для 1С 7.7)
В этой заметке предлагается способ избежать длительной первичной синхронизации Комплексной конфигурации после ее преобразования в распределенную (во всяком случае, это наблюдалось в релизе 7.70.459).
Позиционирование табличного поля в 1С: Предприятии 8
Рассматривается случай, когда после заполнения табличного поля нужно было выбрать определенную строку.