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