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