Как подключить внешнюю компоненту Диадок на сервере 1С в обычном приложении?

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

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

Различие архитектур: Native API и COM

Прежде всего, нам необходимо выяснить, какую именно библиотеку мы пытаемся подключить. Существует две основные технологии создания внешних компонент для 1С: COM (Component Object Model) и Native API. Рассмотрим их особенности в контексте серверного использования.

Технология Native API является предпочтительной для современных систем. Она не требует регистрации в реестре Windows (regsvr32), работает в Linux-окружении и более стабильна в многопоточной среде rphost. Подключение такой компоненты обычно выполняется из макета конфигурации, где она хранится в виде двоичных данных или ZIP-архива.

Технология COM — это «классический» подход. Для работы COM-объекта библиотека должна быть зарегистрирована в реестре Windows. На сервере это создает дополнительные сложности, связанные с правами доступа и разрядностью операционной системы. Если вы используете метод Новый COMОбъект("Diadoc.DiadocClient"), вы работаете именно с COM-версией.

Анализ разрядности сервера и компоненты

Одной из самых частых причин неудачи является несовпадение разрядности процесса rphost.exe (сервер 1С) и подключаемой DLL. Проанализируем эту ситуацию подробнее. Если ваш сервер 1С установлен как 64-битное приложение (что является стандартом для современных систем), он физически не сможет загрузить 32-битную DLL в свое адресное пространство напрямую.

При использовании компоненты Диадок убедитесь, что вы регистрируете именно 64-битную версию библиотеки, если сервер 1С 64-битный. Для регистрации используйте правильный путь к утилите regsvr32:

Важный момент: если компонента существует только в 32-битном варианте, а сервер 1С у вас 64-битный, вам придется настраивать COM+ Application в службах компонентов Windows, чтобы запустить библиотеку в суррогатном процессе dllhost.exe. Это позволит 64-битному серверу 1С общаться с 32-битной компонентой через механизмы межпроцессного взаимодействия.

Настройка прав доступа для пользователя службы 1С

Выясним причину, по которой 1С может «не видеть» зарегистрированный класс. Когда мы запускаем 1С в режиме предприятия под своим аккаунтом, всё работает, так как регистрация прошла под нами. Однако сервер 1С работает от имени специального системного пользователя (обычно USR1CV8).

У этого пользователя часто отсутствуют права на чтение веток реестра HKEY_CLASSES_ROOT или доступ к папке, в которой физически лежит файл DLL. Проверим следующие настройки:

  1. Дайте пользователю USR1CV8 полные права (или хотя бы права на чтение и выполнение) на папку, где лежит компонента Диадока.
  2. Убедитесь, что библиотека зарегистрирована в ветке HKEY_LOCAL_MACHINE (HKLM), а не HKEY_CURRENT_USER (HKCU). При регистрации через regsvr32 от имени администратора данные обычно попадают в общий раздел, доступный всем.
  3. Проверьте права на временные папки. При использовании метода ПодключитьВнешнююКомпоненту из макета, 1С распаковывает библиотеку в каталог временных файлов пользователя, под которым запущен rphost.

Инициализация компоненты в коде

Рассмотрим пример кода для подключения компоненты. В обычном приложении на сервере мы можем использовать два подхода. Первый — через установку (регистрацию в системе):


// Попытка подключения через системный идентификатор (COM)
ВКПодключена = ПодключитьВнешнююКомпоненту("AddIn.DiadocInvoiceAPI");
Если ВКПодключена Тогда
    ОбъектВК = Новый ("AddIn.DiadocInvoiceAPI");
Иначе
    Сообщить("Не удалось подключить компоненту Диадок на сервере");
КонецЕсли;

Второй подход — использование макета (более надежный для Native API):


// Подключение из макета конфигурации (двоичные данные)
// Рекомендуется упаковывать DLL в ZIP-архив с манифестом
ПутьКМакету = "ОбщийМакет.КомпонентаДиадок";
ВКПодключена = ПодключитьВнешнююКомпоненту(ПутьКМакету, "DiadocNative", ТипВнешнейКомпоненты.Native);
Если ВКПодключена Тогда
    ОбъектВК = Новый ("AddIn.DiadocNative.DiadocClient"); // Имя зависит от манифеста
КонецЕсли;

Проверка зависимостей (Dependencies)

Иногда сама DLL зарегистрирована верно, но она не может инициализироваться, так как в операционной системе отсутствуют вспомогательные библиотеки. Компоненты Диадока написаны на C++ и требуют наличия Microsoft Visual C++ Redistributable.

Посмотрим на ситуацию со стороны старых ОС, таких как Windows Server 2008. На них часто отсутствует Universal C Runtime (CRT). Если СистемнаяИнформация() выдает «Windows 7» или версию ядра 6.1, это явный признак того, что серверу может не хватать обновлений безопасности и системных библиотек, необходимых для работы современных COM-объектов. Рекомендуется установить все пакеты Visual C++ начиная с 2015 года (и x86, и x64 версии одновременно).

Диагностика с помощью внешних утилит

Если вышеуказанные шаги не помогли, проанализируем ситуацию с помощью инструмента Process Monitor (ProcMon). Запустите его на сервере, установите фильтр по процессу rphost.exe и попробуйте выполнить код подключения в 1С.

В логах ProcMon вы увидите реальные обращения к файловой системе и реестру. Если вы заметите статус ACCESS DENIED при обращении к DLL или ключу реестра — проблема в правах. Если статус NAME NOT FOUND для какой-то другой библиотеки (например, msvcp140.dll) — проблема в отсутствующих зависимостях Visual C++.

Итоги и рекомендации

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

  1. Соответствие разрядности: 64-битный сервер 1С требует 64-битную компоненту (или настройку через COM+).
  2. Права доступа: пользователь, от имени которого работает служба 1С, должен иметь доступ к файлу библиотеки и веткам реестра.
  3. Системное окружение: на сервере должны быть установлены необходимые пакеты Visual C++ Redistributable.

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

← На главную