Почему не подключается внешняя компонента DLL в управляемой форме 1С?

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

При интеграции 1С с внешними программами и сервисами разработчики часто сталкиваются с ситуацией, когда метод ПодключитьВнешнююКомпоненту возвращает Ложь, а попытки предварительной установки через УстановитьВнешнююКомпоненту приводят к ошибкам модальности или сообщениям о сбое установки. Разберем по шагам, почему возникают подобные проблемы в тонком клиенте на управляемых формах, и рассмотрим правильные варианты подключения внешних библиотек.

Основные причины ошибок при подключении DLL

Проанализируем технические нюансы взаимодействия платформы 1С:Предприятие с внешними динамическими библиотеками:

  1. Несовпадение разрядности (битности) платформы и библиотеки. Большинство внешних библиотек интеграции поставляются в 32-разрядном варианте (x86). Если тонкий клиент 1С запущен как 64-битный процесс (x86_64), 64-разрядное приложение не сможет загрузить 32-битную DLL внутрь своего адресного пространства. Метод ПодключитьВнешнююКомпоненту в этом случае без дополнительных сообщений об ошибке возвращает Ложь.
  2. Использование синхронных методов при запрете модальности. В управляемом приложении с установленным режимом «Запрещать» для свойства конфигурации «Режим использования модальности» прямой вызов синхронного метода УстановитьВнешнююКомпоненту вызывает исключение «Использование модальных окон в данном режиме запрещено!».
  3. Неверная структура макета для установки компоненты. Методы УстановитьВнешнююКомпоненту и НачатьУстановкуВнешнейКомпоненты платформы 1С требуют, чтобы в макете находился не «сырой» файл DLL, а специальный ZIP-архив с манифестом MANIFEST.xml, описывающим модули, архитектуру и типы внешних компонент (Native API или COM). Если передать путь к обычному файлу DLL, платформа вернет ошибку «установка внешней компоненты не выполнена».
  4. Путаница между интерфейсом Внешней компоненты 1С и стандартным COM-объектом. Метод ПодключитьВнешнююКомпоненту предназначен исключительно для библиотек, реализующих специализированные интерфейсы 1С (IInitDone, ILanguageExtender). Если библиотека является классическим Automation/COM-сервером Windows, ее не нужно подключать как компоненту 1С — работа с ней выполняется через создание COM-объекта.
  5. Отсутствие регистрации в реестре Windows. Библиотеки, использующие технологию COM, требуют предварительной регистрации в операционной системе утилитой regsvr32.
  6. Блокировка файла операционной системой. Библиотеки, загруженные из интернета, могут блокироваться механизмом безопасности Windows (метка Zone.Identifier), что препятствует их выполнению.

Шаг 1. Проверка разрядности клиента 1С и разблокировка файла

Убедимся, что разрядность клиентского приложения 1С совпадает с разрядностью DLL-файла. Если библиотека 32-битная, тонкий клиент необходимо запускать из каталога 32-разрядных программ:

C:\Program Files (x86)\1cv8\8.3.XX.XXXX\bin\1cv8c.exe

Также проверим свойства файла DLL в Проводнике Windows. Если в нижней части окна свойств отображается предупреждение «Этот файл был получен с другого компьютера и, возможно, был заблокирован с целью защиты», установим флажок Разблокировать (Unblock) и нажмем кнопку Применить.

Шаг 2. Регистрация библиотеки в операционной системе

Для работы с библиотекой по технологии COM выполним ее регистрацию в системном реестре Windows. Запустим командную строку от имени Администратора и выполним команду:

regsvr32 "c:\ProgramData\Medoc\Medoc\medoc1c.dll"

В случае успешной регистрации появится системное сообщение об успешном выполнении DllRegisterServer.

Шаг 3. Подключение через механизм внешних компонент 1С

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


&НаКлиенте
Процедура ПодключитьКомпонентуКлиент()
    ПутьКФайлу = "c:\ProgramData\Medoc\Medoc\medoc1c.dll";
    
    // Подключаем зарегистрированную COM-компоненту
    Подключено = ПодключитьВнешнююКомпоненту(ПутьКФайлу, "Medoc1C", ТипВнешнейКомпоненты.COM);
    
    Если Подключено Тогда
        Попытка
            ОбъектКомпоненты = Новый("AddIn.Medoc1C");
            // Работа с методами компоненты
        Исключение
            Сообщить("Ошибка создания объекта компоненты: " + ОписаниеОшибки());
        КонецПопытки;
    Иначе
        Сообщить("Не удалось подключить внешнюю компоненту по указанному пути.");
    КонецЕсли;
КонецПроцедуры

Если используется асинхронный вызов для работы в режиме без модальных окон:


&НаКлиенте
Асинх Процедура ПодключитьКомпонентуАсинхронно()
    ПутьКФайлу = "c:\ProgramData\Medoc\Medoc\medoc1c.dll";
    
    Подключено = Ждать ПодключитьВнешнююКомпонентуАсинх(ПутьКФайлу, "Medoc1C", ТипВнешнейКомпоненты.COM);
    
    Если Подключено Тогда
        Попытка
            ОбъектКомпоненты = Новый("AddIn.Medoc1C");
            // Вызов методов компоненты
        Исключение
            Сообщить("Ошибка инициализации объекта: " + ОписаниеОшибки());
        КонецПопытки;
    Иначе
        Сообщить("Не удалось асинхронно подключить компоненту.");
    КонецЕсли;
КонецПроцедуры

Шаг 4. Прямая работа через COM-объект

Если библиотека представляет собой стандартный COM-сервер автоматизации (Automation Server), подключать ее через ПодключитьВнешнююКомпоненту не требуется. Достаточно зарегистрировать библиотеку в Windows и обращаться к ней напрямую через конструктор Новый COMОбъект по ее программному идентификатору (ProgID):


&НаКлиенте
Процедура РаботаСCOMОбъектом()
    Попытка
        // Создание экземпляра зарегистрированного COM-объекта
        ОбъектИнтеграции = Новый COMОбъект("MEDOC.ZApplication");
        
        // Вызов методов объекта
        // ОбъектИнтеграции.Открыть();
    Исключение
        Сообщить("Не удалось создать COM-объект: " + ОписаниеОшибки());
    КонецПопытки;
КонецПроцедуры

Работа с 32-битной DLL в 64-битном клиенте через COM+

Если перевод пользователей на 32-разрядный тонкий клиент невозможен, а библиотека существует только в 32-битном исполнении, настроим запуск библиотеки через службу компонентов Windows (COM+):

  1. Откроем оснастку Службы компонентов (команда dcomcnfg в командной строке).
  2. Перейдем в ветку Службы компонентов -> Компьютеры -> Мой компьютер -> Приложения COM+.
  3. Создадим новое приложение COM+, выберем тип Серверное приложение (Server application).
  4. В свойствах созданного приложения перейдем в папку Компоненты и добавим зарегистрированную 32-битную DLL.

При такой настройке операционная система будет запускать 32-битную компоненту в изолированном системном процессе dllhost.exe, а 64-битный тонкий клиент 1С сможет прозрачно обращаться к ней через интерфейс COM без конфликта разрядностей.

← На главную