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