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