В конфигурации 1С:Документооборот часто возникает задача: на основании родительской задачи запускается цепочка или пул подчиненных задач (подпроцессов), и после выполнения последней из них необходимо уведомить постановщика исходного процесса. Разберем, как правильно реализовать эту логику с точки зрения структуры метаданных и архитектуры платформы 1С:Предприятие.
Проанализируем частую ошибку начинающих разработчиков — попытку использовать метод Сообщить() или методы открытия форм для отправки экранного сообщения другому пользователю.
Метод Сообщить() работает строго в контексте клиентского сеанса того пользователя, который выполняет действие (в данном случае — последнего исполнителя подзадачи). Серверный код или регламентное задание не могут напрямую вызвать интерактивное диалоговое окно в чужом клиентском приложении. Чтобы постановщик увидел оповещение на своем экране, данные должны быть зафиксированы в информационной базе, а сеанс автора должен их считать (через регламентное задание, обработчик ожидания, механизм оповещений или Систему взаимодействия).
Выясним, как в типовом 1С:Документооборот связаны между собой процессы и задачи. Подчиненные подпроцессы не хранятся просто в табличной части родительской задачи. Связь организуется через специальный реквизит:
ГлавнаяЗадача, который ссылается на родительскую задачу.ГлавнаяЗадача равна проверяемой задаче.Выполнена = Ложь или статус не равен завершающему), считается, что последняя подзадача выполнена.Рассмотрим наиболее гибкий и правильный подход, встроенный в типовую конфигурацию — подсистему Бизнес-события. Этот механизм состоит из детектора и обработчика события, которые выполняются в фоновом режиме через регламентное задание ОбработкаПроизошедшихБизнесСобытий, не блокируя работу исполнителя.
Посмотрим на пример логики проверки завершения подзадач в коде детектора или обработчика:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Задачи.Ссылка КАК Ссылка
|ИЗ
| Задача.ЗадачаИсполнителя КАК Задачи
|ГДЕ
| Задачи.БизнесПроцесс.ГлавнаяЗадача = &ГлавнаяЗадача
| И Задачи.Выполнена = ЛОЖЬ
| И Задачи.ПометкаУдаления = ЛОЖЬ";
Запрос.УстановитьПараметр("ГлавнаяЗадача", ТекущаяГлавнаяЗадача);
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
// Все подчиненные задачи завершены — генерируем событие или уведомление
КонецЕсли;
Разберем типовые возможности настройки бизнес-процессов без программирования:
Если требуется вывести постановщику именно уведомление перед глазами помимо письма на электронную почту, рассмотрим следующие механизмы:
Ознакомление на автора. У автора обновляется счетчик невыполненных задач на начальной странице и в виджете «Мои задачи».НапоминанияПользователя для автора с текущим временем срабатывания. Клиентский сеанс автора при очередном цикле опроса выведет стандартное окно напоминания поверх открытых форм.