Как настроить автоподстановку «Непосредственный руководитель» в 1С:Документооборот, если ответственный сам является руководителем?

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

В процессе настройки шаблонов бизнес-процессов в 1С:Документооборот (1С:ДО) администраторы и разработчики часто сталкиваются с ситуацией, когда стандартная автоподстановка Непосредственный руководитель ответственного за документ перестает работать. Чаще всего это происходит, когда автором или ответственным за документ выступает сотрудник, который сам занимает руководящую должность. В таких случаях система выдает критическую ошибку: "Не найдены исполнители для автоподстановки", и процесс останавливается. Рассмотрим подробно, почему это происходит и как правильно настроить систему, чтобы избежать подобных сбоев.

Анализируем причину возникновения ошибки

Для начала разберем механику работы системы. Когда мы выбираем автоподстановку Непосредственный руководитель, программный код 1С:ДО обращается к справочнику СтруктураПредприятия. Система ищет подразделение, в котором числится данный сотрудник, и смотрит на реквизит Руководитель этого подразделения. Выясним причину сбоя: если текущий пользователь (ответственный) и есть руководитель этого подразделения, алгоритм не может назначить его руководителем над самим собой. В этом случае типовой алгоритм пытается подняться на один уровень выше по дереву подразделений (к родительскому подразделению) и ищет руководителя там.

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

Решение 1: Настройка иерархии структуры предприятия

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

  1. Откроем справочник Структура предприятия.
  2. Найдем подразделение, руководителем которого является автор документа.
  3. Убедимся, что у этого подразделения заполнено поле Вышестоящее подразделение (родитель).
  4. Перейдем в карточку вышестоящего подразделения и проверим, заполнен ли там реквизит Руководитель.

Если руководитель самого верхнего уровня (например, Генеральный директор) создает документ, система должна найти "финального" руководителя. В некоторых организациях для этого создают техническое подразделение (например, "Совет директоров" или "Акционеры"), чтобы цепочка не прерывалась на Гендиректоре.

Решение 2: Программная проверка через условие маршрутизации

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


УстановитьПривилегированныйРежим(Истина);

Запрос = Новый Запрос();
Запрос.Текст = 
    "ВЫБРАТЬ
    |	Подразделения.Ссылка
    |ИЗ
    |	Справочник.СтруктураПредприятия КАК Подразделения
    |ГДЕ
    |	Подразделения.Руководитель = &АвторДокумента";

Запрос.УстановитьПараметр("АвторДокумента", Предмет.Ответственный);
РезультатЗапроса = Запрос.Выполнить();

Если НЕ РезультатЗапроса.Пустой() Тогда
    Результат = Истина; // Пользователь является руководителем какого-либо подразделения
Иначе
    Результат = Ложь;
КонецЕсли;

УстановитьПривилегированныйРежим(Ложь);

Данный код проверяет, назначен ли Предмет.Ответственный руководителем в каком-либо элементе справочника СтруктураПредприятия. Если результат Истина, мы можем в шаблоне процесса направить задачу не "Непосредственному руководителю", а, например, секретарю или сразу на следующий этап (согласование с вышестоящим департаментом).

Решение 3: Разбор логики типовой автоподстановки

Для глубокого понимания процесса разберем, как именно 1С:ДО ищет руководителя "вверх" по структуре. Посмотрим на алгоритм, который заложен в конфигурацию. Если Руководитель подразделения совпадает с Ответственным, система запускает цикл Пока Родитель <> Неопределено Цикл.

Рассмотрим фрагмент логики поиска:


// Получаем данные о текущем подразделении пользователя
// Если пользователь сам является руководителем этого подразделения:
Если Руководитель = Ответственный Тогда
    Пока Родитель <> Неопределено Цикл
        Подразделение = Родитель;
        
        // Получаем реквизиты вышестоящего подразделения
        РеквизитыПодразделения = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(
            Подразделение, "Родитель, Руководитель");
        Родитель = РеквизитыПодразделения.Родитель;
        Руководитель = РеквизитыПодразделения.Руководитель;
        
        // Если нашли руководителя, который не является самим ответственным, выходим из цикла
        Если Руководитель <> Ответственный И ЗначениеЗаполнено(Руководитель) Тогда
            Прервать;
        КонецЕсли;
    КонецЦикла;
КонецЕсли;

Возврат Руководитель;

Из этого кода становится ясно: если цикл доходит до самого верха и не находит заполненного руководителя, функция возвращает пустую ссылку. Именно это вызывает ошибку в бизнес-процессе. Поэтому критически важно, чтобы во всей цепочке иерархии были назначены ответственные лица.

Дополнительные рекомендации для 1С:Документооборот 3.0

В версии 3.0 механизмы стали более гибкими, но и более сложными. Разберем несколько нюансов:

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

← На главную