Как открыть управляемую форму из обычной формы внешней обработки

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

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

В этой статье мы подробно разберем, почему это происходит, и проанализируем все доступные способы решения задачи — от классического программного подключения до современных методик с использованием расширений.

Суть проблемы и ограничения платформы

Разберем ситуацию: у нас есть внешняя обработка, в которой создана только управляемая форма. Мы запускаем 1С в режиме обычного приложения и пытаемся открыть эту обработку. Платформа 1С разделяет контексты выполнения. В обычном приложении приоритет отдается «родным» объектам. Когда мы работаем с внешним файлом, система не всегда может корректно сопоставить типы данных, что приводит к невозможности прямого создания объекта управляемой формы.

Основная «боль» разработчиков заключается в том, что для встроенных в конфигурацию объектов метод ОткрытьФорму() работает прозрачно, а для внешних — требует предварительной регистрации метаданных в сеансе.

Способ 1. Программное подключение внешней обработки

Для того чтобы система «увидела» управляемую форму внешнего файла, обработку необходимо сначала подключить. Это превращает внешний файл во временный объект метаданных, к которому можно обращаться по внутреннему имени. Рассмотрим этот процесс по шагам.

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


// 1. Указываем путь к файлу обработки
ПутьКФайлу = "D:\MyReports\ExternalProcessing.epf";

// 2. Подключаем обработку. Метод возвращает внутреннее имя
// Важно: БезопасныйРежим лучше установить в Ложь, если требуется полный доступ
ИмяОбработки = ВнешниеОбработки.Подключить(ПутьКФайлу, , Ложь);

// 3. Формируем полное имя формы для открытия
// Используется синтаксис "ВнешняяОбработка.[Имя].Форма.[ИмяФормы]"
ИмяФормыУФ = "ВнешняяОбработка." + ИмяОбработки + ".Форма.ФормаУправляемая";

// 4. Открываем форму
ОткрытьФорму(ИмяФормыУФ);

Почему это может не сработать? Если вы используете метод ПоместитьВоВременноеХранилище (как в сообщении №26 обсуждения), платформа может выдать ошибку «Схема не зарегистрирована». Это происходит потому, что в обычном приложении работа с навигационными ссылками временного хранилища для внешних метаданных ограничена. Рекомендуется использовать прямой путь к файлу на диске или предварительно сохранять двоичные данные во временный файл.

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

Иногда требуется не просто открыть форму, а получить ее объект для программного заполнения данных перед открытием. В обычном приложении для этого можно попробовать использовать менеджер внешних обработок. Посмотрим на алгоритм:

  1. Сначала создаем объект обработки через ВнешниеОбработки.Создать(ИмяОбработки).
  2. Пытаемся вызвать ПолучитьФорму, явно указав имя управляемой формы.

Однако стоит помнить: в толстом клиенте (обычное приложение) метод ПолучитьФорму у объекта внешней обработки часто возвращает тип Форма (обычная), а не УправляемаяФорма. Если вам критически важен объект УправляемаяФорма, лучше использовать глобальный метод ОткрытьФорму с передачей параметров в структуре.

Способ 3. Создание «формы-контейнера» в конфигурации

Если внешнюю обработку нужно открывать часто и вышеописанные методы вызывают ошибки, рассмотрим надежный обходной путь. Мы можем создать в основной конфигурации пустую обработку-заглушку (например, ПроксиУФ) с одной управляемой формой.

Алгоритм работы будет следующим:

Этот метод гарантирует отсутствие ошибок со «схемами», так как инициатором открытия управляемой формы выступает объект, уже известный конфигурации.

Способ 4. Использование подсистемы «Дополнительные отчеты и обработки» (БСП)

Если ваша конфигурация построена на базе БСП, мы настоятельно рекомендуем не «изобретать велосипед», а использовать штатный механизм. При регистрации внешней обработки в справочнике «Дополнительные отчеты и обработки», система сама берет на себя все сложности с контекстами.

Рассмотрим, как это упрощает жизнь:

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

Важные нюансы и советы

Проанализируем еще несколько важных моментов, которые помогут избежать ошибок:

1. Настройки конфигурации. Убедитесь, что в свойствах конфигурации стоят галочки «Использовать управляемые формы в обычном приложении» и «Использовать обычные формы в управляемом приложении». Без этого смешивание интерфейсов будет блокироваться на уровне ядра платформы.

2. Режим запуска. Помните, что управляемая форма в обычном приложении будет выглядеть как отдельное окно. Она не сможет стать «закладкой» в привычном понимании интерфейса 8.2, но сохранит весь функционал: работу с командами, динамическими списками и т.д.

3. Использование расширений. Если задача позволяет, рассмотрите возможность переноса логики из внешней обработки в расширение конфигурации. Объекты расширения (включая формы) воспринимаются системой как родные объекты метаданных. Управляемая форма из расширения откроется в обычном приложении без дополнительных манипуляций с методом Подключить().

4. Навигационные ссылки. Рассмотрим использование команды ПерейтиПоНавигационнойСсылке(). Для внешних обработок можно сформировать ссылку вида e1cib/data/ВнешняяОбработка.[Имя]?Форма=[ИмяФормы]. Однако этот метод требует, чтобы обработка уже была известна системе в текущем сеансе.

Резюме

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

← На главную