Как установить внешнюю компоненту из макета внешней обработки

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

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

Проблема прямого обращения к макету

В обычных условиях для установки компоненты из макета конфигурации мы используем конструкцию вида УстановитьВнешнююКомпоненту("ОбщийМакет.ИмяМакета"). В случае с внешней обработкой многие пытаются использовать путь ВнешняяОбработка.Имя.Макет.Имя, но этот метод работает только если обработка уже зарегистрирована в метаданных или определенным образом инициализирована в системе. Для автономного файла обработки платформа часто не может разрешить такой путь, возвращая ошибку.

Разберем, как обойти это ограничение и гарантированно установить компоненту, используя программные методы работы с двоичными данными.

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

Проанализируем наиболее надежный алгоритм: извлечение компоненты из макета во временный файл и последующая установка из этого файла. Этот метод работает вне зависимости от того, как запущена обработка — просто открыта через "Файл - Открыть" или добавлена в справочник "Дополнительные отчеты и обработки".

Рассмотрим пошагово реализацию этого процесса:

  1. Получение макета: Сначала нам нужно обратиться к самому объекту внешней обработки.
  2. Сохранение во временный файл: Двоичные данные компоненты сохраняются на диск пользователя.
  3. Установка: Вызывается метод установки, указывающий на этот файл.

Посмотрим на пример кода, реализующий эту логику:


// Получаем объект обработки
ИмяФайлаКомпоненты = ПолучитьИмяВременногоФайла("zip"); // Обычно компоненты хранятся в архиве
ДвоичныеДанныеКомпоненты = ЭтотОбъект.ПолучитьМакет("ИмяМакетаСКомпонентой");

// Записываем данные во временный файл
ДвоичныеДанныеКомпоненты.Записать(ИмяФайлаКомпоненты);

// Устанавливаем компоненту из файла
РезультатУстановки = УстановитьВнешнююКомпоненту(ИмяФайлаКомпоненты);

Если РезультатУстановки Тогда
    // Подключаем установленную компоненту
    // При установке из файла 1С копирует ее в локальное хранилище, 
    // поэтому далее можно подключать по идентификатору
    ПодключитьВнешнююКомпоненту("AddIn.ИмяКомпонентыИзМанифеста", "МояКомпонента", ТипВнешнейКомпоненты.Native);
КонецЕсли;

// Удаляем временный файл после установки
УдалитьФайлы(ИмяФайлаКомпоненты);

Способ 2. Работа через справочник Дополнительные отчеты и обработки

Если ваша обработка работает в составе типовой конфигурации и загружена в справочник "Дополнительные отчеты и обработки", мы можем получить доступ к её макету через хранилище значений. Это особенно актуально, когда код должен выполняться в серверном контексте или в регламентном задании. Для быстрой подготовки таких обработок подойдёт шаблон дополнительной обработки для БСП.

Проанализируем ситуацию: в справочнике сама обработка хранится как ДвоичныеДанные. Чтобы добраться до её макета, нам нужно сначала "создать" объект обработки в памяти. Выясним, как это сделать программно:


// СсылкаНаОбъект - это ссылка на элемент справочника ДополнительныеОтчетыИОбработки
ИмяФайла = ПолучитьИмяВременногоФайла("epf");
ДвоичныеДанныеОбработки = СсылкаНаОбъект.ХранилищеВнешнейОбработки.Получить();
ДвоичныеДанныеОбработки.Записать(ИмяФайла);

// Создаем объект внешней обработки программно
ВнешняяОбработкаОбъект = ВнешниеОбработки.Создать(ИмяФайла, Ложь);

// Теперь мы можем получить макет так же, как в обычном объекте
МакетКомпоненты = ВнешняяОбработкаОбъект.ПолучитьМакет("ИмяМакета");
// Далее следуем алгоритму из Способа 1

Важный нюанс: При использовании этого метода убедитесь, что у пользователя достаточно прав на работу с файловой системой и запуск внешних обработок. В безопасном режиме работы эти действия могут быть заблокированы профилями безопасности.

Современный подход: Асинхронные вызовы

Начиная с версии платформы 8.3.15, компания 1С рекомендует отказываться от синхронных методов работы с внешними компонентами, так как они могут блокировать интерфейс и не поддерживаются в некоторых веб-браузерах. Рассмотрим, как переписать установку в асинхронном стиле.

Вместо УстановитьВнешнююКомпоненту() следует использовать НачатьУстановкуВнешнейКомпоненты(). Это требует описания процедуры обратного вызова.

Разберем пример асинхронного подключения:


&НаКлиенте
Процедура УстановитьИПодключитьКомпоненту()
    
    Оповещение = Новый ОписаниеОповещения("ПослеУстановкиКомпоненты", ЭтотОбъект);
    
    // Путь к макету, если обработка встроена, или путь к временному файлу
    ПутьККомпоненте = "ВнешняяОбработка.Работа.Макет.SkypeExtension"; 
    
    НачатьУстановкуВнешнейКомпоненты(Оповещение, ПутьККомпоненте);
    
КонецПроцедуры

&НаКлиенте
Процедура ПослеУстановкиКомпоненты(Результат, ДополнительныеПараметры) Экспорт
    
    Если Результат Тогда
        // Если установка прошла успешно, пробуем подключить
        ОповещениеПодключения = Новый ОписаниеОповещения("ПослеПодключенияКомпоненты", ЭтотОбъект);
        НачатьПодключениеВнешнейКомпоненты(ОповещениеПодключения, "AddIn.SkypeExtension", "SkypeLib", ТипВнешнейКомпоненты.Native);
    Иначе
        Сообщить("Не удалось установить компоненту!");
    КонецЕсли;
    
КонецПроцедуры

Рекомендации по работе с типами компонент

При разработке и подключении всегда обращайте внимание на параметр ТипВнешнейКомпоненты. Существует два основных типа:

Если вы используете ТипВнешнейКомпоненты.Native, то в макете должен лежать ZIP-архив, содержащий саму библиотеку (.dll, .so) и файл манифеста (manifest.xml), описывающий, для каких платформ предназначены файлы внутри архива. При необходимости организовать сетевой обмен можно использовать компоненту NativeAPI для работы с протоколом WebSocket.

Проверка перед установкой

Чтобы не обременять систему лишними вызовами записи файлов на диск, рекомендуется сначала проверить, не подключена ли компонента уже. Проанализируем типичную схему инициализации:

  1. Попытаться выполнить ПодключитьВнешнююКомпоненту() по идентификатору (например, AddIn.MyComponent).
  2. Если возвращено Ложь, значит компонента не установлена в системе.
  3. Выполнить процедуру извлечения из макета и УстановитьВнешнююКомпоненту().
  4. Повторить подключение.

Такой подход обеспечивает максимальную производительность и корректную работу в условиях ограниченных прав доступа к файловой системе, так как установка потребуется лишь один раз при первом запуске обработки пользователем.

Итог: Основная сложность установки из внешней обработки заключается в отсутствии фиксированного пути к макету в метаданных. Использование временного файла является самым гибким решением, позволяющим работать с компонентой в любых сценариях эксплуатации 1С:Предприятия.

← На главную