Почему возникает ошибка «Неизвестное имя формы» при открытии внешней обработки в 1С и как её исправить

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

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

Причины возникновения ошибки

Выясним причину, по которой форма перестает открываться после перезапуска клиентского приложения:

  1. Внешняя обработка не является постоянным объектом метаданных. В отличие от встроенных объектов конфигурации (документов, справочников, отчетов), свойство глобального контекста ВнешниеОбработки управляет внешними объектами динамически. Если обработка не подключена в контексте текущего сеанса, платформа ничего не знает о существовании такого имени объекта метаданных.
  2. Ограниченное время жизни подключения. При динамическом подключении внешней обработки она регистрируется исключительно в оперативной памяти текущего сеанса. При перезапуске платформы сеанс завершается, а временная регистрация обработки сбрасывается. Если в момент первичной загрузки в справочник подсистема администрирования временно подключила файл для проверки, форма могла открыться один раз, но после перезапуска платформы это временное состояние утрачивается.
  3. Нарушение синтаксиса пути к форме. В платформе 1С:Предприятие путь к форме внешнего объекта строится по строгому правилу: "ВнешняяОбработка.<ИмяПодключения>.Форма.<ИмяФормы>". Пропуск ключевого слова .Форма. приводит к ошибке синтаксиса пути даже при активном подключении.
  4. Динамическое имя подключения в БСП. В типовых конфигурациях (например, «Управление торговлей 11», ERP, КА) при подключении внешних обработок из справочника «Дополнительные отчеты и обработки» библиотека стандартных подсистем (БСП) не использует исходное строковое имя из файла. Вместо этого генерируется уникальный внутренний идентификатор подключения, поэтому жестко заданное имя в коде перестает работать.

Способ 1. Использование стандартного программного интерфейса БСП (рекомендуемый)

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

Разберем по шагам логику реализации:

  1. Находим в справочнике дополнительных отчетов и обработок нужный элемент по наименованию, уникальному идентификатору или ссылке.
  2. Вызываем серверный метод БСП для подключения обработки в текущем сеансе. Метод возвращает строковое имя, под которым обработка зарегистрирована платформой.
  3. Формируем полный путь к форме с учетом полученного имени и открываем форму стандартным методом.

Посмотрим на пример реализации в модуле управляемой формы:


&НаСервере
Функция ПодключитьОбработкуНаСервере()
    
    // Получаем ссылку на элемент справочника дополнительных обработок
    СсылкаНаОбработку = Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию("ПечатныеФормы");
    
    Если Не ЗначениеЗаполнено(СсылкаНаОбработку) Тогда
        ВызватьИсключение "Внешняя обработка не найдена в справочнике!";
    КонецЕсли;
    
    // Подключаем внешнюю обработку штатным методом БСП
    ИмяПодключения = ДополнительныеОтчетыИОбработки.ПодключитьВнешнююОбработку(СсылкаНаОбработку);
    
    Возврат ИмяПодключения;
    
КонецФункции

&НаКлиенте
Процедура МояПечать(Команда)
    
    // Получаем актуальное имя подключения для текущего сеанса
    ИмяОбработки = ПодключитьОбработкуНаСервере();
    
    // Формируем корректный путь к управляемой форме
    ИмяФормы = "ВнешняяОбработка." + ИмяОбработки + ".Форма.МояФорма";
    
    // Открываем форму в немодальном режиме
    ОткрытьФорму(ИмяФормы);
    
КонецПроцедуры

Способ 2. Программное подключение через менеджер внешних обработок

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

Разберем по шагам последовательность действий:

  1. На сервере получаем двоичные данные файла внешней обработки.
  2. Помещаем двоичные данные во временное хранилище и получаем его адрес.
  3. Вызываем метод ВнешниеОбработки.Подключить(), передавая адрес хранилища. Метод регистрирует обработку в сеансе и возвращает строку с назначенным именем.
  4. Открываем форму, обращаясь по шаблону "ВнешняяОбработка." + ИмяОбработки + ".Форма.<ИмяФормы>".

Посмотрим на пример кода:


&НаСервере
Функция ПодключитьОбработкуИзХранилищаНаСервере(ДвоичныеДанныеОбработки)
    
    // Помещаем данные во временное хранилище текущего сеанса
    АдресХранилища = ПоместитьВоВременноеХранилище(ДвоичныеДанныеОбработки, Новый УникальныйИдентификатор);
    
    // Подключаем внешнюю обработку в безопасном режиме
    ИмяПодключения = ВнешниеОбработки.Подключить(АдресХранилища, , Истина);
    
    Возврат ИмяПодключения;
    
КонецФункции

&НаКлиенте
Процедура ОткрытьФормуОбработки(Команда)
    
    // Двоичные данные могут быть получены из реквизита, макета или файла
    ДвоичныеДанные = ПолучитьДвоичныеДанныеНаСервере();
    
    ИмяПодключения = ПодключитьОбработкуИзХранилищаНаСервере(ДвоичныеДанные);
    
    СтрокаИмениФормы = "ВнешняяОбработка." + ИмяПодключения + ".Форма.МояФорма";
    
    ОткрытьФорму(СтрокаИмениФормы);
    
КонецПроцедуры

Важные ограничения и рекомендации платформы

При реализации вызова внешних обработок обратим внимание на следующие технические аспекты:

  1. Отказ от модальности. В современных конфигурациях (включая УТ 11, ERP 2, КА) свойство «Режим использования модальности» установлено в значение Не использовать. Вызов устаревшего метода ОткрытьФормуМодально приведет к аварийному завершению с ошибкой времени выполнения. Всегда используем метод ОткрытьФорму.
  2. Управляемые и обычные формы. В управляемом приложении (в режимах тонкого, толстого и веб-клиента) внешняя обработка должна иметь именно управляемую форму. Если попытаться открыть обычную форму, платформа выдаст исключение о невозможности работы с данным типом формы.
  3. Безопасный режим. Метод Подключить() по умолчанию принимает параметр безопасного режима. Если внешней обработке требуются привилегированные действия (доступ к файлам операционной системы, внешние компоненты, COM-соединения), параметры безопасности должны быть настроены через соответствующие разрешения подсистемы БСП.
  4. Использование стандартных команд БСП без правки конфигурации. Если обработка представляет собой дополнительную печатную форму или заполнение объекта, правильнее не встраивать вызовы вручную в типовые формы документов и справочников. Достаточно реализовать в модуле объекта обработки экспортную функцию СведенияОВнешнейОбработке(). БСП автоматически выведет команду на форму соответствующего документа без модификации исходного кода типовой конфигурации.
← На главную