При разработке внешних обработок (файлы .epf) часто возникает необходимость использовать внешние компоненты для расширения функционала системы: работы с торговым оборудованием, специфическими файлами или интеграции со сторонними сервисами. Однако, в отличие от объектов конфигурации, внешние обработки не всегда имеют прямой путь в пространстве имен 1С, что создает сложности при вызове стандартных методов установки компонентов. Рассмотрим подробно, как решить эту задачу различными способами.
В обычных условиях для установки компоненты из макета конфигурации мы используем конструкцию вида УстановитьВнешнююКомпоненту("ОбщийМакет.ИмяМакета"). В случае с внешней обработкой многие пытаются использовать путь ВнешняяОбработка.Имя.Макет.Имя, но этот метод работает только если обработка уже зарегистрирована в метаданных или определенным образом инициализирована в системе. Для автономного файла обработки платформа часто не может разрешить такой путь, возвращая ошибку.
Разберем, как обойти это ограничение и гарантированно установить компоненту, используя программные методы работы с двоичными данными.
Проанализируем наиболее надежный алгоритм: извлечение компоненты из макета во временный файл и последующая установка из этого файла. Этот метод работает вне зависимости от того, как запущена обработка — просто открыта через "Файл - Открыть" или добавлена в справочник "Дополнительные отчеты и обработки".
Рассмотрим пошагово реализацию этого процесса:
Посмотрим на пример кода, реализующий эту логику:
// Получаем объект обработки
ИмяФайлаКомпоненты = ПолучитьИмяВременногоФайла("zip"); // Обычно компоненты хранятся в архиве
ДвоичныеДанныеКомпоненты = ЭтотОбъект.ПолучитьМакет("ИмяМакетаСКомпонентой");
// Записываем данные во временный файл
ДвоичныеДанныеКомпоненты.Записать(ИмяФайлаКомпоненты);
// Устанавливаем компоненту из файла
РезультатУстановки = УстановитьВнешнююКомпоненту(ИмяФайлаКомпоненты);
Если РезультатУстановки Тогда
// Подключаем установленную компоненту
// При установке из файла 1С копирует ее в локальное хранилище,
// поэтому далее можно подключать по идентификатору
ПодключитьВнешнююКомпоненту("AddIn.ИмяКомпонентыИзМанифеста", "МояКомпонента", ТипВнешнейКомпоненты.Native);
КонецЕсли;
// Удаляем временный файл после установки
УдалитьФайлы(ИмяФайлаКомпоненты);
Если ваша обработка работает в составе типовой конфигурации и загружена в справочник "Дополнительные отчеты и обработки", мы можем получить доступ к её макету через хранилище значений. Это особенно актуально, когда код должен выполняться в серверном контексте или в регламентном задании. Для быстрой подготовки таких обработок подойдёт шаблон дополнительной обработки для БСП.
Проанализируем ситуацию: в справочнике сама обработка хранится как ДвоичныеДанные. Чтобы добраться до её макета, нам нужно сначала "создать" объект обработки в памяти. Выясним, как это сделать программно:
// СсылкаНаОбъект - это ссылка на элемент справочника ДополнительныеОтчетыИОбработки
ИмяФайла = ПолучитьИмяВременногоФайла("epf");
ДвоичныеДанныеОбработки = СсылкаНаОбъект.ХранилищеВнешнейОбработки.Получить();
ДвоичныеДанныеОбработки.Записать(ИмяФайла);
// Создаем объект внешней обработки программно
ВнешняяОбработкаОбъект = ВнешниеОбработки.Создать(ИмяФайла, Ложь);
// Теперь мы можем получить макет так же, как в обычном объекте
МакетКомпоненты = ВнешняяОбработкаОбъект.ПолучитьМакет("ИмяМакета");
// Далее следуем алгоритму из Способа 1
Важный нюанс: При использовании этого метода убедитесь, что у пользователя достаточно прав на работу с файловой системой и запуск внешних обработок. В безопасном режиме работы эти действия могут быть заблокированы профилями безопасности.
Начиная с версии платформы 8.3.15, компания 1С рекомендует отказываться от синхронных методов работы с внешними компонентами, так как они могут блокировать интерфейс и не поддерживаются в некоторых веб-браузерах. Рассмотрим, как переписать установку в асинхронном стиле.
Вместо УстановитьВнешнююКомпоненту() следует использовать НачатьУстановкуВнешнейКомпоненты(). Это требует описания процедуры обратного вызова.
Разберем пример асинхронного подключения:
&НаКлиенте
Процедура УстановитьИПодключитьКомпоненту()
Оповещение = Новый ОписаниеОповещения("ПослеУстановкиКомпоненты", ЭтотОбъект);
// Путь к макету, если обработка встроена, или путь к временному файлу
ПутьККомпоненте = "ВнешняяОбработка.Работа.Макет.SkypeExtension";
НачатьУстановкуВнешнейКомпоненты(Оповещение, ПутьККомпоненте);
КонецПроцедуры
&НаКлиенте
Процедура ПослеУстановкиКомпоненты(Результат, ДополнительныеПараметры) Экспорт
Если Результат Тогда
// Если установка прошла успешно, пробуем подключить
ОповещениеПодключения = Новый ОписаниеОповещения("ПослеПодключенияКомпоненты", ЭтотОбъект);
НачатьПодключениеВнешнейКомпоненты(ОповещениеПодключения, "AddIn.SkypeExtension", "SkypeLib", ТипВнешнейКомпоненты.Native);
Иначе
Сообщить("Не удалось установить компоненту!");
КонецЕсли;
КонецПроцедуры
При разработке и подключении всегда обращайте внимание на параметр ТипВнешнейКомпоненты. Существует два основных типа:
Если вы используете ТипВнешнейКомпоненты.Native, то в макете должен лежать ZIP-архив, содержащий саму библиотеку (.dll, .so) и файл манифеста (manifest.xml), описывающий, для каких платформ предназначены файлы внутри архива. При необходимости организовать сетевой обмен можно использовать компоненту NativeAPI для работы с протоколом WebSocket.
Чтобы не обременять систему лишними вызовами записи файлов на диск, рекомендуется сначала проверить, не подключена ли компонента уже. Проанализируем типичную схему инициализации:
ПодключитьВнешнююКомпоненту() по идентификатору (например, AddIn.MyComponent).Ложь, значит компонента не установлена в системе.УстановитьВнешнююКомпоненту().Такой подход обеспечивает максимальную производительность и корректную работу в условиях ограниченных прав доступа к файловой системе, так как установка потребуется лишь один раз при первом запуске обработки пользователем.
Итог: Основная сложность установки из внешней обработки заключается в отсутствии фиксированного пути к макету в метаданных. Использование временного файла является самым гибким решением, позволяющим работать с компонентой в любых сценариях эксплуатации 1С:Предприятия.