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