Как программно определить новый запуск бизнес-процесса согласования для исключения дублирования исполнителей в 1С:Документооборот?

Программист 1С v8.3 (Управляемые формы) 1С:Документооборот IT и автоматизация бизнеса
← На главную

Рассмотрим довольно частую задачу при внедрении и доработке системы «1С:Документооборот 2.1». Зачастую заказчики просят оптимизировать маршруты комплексных процессов, чтобы исключить дублирование задач согласования. Например, если пользователь уже согласовал документ в рамках одного этапа (или находясь в определенной роли), при переходе к следующему этапу этого же комплексного процесса задача на согласование повторно ему прилетать не должна.

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

Вариант 1: Поиск головного процесса через ведущую задачу (Решение проблемы)

В «1С:Документооборот 2.1» широко применяются комплексные и составные бизнес-процессы, внутри которых запускаются подчиненные (вложенные) процессы. Чтобы четко отделить задачи текущего цикла согласования от задач исторически завершенных процессов, нам необходимо привязаться к головному (родительскому) процессу.

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


Функция НайтиГоловнойПроцесс(БизнесПроцесс)
    Возврат БизнесПроцесс.ВедущаяЗадача.БизнесПроцесс;
КонецФункции

Далее, когда мы формируем список исполнителей, мы фильтруем выполненные задачи не просто по документу, а строго по найденному головному процессу:


ГоловнойПроцесс = НайтиГоловнойПроцесс(БизнесПроцесс);
СписокПользователей = ПолучитьВыполненныеЗадачиСогласованияПоПользователям(ПервыйПредмет, ГоловнойПроцесс);

Используя этот метод, мы гарантируем, что наша доработка будет проверять наличие виз сотрудника только в рамках текущего активного дерева бизнес-процессов, игнорируя старые завершенные процессы.

Вариант 2: Использование регистра сведений «Данные бизнес-процессов»

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

Если нам нужно найти ранее запущенный, но не завершенный процесс (например, для запрета старта дублирующего процесса), мы можем использовать следующий запрос. В условиях запроса мы проверяем флаги Завершен и Стартован, а также тип процесса:


Функция ЕстьРанееЗапущенныйБизнесПроцесс(ОсновнойПредмет, ТипБизнесПроцесса)
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |    ДанныеБизнесПроцессов.БизнесПроцесс КАК БизнесПроцесс,
        |    ДанныеБизнесПроцессов.Завершен КАК Завершен
        |ИЗ
        |    РегистрСведений.ДанныеБизнесПроцессов КАК ДанныеБизнесПроцессов
        |ГДЕ
        |    ДанныеБизнесПроцессов.ОсновнойПредмет = &ОсновнойПредмет
        |    И ДанныеБизнесПроцессов.ВедущаяЗадача = ЗНАЧЕНИЕ(Задача.ЗадачаИсполнителя.ПустаяСсылка)
        |    И ТИПЗНАЧЕНИЯ(ДанныеБизнесПроцессов.БизнесПроцесс) = &ТипБизнесПроцесса
        |    И ДанныеБизнесПроцессов.Завершен = ЛОЖЬ
        |    И ДанныеБизнесПроцессов.Стартован = ИСТИНА
        |    И ДанныеБизнесПроцессов.ПометкаУдаления = ЛОЖЬ";
        
    Запрос.УстановитьПараметр("ОсновнойПредмет", ОсновнойПредмет);
    Запрос.УстановитьПараметр("ТипБизнесПроцесса", ТипБизнесПроцесса);
    
    Результат = Запрос.Выполнить;
    Возврат НЕ Результат.Пустой();
КонецФункции

Для поиска именно завершенных процессов достаточно изменить в условии параметр ДанныеБизнесПроцессов.Завершен = ИСТИНА. Важно: этот способ сработает, только если у процесса заполнен основной предмет.

Вариант 3: Анализ текущей точки маршрута

У каждого бизнес-процесса есть маршрут, а у маршрута — точки (например: Подготовка, Старт, Согласовать, Завершение). Мы можем понять, что процесс находится в самом начале своего жизненного цикла, проверив его текущую точку маршрута.

Если мы перехватываем логику при обработке старта, мы можем сравнить текущую точку с предопределенной точкой маршрута (например, БизнесПроцессы.Согласование.ТочкиМаршрута.Старт). Если процесс только стартовал, мы инициализируем списки пользователей заново, игнорируя историю предыдущих итераций.

Дополнительные аспекты оптимизации согласований

Рассмотрим дополнительные возможности платформы и конфигурации, которые помогут вам избежать лишнего кодирования или учесть скрытые подводные камни при работе с маршрутами.

  1. Использование типовых «Условий маршрутизации»: Для исключения дублирующихся пользователей не всегда обязательно вмешиваться в модули проведения. Вы можете использовать встроенный механизм «Условия маршрутизации» в режиме пользователя. Там можно написать небольшой скрипт, который обратится к истории виз. Если скрипт возвращает Ложь, программа автоматически пропустит данного согласующего на текущем шаге, не ломая общую структуру процесса.
  2. Нюансы ролевой адресации: Частая причина, по которой человеку прилетает две задачи — это его участие в процессе под разными «амплуа». Например, как конкретный сотрудник (Иванов И.И.) и как исполнитель роли (Руководитель отдела). При программном поиске выполненных задач всегда проверяйте не только справочник «Пользователи», но и записи в регистре сведений ИсполнителиРолей.
  3. Прерванные процессы: Будьте осторожны с процессами, которые были принудительно прерваны администратором (кнопка «Стоп»). В 1С:Документооборот результаты таких процессов могут быть полностью очищены (включая визы). Программный поиск может не найти следов участия пользователя, и при новом старте ему прилетит задача, даже если ранее он ее уже выполнял.
  4. Разница версий (2.1 и 3.0): Учтите, что вся архитектура комплексных и составных процессов с вложенными подпроцессами (где мы ищем ВедущаяЗадача) актуальна для редакции 2.1. В «1С:Документооборот 3.0» механизм маршрутизации полностью переработан: используются «Правила обработки» и «Действия». Там система лучше отслеживает циклы документа самостоятельно, а для блокировки автоматического изменения состава исполнителей предусмотрен специальный признак «Замок».

Проанализировав все вышеописанные методы, вы сможете корректно выстроить программную логику исключения дублей исполнителей и обеспечить правильный запуск повторных согласований в вашей системе электронного документооборота.

← На главную