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