Как избавиться от лишних действий и настроить подмену формы задачи на форму бизнес-процесса в 1С?

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

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

Почему старые приемы из обычного приложения не работают в управляемых формах

В конфигурациях на платформе 1С:Предприятие 8.1 и в обычном приложении подмена форм нередко реализовывалась непосредственно в обработчике ОбработкаИнтерактивнойАктивации точки маршрута или самой задачи. Код мог выполняться на стороне клиента в толстом клиенте, позволяя напрямую вызвать интерактивное открытие окна через ПолучитьФорму().Открыть().

В управляемом приложении клиент-серверная архитектура строго разграничена. Событие ОбработкаИнтерактивнойАктивации исполняется строго на стороне сервера, где интерактивные вызовы клиентского интерфейса платформой заблокированы и вызывают исключение («Интерактивные операции недоступны»). Поэтому для реализации удобного выполнения этапов бизнес-процессов применяются другие подходы.

Способ 1. Программная подмена формы через модуль менеджера задачи

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

Разберем реализацию этого механизма по шагам:

  1. Откроем модуль менеджера задачи и добавим предопределенный обработчик ОбработкаПолученияФормы.
  2. Считаем из ссылки на задачу ключевые реквизиты — ссылку на родительский бизнес-процесс и текущую точку маршрута.
  3. Определим метаданные бизнес-процесса и обратимся к его менеджеру за целевой формой.
  4. Перенаправим открытие на нужную форму и отключим стандартную обработку.

Посмотрим на пример реализации в модуле менеджера задачи:


Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка)

    Если ВидФормы = "ФормаОбъекта" И Параметры.Свойство("Ключ") И ЗначениеЗаполнено(Параметры.Ключ) Тогда
        
        ЗадачаСсылка = Параметры.Ключ;
        Реквизиты = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ЗадачаСсылка, "БизнесПроцесс, ТочкаМаршрута");
        
        Если ЗначениеЗаполнено(Реквизиты.БизнесПроцесс) Тогда
            ТипБизнесПроцесса = Метаданные.НайтиПоТипу(ТипЗнч(Реквизиты.БизнесПроцесс));
            
            ПараметрыФормы = БизнесПроцессы[ТипБизнесПроцесса.Имя].ФормаВыполненияЗадачи(ЗадачаСсылка, Реквизиты.ТочкаМаршрута);
            
            Если ПараметрыФормы <> Неопределено Тогда
                ВыбраннаяФорма = ПараметрыФормы.ИмяФормы;
                СтандартнаяОбработка = Ложь;
            КонецЕсли;
        КонецЕсли;
        
    КонецЕсли;

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

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


Функция ФормаВыполненияЗадачи(ЗадачаСсылка, ТочкаМаршрута) Экспорт

    Результат = Новый Структура("ИмяФормы");
    
    Если ТочкаМаршрута = БизнесПроцессы.Согласование.ТочкиМаршрута.Согласовать Тогда
        Результат.ИмяФормы = "БизнесПроцесс.Согласование.Форма.ФормаСогласования";
    Иначе
        Возврат Неопределено;
    КонецЕсли;
    
    Возврат Результат;

КонецФункции

Важные нюансы реализации:

  1. Передача контекста задачи: Если форма бизнес-процесса открывается вместо формы задачи, целевая форма должна обязательно принимать ссылку на задачу в параметрах. Иначе форма откроется просто как редактор бизнес-процесса, а задача так и останется активной.
  2. Производительность: Внутри процедуры ОбработкаПолученияФормы не следует вызывать Параметры.Ключ.ПолучитьОбъект(), так как чтение объекта целиком создает неоправданную нагрузку на СУБД при каждом открытии окна. Достаточно прочитать только реквизиты БизнесПроцесс и ТочкаМаршрута.
  3. Ограничения перехвата: Событие ОбработкаПолученияФормы срабатывает только при открытии формы по умолчанию (например, при двойном клике в списке задач). Если форма где-то вызывается по явному имени формы, данный обработчик платформой не вызывается.

Способ 2. Вынос реквизитов бизнес-процесса в форму задачи

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

Разберем алгоритм настройки формы задачи по шагам:

  1. В управляемой форме задачи создадим дополнительные реквизиты, соответствующие типам реквизитов процесса (например, РеквизитБПБыло и РеквизитБПСтало).
  2. Реквизит РеквизитБПСтало выносим в элементы формы для редактирования пользователем.
  3. В обработчике ПриСозданииНаСервере заполняем оба значения текущими данными из бизнес-процесса:
    
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
        
        Если ЗначениеЗаполнено(Объект.БизнесПроцесс) Тогда
            ЗначениеИзБП = Объект.БизнесПроцесс.Согласовано;
            РеквизитБПБыло = ЗначениеИзБП;
            РеквизитБПСтало = ЗначениеИзБП;
        КонецЕсли;
        
    КонецПроцедуры
    
  4. В обработчике перед выполнением задачи проверяем, изменились ли данные. Если пользователь изменил значение, открываем объект процесса на сервере, перезаписываем реквизит и только затем даем задаче выполниться.

Обязательное правило продвижения бизнес-процесса

Частая ошибка разработчиков при программном закрытии шага процесса — установка признака выполнения напрямую в коде:


// ОШИБКА: Бизнес-процесс не продвинется дальше по карте маршрута
ЗадачаОбъект.Выполнена = Истина;
ЗадачаОбъект.Записать();

Запомним ключевое платформенное правило: простая установка флага Выполнена = Истина лишь меняет статус записи, но не активирует движение по схеме бизнес-процесса. Чтобы бизнес-процесс перешел к следующей точке карты маршрута, необходимо обязательно вызывать платформенный метод ВыполнитьЗадачу():


// ПРАВИЛЬНО: Перевод задачи в выполненные и продвижение БП
ЗадачаОбъект.ВыполнитьЗадачу();

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

← На главную