Как подключить 32-битную DLL-библиотеку к 64-разрядной платформе 1С?

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

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

В этой статье мы подробно разберем, почему возникает данная проблема, проанализируем внутренние механизмы взаимодействия процессов в Windows и рассмотрим четыре практических способа решения этой задачи — от простой настройки системного реестра до перевода компоненты на современные стандарты разработки.

Выясняем причину: почему происходит сбой?

Прежде чем перейти к практике, разберем техническую суть проблемы. Архитектура операционных систем семейства Windows накладывает жесткое ограничение: 64-разрядный процесс физически не может загрузить 32-битную динамическую библиотеку (DLL) в свое адресное пространство. Справедливо и обратное утверждение.

Когда мы запускаем 64-разрядный клиент 1С (файл 1cv8.exe) или серверный процесс rphost.exe аналогичной разрядности, платформа пытается загрузить COM-объект в режиме "In-Process" (внутри своего процесса). Поскольку библиотека является 32-битной, операционная система блокирует эту операцию на системном уровне. В результате метод ПодключитьВнешнююКомпоненту завершается неудачей.

Чтобы обойти это ограничение, нам необходимо заставить библиотеку работать вне процесса 1С (Out-of-Process). В этом случае операционная система запустит специальный служебный процесс-посредник нужной разрядности, загрузит библиотеку в него и организует передачу данных (маршалинг) между 64-битной 1С и 32-битной компонентой.

Рассмотрим подробнее рабочие варианты реализации этого механизма.

---

Вариант 1. Настройка суррогатного процесса Windows (DllSurrogate) через реестр

Это один из самых изящных способов решения проблемы, который не требует установки дополнительного программного обеспечения или настройки тяжеловесных служб. Мы укажем операционной системе, что для нашей библиотеки необходимо использовать стандартный системный 32-битный суррогатный процесс dllhost.exe.

Разберем процесс настройки по шагам:

  1. Регистрация библиотеки: Первым делом зарегистрируем нашу DLL в системе. Важно использовать именно 32-битную версию утилиты регистрации. Запустите командную строку от имени администратора и выполните следующую команду:
    
    C:\Windows\SysWOW64\regsvr32.exe "C:\ПутьКВашейБиблиотеке\MyLibrary.dll"
    
  2. Поиск CLSID в реестре: Откройте редактор реестра (команда regedit). Поскольку библиотека 32-битная, в 64-разрядной Windows ее настройки будут находиться в ветке перенаправления. Перейдите по следующему пути:

    HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{Ваш_GUID_Компоненты}

    Примечание: Если вы не знаете GUID вашей библиотеки, найдите его по программному идентификатору (ProgID) в ветке HKEY_CLASSES_ROOT\Wow6432Node\.

  3. Настройка AppID: Внутри раздела вашего GUID создайте новый строковый параметр (тип REG_SZ) с именем AppID. В качестве его значения укажите точно такой же GUID вашей компоненты в фигурных скобках: {Ваш_GUID_Компоненты}.
  4. Создание раздела в AppID: Перейдите в ветку реестра:

    HKEY_CLASSES_ROOT\Wow6432Node\AppID\

    Создайте там новый подраздел (папку), назвав его вашим GUID: {Ваш_GUID_Компоненты}.
  5. Включение суррогата: Внутри только что созданного подраздела создайте строковый параметр (тип REG_SZ) с именем DllSurrogate. Значение этого параметра оставьте пустым. Это заставит Windows использовать системный процесс dllhost.exe по умолчанию.
  6. Дублирование для надежности: Для того чтобы настройки гарантированно применились для всех пользователей и процессов, рекомендуется продублировать создание раздела с вашим GUID по пути:

    HKEY_LOCAL_MACHINE\Software\Classes\AppID\{Ваш_GUID_Компоненты}

    Также создайте там пустой строковый параметр DllSurrogate.

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


&НаКлиенте
Процедура ПодключитьБиблиотеку()
    Попытка
        МойОбъект = Новый COMОбъект("ProgID_Вашей_Библиотеки");
        МойОбъект.ВыполнитьДействие();
        Сообщить("Библиотека успешно подключена через DllSurrogate!");
    Исключение
        ВызватьИсключение "Ошибка инициализации COM-объекта: " + ОписаниеОшибки();
    КонецПопытки;
КонецПроцедуры

---

Вариант 2. Использование Служб компонентов (COM+ Application)

Если вам не хочется вручную править реестр Windows, можно воспользоваться встроенным графическим интерфейсом операционной системы для управления COM-компонентами. Этот способ особенно актуален, если вызовы происходят на стороне 64-битного сервера 1С.

Проанализируем алгоритм настройки службы компонентов:

  1. Откройте меню "Выполнить" (сочетание клавиш Win + R), введите команду dcomcnfg и нажмите Enter. Откроется оснастка "Службы компонентов".
  2. В левом дереве консоли перейдите по пути: Службы компонентов -> Компьютеры -> Мой компьютер -> Приложения COM+.
  3. Нажмите правой кнопкой мыши на разделе "Приложения COM+", выберите пункт Создать -> Приложение. Откроется мастер установки приложений.
  4. Нажмите "Далее", затем выберите "Создать новое приложение". Укажите понятное имя (например, My32BitLibraryApp).
  5. Важный шаг: На следующем шаге выбора способа активации обязательно укажите пункт "Серверное приложение" (Server application). Это заставит приложение запускаться в собственном процессе dllhost.exe.
  6. В качестве учетной записи для запуска укажите "Интерактивный пользователь" (если запуск происходит на клиенте под текущим пользователем) либо укажите конкретного системного пользователя с правами администратора (актуально для сервера 1С). Завершите работу мастера.
  7. В дереве созданного приложения раскройте его ветку, найдите папку Компоненты, нажмите правой кнопкой мыши и выберите Создать -> Компонент.
  8. В мастере импорта выберите "Установка новых компонентов" и укажите путь к вашей зарегистрированной 32-битной DLL. Система автоматически импортирует необходимые интерфейсы.

Теперь при вызове конструктора Новый COMОбъект операционная система перехватит запрос, запустит созданное нами приложение COM+ в отдельном 32-разрядном процессе и предоставит 64-разрядному клиенту 1С прозрачный доступ к методам библиотеки.

---

Вариант 3. Изменение разрядности клиента 1С (для файловых баз)

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

Для того чтобы принудительно запускать базу под 32-битным клиентом, выполните следующие действия:

  1. Запустите окно выбора информационных баз 1С:Предприятия.
  2. Выберите вашу базу в списке и нажмите кнопку "Изменить".
  3. В открывшемся окне параметров нажмите кнопку "Далее", чтобы перейти на последнюю страницу настроек запуска.
  4. Найдите поле "Разрядность". Вместо значения "Выбирать автоматически" или "64 (x64)" принудительно укажите значение "32 (x86)".
  5. Нажмите кнопку "Готово".

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

---

Вариант 4. Перевод компоненты на технологию Native API (стратегическое решение)

Если вы являетесь разработчиком подключаемой библиотеки или имеете доступ к ее исходному коду, лучшим архитектурным решением будет отказ от технологии COM/ActiveX в пользу кроссплатформенного стандарта Native API, активно развиваемого фирмой "1С".

Компоненты, написанные по технологии Native API, обладают следующими преимуществами:

Разберем пример структуры манифеста компоненты, поддерживающей обе разрядности Windows:


<?xml version="1.0" encoding="UTF-8"?>
<component xmlns="http://v8.1c.ru/8.2/addin/bundle">
    <component id="MyComponent" type="native" path="MyComp32.dll" os="Windows" arch="i386"/>
    <component id="MyComponent" type="native" path="MyComp64.dll" os="Windows" arch="x86_64"/>
</component>

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

← На главную