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