⭐️ Сейчас много разговоров о новом механизме «Очередь», представленном в платформе 8.5.4.
Вендор позиционирует его так:
С помощью очередей можно оптимизировать, например, проведение документов, разделив его на действия, выполняемые синхронно в обработчике проведения, и действия, которые обязательно будут выполнены позже. Запрос на выполнение отложенных действий оформляется в виде сообщения очереди.
И тут сложились звёзды: я понял, что пора рассказать вам, что… очереди в ERP уже есть 😁
➡️ Реализованы они в составе механизма ОтложенныеЗадания.
В него входят как специализированные очереди:
▪️
ЗаданияКРасчетуНормативногоГрафикаПроизводства;▪️
ЗаданияКОтражениюЛимитовПоДаннымБюджетирования;так и УниверсальнаяОчередьОперативныхЗаданий.
Именно о ней поговорим подробнее.
➡️ Как это работает:
▪️ Бизнес-код решает, что задачу нужно выполнить отложенно.
▪️ Вызывается метод постановки задания в очередь.
▪️ Механизм добавляет строку в регистр очереди.
▪️ Позже обработка запускается:
➕ либо явно через
...Запустить(...);➕ либо регламентным заданием
ВыполнениеОтложенныхЗаданий.▪️ Управляющий поток выбирает задания из регистра.
▪️ Задания группируются по аналитике и разбиваются на порции.
▪️ Для каждой порции определяется метод выполнения.
▪️ Порция выполняется в текущем сеансе, в управляющем потоке или в рабочих фоновых потоках.
▪️ Успешные записи удаляются из очереди, а ошибки остаются для повторной попытки или фиксируются как окончательные.
➡️ Пример можно посмотреть в
УчетНДСРФ.ЗарегистрироватьЗаданияАктуализацииСчетаФактуры.Там используется:
▪️
УниверсальнаяОчередьОперативныхЗаданий.ДобавитьЗадание - добавляет задание в очередь и при необходимости инициирует запуск управляющего потока;▪️ управляющий поток, в свою очередь, вызывает обработчик
УчетНДСРФ.ОбновлениеСчетовФактурВыданных.➡️ Доработать механизм достаточно просто.
Например:
▪️ Откройте перечисление
ЗаданияУниверсальнойОчереди и добавьте новый элемент, например МоеНовоеЗадание.▪️ Определите, где будет расположен метод обработки.
В общем случае обработчик лучше размещать там, где уже находится основная бизнес-логика процесса.
▪️ Реализуйте обработчик с сигнатурой:
Процедура ОбработатьМоеНовоеЗадание(
Задания,
ИдентификаторыНеОбработанныхЗаписей,
ДополнительныеСвойства = Неопределено) Экспорт
Для Каждого СтрокаЗадания Из Задания Цикл
Попытка
// Здесь основная бизнес-логика.
Исключение
ТекстОшибки = ОтложенныеЗадания.ТекстОшибкиВыполнения(
Новый Структура("Объект", Объект),
СтрокаЗадания,
ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
ИдентификаторыНеОбработанныхЗаписей.Вставить(
СтрокаЗадания.ИдентификаторЗаписи,
ТекстОшибки);
КонецПопытки;
КонецЦикла;
КонецПроцедуры
▪️ Затем определите метод для нового задания.
В
УниверсальнаяОчередьОперативныхЗаданий.ОчередиЗаданий нужно добавить по аналогии:ДобавитьВложеннуюОчередь(
ТаблицаОчередей,
Перечисления.ЗаданияУниверсальнойОчереди.МоеНовоеЗадание,
"ИмяМодуля.ОбработатьМоеНовоеЗадание");
▪️ После этого задание можно ставить в очередь:
УниверсальнаяОчередьОперативныхЗаданий.ДобавитьЗадание(
СсылкаНаОбъект,
Перечисления.ЗаданияУниверсальнойОчереди.МоеНовоеЗадание);
Профит! 👍
Более сложные кейсы, вплоть до реализации собственной очереди отложенных заданий с многопоточностью, приоритетами и интервалами выполнения - можно посмотреть в общем модуле
ОтложенныеЗадания.ℹ️ Важный нюанс: выполнение отложенного задания может быть назначено сеансу пользователя, отличного от инициатора задания.
Например, пользователь Иванов обработает счёт-фактуру, хотя задание было поставлено пользователем Петров, при проведении РТиУ.
На этом сегодня всё. До связи! ✌️