Как программно перенаправить задачу другому исполнителю в 1С:Документооборот 2.1?

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

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

Анализ проблемы и типичной ошибки разработчика

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


&НаСервере
Процедура ПодменаИсполнителяЗадачи(Задача) Экспорт
    // ... поиск предмета процесса ...
    ЗадачаОбъект = Задача.ПолучитьОбъект();
    Задача.Исполнитель = ТекПредмет.Предмет.Ответственный; // Возникает ошибка
    Задача.Записать();
КонецПроцедуры

При выполнении этого кода система выдаст ошибку: Поле объекта недоступно для записи (Исполнитель). Посмотрим, почему так происходит.

  1. Синтаксическая ошибка: Разработчик получает объект задачи в переменную ЗадачаОбъект, но затем ошибочно пытается присвоить значение исходной ссылке Задача.Исполнитель. Ссылки в системе 1С всегда доступны только для чтения.
  2. Архитектурная ошибка: Даже если исправить код и обратиться к ЗадачаОбъект.Исполнитель, это будет грубым нарушением бизнес-логики СЭД.

Если мы просто перепишем реквизит исполнителя у объекта, система не зафиксирует историю передачи задачи, предыдущий исполнитель просто "исчезнет" из логов. Кроме того, новому исполнителю не будут предоставлены права доступа к приложенным документам, и он не получит системное или почтовое уведомление о новой задаче.

Правильное решение: программное перенаправление задачи

Чтобы смена исполнителя прошла корректно, с сохранением истории и соблюдением всех прав доступа, в конфигурации 1С:Документооборот предусмотрен специальный программный интерфейс. Рассмотрим подробнее использование типовой процедуры ПеренаправитьЗадачу из серверного общего модуля БизнесПроцессыИЗадачиСервер.

Разберем по шагам пример кода, который выполняет эту операцию:


// Функция принимает ссылку на задачу и ссылку на нового исполнителя (пользователя)
Процедура ПрограммноеПеренаправлениеЗадачи(ЗадачаСсылка, НовыйИсполнитель) Экспорт

    // Подготавливаем структуру с параметрами перенаправления
    ИнфоОПеренаправлении = Новый Структура;
    ИнфоОПеренаправлении.Вставить("Исполнитель", НовыйИсполнитель); 
    ИнфоОПеренаправлении.Вставить("Комментарий", "Перенаправлено автоматически программным алгоритмом");
    ИнфоОПеренаправлении.Вставить("РольИсполнителя", Неопределено); // Используется, если перенаправляем на роль

    Попытка
        // Вызываем типовой метод перенаправления задачи
        БизнесПроцессыИЗадачиСервер.ПеренаправитьЗадачу(ЗадачаСсылка, ИнфоОПеренаправлении);
    Исключение
        // Обработка исключения и запись в Журнал Регистрации
        ЗаписьЖурналаРегистрации("ПрограммноеПеренаправлениеЗадач", 
            УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
    КонецПопытки;

КонецПроцедуры

В случае, если вам необходимо перенаправить сразу группу задач, воспользуйтесь методом Библиотеки стандартных подсистем (БСП): БизнесПроцессыИЗадачиВызовСервера.ПеренаправитьЗадачи. Он принимает на вход массив ссылок на задачи и структуру с информацией о перенаправлении.

Важные нюансы при перенаправлении задач

Для того чтобы предложенный алгоритм работал без сбоев, проанализируем дополнительные условия, которые необходимо соблюдать:

  1. Функциональная опция: Убедитесь, что в системе включена возможность перенаправления. Перейдите в раздел Настройка и администрирование -> Настройка программы -> Процессы и задачи и проверьте флаг Использовать перенаправление задач. При выключенной опции программные методы могут завершаться с ошибкой.
  2. Права доступа: Часто программное перенаправление срабатывает при фоновых событиях (например, подписках) от имени системных пользователей или инициаторов, которым может не хватать прав на конкретный процесс. Рекомендуется выполнять этот код в модуле с установленным свойством "Привилегированный", либо временно повышать права конструкцией УстановитьПривилегированныйРежим(Истина).
  3. Обработка подчиненных задач: Огромный плюс использования штатного метода ПеренаправитьЗадачу заключается в том, что платформа сама проверяет наличие невыполненных подчиненных задач (если задача была делегирована ранее) и корректно их обрабатывает (прерывает или переводит на нового исполнителя). Сделать это простой перезаписью объекта физически невозможно.

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

← На главную