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