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