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

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

При разработке и отладке в 1С:Предприятие 8 часто возникает необходимость открыть внешнюю обработку (файл с расширением .epf) программно, не включая ее в состав конфигурации или справочник дополнительных отчетов и обработок. Это особенно актуально при создании "Рабочих столов" или инструментов для администраторов.

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

Алгоритм действий

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

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

Реализация программного кода

Разберем классический пример кода, который работает в большинстве сценариев (Тонкий клиент, Веб-клиент). Обратите внимание, что код разделен на клиентскую и серверную части.

На клиенте мы инициируем процесс:


&НаКлиенте
Процедура ОткрытьВнешнююОбработку(Команда)
    
    // Путь к файлу на диске (в данном примере фиксированный, но может быть получен через диалог)
    ПутьКФайлу = "d:\1cBase8\ОбработкиУТ11\РабочийСтолУТ111.epf";
    
    // 1. Помещаем файл во временное хранилище
    // АдресХранилища будет содержать ссылку на данные во временном хранилище
    АдресХранилища = "";
    ПоместитьФайл(АдресХранилища, ПутьКФайлу, , Ложь);
    
    // 2. Подключаем обработку на сервере и получаем её внутреннее имя
    ИмяОбработки = ПодключитьВнешнююОбработкуНаСервере(АдресХранилища);
    
    // 3. Формируем строку пути к форме и открываем её
    // Важно: ИмяОбработки здесь - это служебное имя, присвоенное платформой (например, ВнешняяОбработка1)
    ПараметрыФормы = Новый Структура;
    ОткрытьФорму("ВнешняяОбработка." + ИмяОбработки + ".Форма", ПараметрыФормы);

КонецПроцедуры

Теперь рассмотрим серверную функцию, которая отвечает за непосредственное подключение:


&НаСервере
Функция ПодключитьВнешнююОбработкуНаСервере(АдресХранилища)
    
    // Метод Подключить возвращает имя подключенной обработки в контексте сеанса
    // Важно: Второй параметр "БезопасныйРежим". Если обработка должна выполнять опасные действия,
    // передавайте Ложь.
    Возврат ВнешниеОбработки.Подключить(АдресХранилища, , Ложь);
    
КонецФункции

Почему форма может не открываться?

Часто разработчики сталкиваются с ситуацией, когда код выполняется без ошибок, переменная ИмяОбработки возвращает значение (например, "ВнешняяОбработка1"), но метод ОткрытьФорму ничего не делает. Разберем основные причины.

1. Неверное указание имени формы

В методе ОткрытьФорму мы используем конструкцию:

"ВнешняяОбработка." + ИмяОбработки + ".Форма"

Это работает только в том случае, если у вашей внешней обработки в Конфигураторе назначена Основная форма обработки. Если основная форма не выбрана (или вы хотите открыть не основную), платформа не поймет, что именно нужно открыть.

Решение: Указывайте конкретное имя формы, как оно задано в дереве метаданных самой обработки. Например, если форма называется ФормаУправляемая:


// Правильное обращение к конкретной форме
ИмяФормыДляОткрытия = "ВнешняяОбработка." + ИмяОбработки + ".Форма.ФормаУправляемая";
ОткрытьФорму(ИмяФормыДляОткрытия);

Либо вариант обращения через коллекцию форм:


// Иногда работает такой вариант, если имя формы совпадает со стандартным
ОткрытьФорму("ВнешняяОбработка." + ИмяОбработки + ".Форма.Форма");

2. Особенности Толстого клиента

Если вы запускаете базу в режиме Толстый клиент (управляемое приложение), поведение платформы может отличаться. В толстом клиенте доступны как серверные методы, так и методы работы с локальной файловой системой напрямую.

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

Тем не менее, приведенная выше схема с ПоместитьФайл является наиболее универсальной, так как она будет работать и при переходе на Тонкий клиент, который является стандартом для современных конфигураций (УТ 11, ERP, КА).

3. Проблемы с Безопасным режимом

Если ваша внешняя обработка пытается при открытии формы (в событии ПриСозданииНаСервере) обратиться к файловой системе, COM-объектам или другим "опасным" ресурсам, а подключена она была в безопасном режиме (по умолчанию), открытие формы может прерваться исключением, которое "проглатывается" или отображается неявно.

Убедитесь, что при подключении вы явно отключаете безопасный режим, если это требуется:


ВнешниеОбработки.Подключить(АдресХранилища, , Ложь); // Третий параметр Ложь отключает безопасный режим

Альтернативы и современные подходы

Стоит отметить, что постоянное использование внешних .epf файлов для доработки функционала имеет свои недостатки (неудобство версионирования, проблемы с кэшем). В современных реалиях 1С рекомендуется использовать механизм Расширений конфигурации.

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

Резюме по диагностике

Если код не работает, выполните проверку по пунктам:

  1. Поставьте точку останова после выполнения ВнешниеОбработки.Подключить. Убедитесь, что переменная ИмяОбработки не пустая.
  2. Проверьте имя формы в самой обработке. Если оно отличается от "Форма", скорректируйте строку в ОткрытьФорму.
  3. Попробуйте открыть эту обработку через меню "Файл — Открыть". Если она открывается, значит проблема именно в пути к форме или контексте вызова.
  4. Если вы работаете в Толстом клиенте, попробуйте переключиться в Тонкий клиент для проверки — это более "чистая" среда для работы управляемых форм.
← На главную