Четверг, 28.03.2024. 22:04 | RSS
 Приветствуем Вас, Гость! Регистрация | Вход с параметрами
Меню сайта
Категории каталога
Обзоры оборудования [44]
Обзоры различного оборудования, побывавшего в руках автора сайта: ноутбуки, винчестеры, мониторы, материнские платы, видеокарты и др.
Тестирование [7]
Отчасти перекликается с обзорами оборудования, однако здесь сделан упор именно на тестирование в каких-либо бенчмарках
Практика апгрейда [9]
Статьи, посвященные вопросам апгрейда компьютера. Примеры конфигураций, оценка стоимости
Решение проблем [5]
Рассматриваются различные мелкие и не очень проблемы и их возможные варианты решения
Обзоры софта [6]
Обзоры программного обеспечения: антивирусы, браузеры, утилиты и др.
Игры [37]
Обзоры игр, советы по прохождению
Программирование, 1С [13]
Освещаются вопросы по программированию, в немалой степени - на платформе 1С: Предприятия
Цифровое фото, видео [5]
Выделенный раздел, посвященным цифровым фотоаппаратам и видеокамерам
Вход на сайт
Параллельные проекты
Друзья сайта
Статистика

Околокомпьютерный сайт Дмитрия Косолапова
Главная » Статьи » Программирование, 1С

Таймер в 1С: Предприятии 8

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

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

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

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

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

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

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

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

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

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

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

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

Разное по программированию 1С (на форуме)

Категория: Программирование, 1С | Добавил: Vetkhy (24.03.2009) | Автор: Дмитрий Косолапов | Просмотров: 12502

Метки: таймер,

Всего комментариев: 1
0  
1 Дмитрий   (21.04.2010 22:46) [Материал]
Регламентные задания могут выполняться хоть каждую секунду. Настроить не составляет проблем. Имхо, автор не разобрался. Мнение автора ошибочно.

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Сайт управляется системой uCozДмитрий Косолапов © 2007-2024