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