При переходе на 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-битной компонентой.
Рассмотрим подробнее рабочие варианты реализации этого механизма.
---
Это один из самых изящных способов решения проблемы, который не требует установки дополнительного программного обеспечения или настройки тяжеловесных служб. Мы укажем операционной системе, что для нашей библиотеки необходимо использовать стандартный системный 32-битный суррогатный процесс dllhost.exe.
Разберем процесс настройки по шагам:
C:\Windows\SysWOW64\regsvr32.exe "C:\ПутьКВашейБиблиотеке\MyLibrary.dll"
regedit). Поскольку библиотека 32-битная, в 64-разрядной Windows ее настройки будут находиться в ветке перенаправления. Перейдите по следующему пути:
HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{Ваш_GUID_Компоненты}
Примечание: Если вы не знаете GUID вашей библиотеки, найдите его по программному идентификатору (ProgID) в ветке HKEY_CLASSES_ROOT\Wow6432Node\.
REG_SZ) с именем AppID. В качестве его значения укажите точно такой же GUID вашей компоненты в фигурных скобках: {Ваш_GUID_Компоненты}.HKEY_CLASSES_ROOT\Wow6432Node\AppID\
{Ваш_GUID_Компоненты}.
REG_SZ) с именем DllSurrogate. Значение этого параметра оставьте пустым. Это заставит Windows использовать системный процесс dllhost.exe по умолчанию.HKEY_LOCAL_MACHINE\Software\Classes\AppID\{Ваш_GUID_Компоненты}
DllSurrogate.
После выполнения этих манипуляций перезагрузка компьютера не требуется. В коде 1С мы теперь можем обращаться к объекту напрямую, минуя попытки локального подключения:
&НаКлиенте
Процедура ПодключитьБиблиотеку()
Попытка
МойОбъект = Новый COMОбъект("ProgID_Вашей_Библиотеки");
МойОбъект.ВыполнитьДействие();
Сообщить("Библиотека успешно подключена через DllSurrogate!");
Исключение
ВызватьИсключение "Ошибка инициализации COM-объекта: " + ОписаниеОшибки();
КонецПопытки;
КонецПроцедуры
---
Если вам не хочется вручную править реестр Windows, можно воспользоваться встроенным графическим интерфейсом операционной системы для управления COM-компонентами. Этот способ особенно актуален, если вызовы происходят на стороне 64-битного сервера 1С.
Проанализируем алгоритм настройки службы компонентов:
Win + R), введите команду dcomcnfg и нажмите Enter. Откроется оснастка "Службы компонентов".My32BitLibraryApp).dllhost.exe.Теперь при вызове конструктора Новый COMОбъект операционная система перехватит запрос, запустит созданное нами приложение COM+ в отдельном 32-разрядном процессе и предоставит 64-разрядному клиенту 1С прозрачный доступ к методам библиотеки.
---
Посмотрим на ситуацию с практической стороны. Если ваша информационная база является файловой, а все ключевые операции производятся на стороне клиента, возможно, вам вообще не требуется использовать 64-разрядный клиент 1С. Использование 32-разрядной версии платформы мгновенно решает проблему совместимости "из коробки" без каких-либо системных настроек.
Для того чтобы принудительно запускать базу под 32-битным клиентом, выполните следующие действия:
При следующем запуске базы платформа автоматически выберет исполняемый файл 32-разрядного клиента (при условии, что у вас установлена соответствующая версия платформы). В этом окружении метод ПодключитьВнешнююКомпоненту отработает штатно, и библиотека загрузится без лишних прослоек.
---
Если вы являетесь разработчиком подключаемой библиотеки или имеете доступ к ее исходному коду, лучшим архитектурным решением будет отказ от технологии COM/ActiveX в пользу кроссплатформенного стандарта Native API, активно развиваемого фирмой "1С".
Компоненты, написанные по технологии Native API, обладают следующими преимуществами:
manifest.xml), в котором описываются скомпилированные файлы для каждой платформы.Разберем пример структуры манифеста компоненты, поддерживающей обе разрядности 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 или серверный процесс), выберет соответствующий файл из манифеста и корректно инициализирует его. Это исключит необходимость настройки реестра и сделает ваше решение надежным и масштабируемым.