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