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