Как реализовать логику «ИЛИ» для параллельных задач в бизнес-процессах 1С?

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

При проектировании бизнес-процессов в платформе «1С:Предприятие» разработчики часто сталкиваются с фундаментальным ограничением стандартного конструктора карт маршрутов: точка слияния параллельных веток всегда работает исключительно по логике «И» (AND). Это значит, что процесс не двинется дальше до тех пор, пока все параллельные задачи не будут полностью выполнены всеми исполнителями.

Однако в реальном бизнесе часто требуется логика «ИЛИ» (OR). Например, процесс должен пойти дальше, если выполнена хотя бы одна из задач: либо менеджер вручную согласовал документ, либо наступила крайняя дата (например, 10-е число месяца) и сработало автоматическое регламентное событие. Разберем подробно, как обойти стандартное ограничение платформы и элегантно реализовать логику «ИЛИ» в бизнес-процессах 1С.

Способ 1. Разделение веток на карте маршрута без использования точки слияния

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

Рассмотрим по шагам, как настроить такую схему:

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

Выясним особенности поведения платформы при такой настройке. Если правая ветка выполняется быстрее, процесс беспрепятственно пойдет дальше по маршруту. При этом левая задача останется активной («висеть») в списке задач бухгалтера. Бизнес-процесс в 1С примет официальный статус Завершен (свойство Завершен станет Истина) только тогда, когда бухгалтер закроет свою задачу. Это отличное решение, если вторая задача все равно должна быть когда-то выполнена, но процесс не должен ее дожидаться.

Способ 2. Программное автозакрытие параллельной задачи

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

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

Разберем пример реализации через обработчик события ПриВыполнении в модуле задачи:


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

КонецПроцедуры

Этот способ гарантирует порядок в списках задач пользователей: неактуальные задачи не будут накапливаться и отвлекать исполнителей.

Способ 3. Динамический пропуск создания задачи через «ПередСозданиемЗадач»

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

Рассмотрим, как это работает на практике. Если в данном обработчике очистить коллекцию формируемых задач, платформа 1С автоматически «перешагнет» текущую точку маршрута без генерации реальной задачи для пользователя.

Посмотрим на пример кода:


Процедура ТочкаДействияПередСозданиемЗадач(ТочкаМаршрута, ФормируемыеЗадачи, СтандартнаяОбработка)
    
    // Проверяем, выполнено ли уже параллельное условие
    Если ПроверитьВыполнениеПараллельногоУсловия(БизнесПроцесс) Тогда
        // Очищаем коллекцию формируемых задач
        ФормируемыеЗадачи.Oчистить();
        // Платформа мгновенно перейдет к следующему шагу ветки
    КонецЕсли;
    
КонецПроцедуры

Этот метод незаменим, когда создание задачи зависит от динамически меняющихся данных в процессе выполнения параллельных ветвей.

Способ 4. Обход визуальных ограничений Конфигуратора

При попытке связать параллельные ветки в обход стандартной точки слияния разработчики часто сталкиваются с ошибкой валидации схемы в Конфигураторе: «Нельзя из точки разделения нескольким исходящим линиям входить в одну и ту же точку».

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

Визуально это позволит развести соединительные линии на схеме, успешно пройти проверку валидатора платформы и направить логические потоки так, как этого требует бизнес-логика вашей задачи.

Способ 5. Архитектурное решение через вложенные бизнес-процессы

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

Разберем этот подход по шагам:

  1. В точке разделения вместо генерации множества параллельных задач внутри одной схемы мы запускаем несколько независимых вложенных бизнес-процессов.
  2. Основной (родительский) процесс переходит в состояние ожидания завершения дочерних процессов.
  3. Настраиваем подписку на событие завершения бизнес-процесса. Как только один из вложенных процессов успешно завершается (наступило событие «ИЛИ»), программный код родительского процесса принудительно отменяет или прерывает остальные запущенные вложенные процессы и продвигает основную ветку дальше по маршруту.

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

← На главную