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