Как правильно открыть форму бизнес-процесса в управляемом приложении 1С

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

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

Анализ стандартного механизма открытия формы по ссылке

Для большинства ссылочных типов данных (справочники, документы) в управляемом приложении основным способом открытия формы существующего объекта является передача параметра Ключ. Разберем, как это работает «под капотом» платформы. Когда мы вызываем метод ОткрытьФорму() и передаем в структуру параметров значение с ключом Ключ, система выполняет следующие действия:

  1. Определяет тип переданной ссылки.
  2. Ищет основную форму объекта для данного метаданного.
  3. Создает экземпляр формы на сервере.
  4. Автоматически считывает данные объекта из базы данных по ссылке и заполняет основной реквизит формы (обычно это реквизит Объект).

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


ПараметрыФормы = Новый Структура("Ключ", СсылкаНаОбъект);
ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаОбъекта", ПараметрыФормы);

Почему метод может не работать для бизнес-процесса

Проанализируем ситуацию, описанную в сообщении №7 форума. Автор пытается открыть форму бизнес-процесса следующим образом:


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

Здесь кроется главная причина неудачи. Давайте разберем по шагам, почему в процедуре ПриСозданииНаСервере данные оказываются не заполнены:

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

Различие между формой бизнес-процесса и формой задачи

Важно четко разделять объект самого бизнес-процесса и объекты задач, которые он порождает. Бизнес-процесс — это «владелец» логики и карты маршрута. Задача — это конкретное действие, назначенное исполнителю.

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

Решение 1: Открытие основной формы бизнес-процесса

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


// На клиенте
ПараметрыОткрытия = Новый Структура("Ключ", СсылкаНаБП);
ОткрытьФорму("БизнесПроцесс.Согласование.ФормаОбъекта", ПараметрыОткрытия);

В этом случае 1С сама поймет, что нужно инициализировать реквизит Объект на основании переданной ссылки.

Решение 2: Работа с произвольной формой через параметры

Рассмотрим ситуацию, когда нам нужно открыть специфическую форму и передать туда данные бизнес-процесса вручную. Это часто требуется, если форма не связана напрямую с объектом как «основная».

Шаг 1. Вызов открытия формы на клиенте:


ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("СсылкаНаБП", НужнаяСсылка);
ОткрытьФорму("БизнесПроцесс.Согласование.Форма.ПроизвольнаяФорма", ПараметрыФормы);

Шаг 2. Обработка данных в модуле формы на сервере:


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

Особенности работы с картой маршрута

Часто форму бизнес-процесса открывают ради визуализации Карты маршрута. Помните, что карта — это графическая схема. В управляемых формах за это отвечает реквизит с типом ГрафическаяСхема.

Если вы открываете форму программно и она не является стандартной, карта может не отрисоваться автоматически. Выясним, как это исправить. В процедуре ПриСозданииНаСервере необходимо вызвать метод объекта бизнес-процесса ПолучитьКартуМаршрута() и присвоить результат реквизиту формы, который связан с элементом управления «Поле графической схемы»:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Допустим, на форме есть реквизит "Схема" с типом ГрафическаяСхема
    Если ЗначениеЗаполнено(Объект.Ссылка) Тогда
        Схема = БизнесПроцессы.Согласование.ПолучитьКартуМаршрута(Объект.Ссылка);
    КонецЕсли;
КонецПроцедуры

Подведем итоги

Для успешного открытия формы бизнес-процесса необходимо соблюдать несколько правил:

Соблюдение этих принципов позволит вам гибко управлять интерфейсом бизнес-процессов и избегать ошибок, связанных с пустыми или некорректно инициализированными формами.

← На главную