Почему в обычном приложении вместо управляемой формы открывается обычная и как это исправить?

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

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

Разберем, почему возникает такое поведение платформы, проанализируем внутренние механизмы вызова форм и рассмотрим правильные способы открытия управляемых форм в обычном режиме.

Причина поведения платформы: разница между методами объекта и глобального контекста

Посмотрим на типичный пример кода, который вызывает ошибочное поведение:


НовыйКонтактноеЛицо = Справочники.КонтактныеЛица.СоздатьЭлемент();
Форма = НовыйКонтактноеЛицо.ПолучитьФорму("ФормаЭлементаУправляемая");
Форма.Открыть();

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

Чтобы платформа распознала и создала управляемую форму, необходимо обращаться к методам глобального контекста, а не к методу конкретного объекта данных.

Обязательные настройки конфигурации

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

  1. Откроем свойства конфигурации в дереве метаданных и убедимся, что установлен флаг Использовать управляемые формы в обычном режиме (или Использовать управляемые формы в толстом клиенте в обычном режиме в зависимости от версии платформы).
  2. Если данное свойство недоступно для изменения, перейдем в главное меню: Сервис → Параметры → закладка Общие. В поле Режим редактирования конфигурации выберем значение Управляемое приложение и обычное приложение.

Способ 1. Использование глобального метода ПолучитьФорму

Если нам необходимо получить экземпляр управляемой формы без немедленного открытия, используем глобальный метод ПолучитьФорму() с указанием полного пути к форме:


// Получаем управляемую форму существующего элемента
ПараметрыОткрытия = Новый Структура("Ключ", СсылкаНаЭлемент);
Форма = ПолучитьФорму("Справочник.КонтактныеЛица.Форма.ФормаЭлементаУправляемая", ПараметрыОткрытия);
Форма.Открыть();

Способ 2. Использование метода ОткрытьФорму (рекомендуемый стандарт)

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

Рассмотрим открытие формы существующего элемента справочника:


ПараметрыФормы = Новый Структура("Ключ", СсылкаНаЭлемент);
ОткрытьФорму("Справочник.КонтактныеЛица.Форма.ФормаЭлементаУправляемая", ПараметрыФормы);

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


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

ПараметрыФормы = Новый Структура("ЗначенияЗаполнения", Значения);
ОткрытьФорму("Справочник.КонтактныеЛица.Форма.ФормаЭлементаУправляемая", ПараметрыФормы);

Способ 3. Передача инициализированного в памяти объекта

Если в памяти обычного приложения уже создан и заполнен объект типа СправочникОбъект или ДокументОбъект, передать его напрямую в качестве основного реквизита управляемой формы нельзя (управляемая форма работает с типом ДанныеФормыСтруктура).

В этом случае передаем объект через произвольный параметр формы, а в модуле управляемой формы в обработчике события ПриСозданииНаСервере переносим данные:


// В обычном приложении при открытии формы:
ПараметрыФормы = Новый Структура("ВременныйОбъект", МойОбъектВПамяти);
ОткрытьФорму("Справочник.КонтактныеЛица.Форма.ФормаЭлементаУправляемая", ПараметрыФормы);

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

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

Проанализируем важные ограничения платформы при совмещении двух интерфейсных технологий:

  1. Внешние обработки и отчеты: Платформа не позволяет штатно открыть управляемую форму из внешнего файла обработки (.epf или .erf) внутри обычного приложения. Для работы управляемой формы обработка обязательно должна входить в состав метаданных конфигурации.
  2. Встраивание элементов: Управляемую форму невозможно встроить в качестве элемента интерфейса внутрь обычной формы (например, на панель или вкладку). Управляемая форма открывается исключительно в отдельном окне.
← На главную