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