При переходе на 64-разрядную версию платформы «1С:Предприятие» разработчики часто сталкиваются с критической проблемой: старые, но стабильно работающие 32-разрядные внешние компоненты перестают загружаться. Поскольку 64-разрядный процесс физически не может загрузить в свое адресное пространство 32-разрядную динамическую библиотеку (DLL), стандартный вызов метода ПодключитьВнешнююКомпоненту возвращает ошибку инициализации.
Особенно остро эта проблема стоит для торгового и специализированного оборудования, драйверы к которому были написаны много лет назад (например, сканеры отпечатков пальцев Anviz, весы, фискальные регистраторы) и существуют только в 32-битном исполнении. В этой статье мы подробно разберем, как обойти это ограничение без переписывания кода самой компоненты.
Прежде чем приступать к решению, проанализируем технологию создания нашей внешней компоненты. Часто разработчики путают форматы библиотек. Например, компоненты, созданные в среде разработки Visual Basic 6.0, технически невозможно скомпилировать как Native API по стандартам 1С. Они всегда представляют собой COM/ActiveX DLL.
Если вы пытаетесь подключить такую библиотеку через макеты или манифесты, используя тип подключения Native, 64-битный клиент выдаст ошибку инициализации. Для COM-объектов требуется совершенно иной подход.
Это наиболее надежный и проверенный способ «подружить» 64-разрядный клиент 1С с 32-разрядной COM-библиотекой без изменения кода самой DLL. Суть метода заключается в том, что операционная система Windows запускает 32-битную DLL в отдельном системном процессе dllhost.exe (суррогате), а 64-битный процесс 1С общается с ним посредством межпроцессного взаимодействия (DCOM/RPC). Для самого клиента 1С это выглядит как обращение к обычному локальному COM-объекту.
Рассмотрим подробнее и разберем по шагам процесс настройки на клиентском компьютере:
На 64-разрядной версии Windows обычный вызов регистратора может зарегистрировать библиотеку в 64-битном кусте реестра, где 32-битная библиотека работать не будет. Регистрацию необходимо выполнять строго через 32-разрядную утилиту. Запустите командную строку от имени Администратора и выполните следующую команду:
C:\Windows\SysWOW64\regsvr32.exe "C:\PathToComponent\AnvizComponent.dll"
Откройте панель управления «Службы компонентов». Для этого нажмите сочетание клавиш Win+R, введите команду comexp.msc и нажмите Enter.
В открывшемся дереве перейдите по пути: Консоль управления -> Службы компонентов -> Компьютеры -> Мой компьютер -> Приложения COM+.
Нажмите правой кнопкой мыши на раздел «Приложения COM+», выберите Создать -> Приложение. В мастере создания выберите «Создать новое приложение», введите понятное имя (например, «Anviz_32bit_Surrogate») и обязательно укажите способ активации: «Серверное приложение» (Server application). Это ключевой момент, который заставит компоненту запускаться в отдельном процессе dllhost.exe.
На следующем шаге мастера (или в свойствах уже созданного приложения на вкладке «Удостоверение») укажите учетную запись, под которой будет запускаться процесс. Для локальной работы на ПК пользователя лучше всего выбрать пункт «Интерактивный пользователь». Это избавит от проблем с правами доступа к локальному оборудованию (USB-портам сканера).
Раскройте созданное приложение, нажмите правой кнопкой мыши на папку «Компоненты» и выберите Создать -> Компонент.
В мастере выберите пункт «Импорт уже зарегистрированных компонентов». Обязательно установите флажок «32-разрядные компоненты». Найдите в списке вашу зарегистрированную библиотеку (ориентируйтесь по ProgID или имени файла DLL) и завершите импорт.
После завершения этих настроек в коде 1С мы отказываемся от использования метода ПодключитьВнешнююКомпоненту. Обращение к компоненте выполняется через стандартный механизм создания COM-объектов:
Попытка
// Используем ProgID зарегистрированной компоненты
СканерОтпечатков = Новый COMОбъект("AnvizActiveX.AnvizActiveXCtrl");
// Инициализация и вызов методов компоненты
РезультатПодключения = СканерОтпечатков.ConnectDevice();
Если РезультатПодключения Тогда
Сообщить("Сканер успешно подключен через COM+!");
Иначе
Сообщить("Ошибка подключения оборудования.");
КонецЕсли;
Исключение
ВызватьИсключение "Не удалось запустить 32-битную компоненту через COM+: " + ОписаниеОшибки();
КонецПопытки;
Если настройка службы COM+ на множестве рабочих мест пользователей кажется слишком трудоемкой, самым простым административным решением будет установка и использование 32-разрядной версии тонкого или толстого клиента 1С:Предприятие. На 64-битных операционных системах Windows 32-битный клиент 1С работает абсолютно стабильно и без проблем загружает любые 32-битные динамические библиотеки напрямую в свою память.
При этом серверная часть 1С (если база работает в клиент-серверном режиме) может оставаться 64-разрядной — разрядность клиента и сервера не обязана совпадать.
Если перед вами стоит задача развернуть решение на десятках или сотнях компьютеров, где ручная настройка COM+ превратится в кошмар администратора, имеет смысл вынести логику работы с оборудованием во внешнюю микрослужбу. Разберем эту архитектуру подробнее:
http://localhost:8080).Посмотрим на пример отправки запроса к локальной службе из кода 1С:
HTTPСоединение = Новый HTTPСоединение("localhost", 8080);
HTTPЗапрос = Новый HTTPЗапрос("/scan_fingerprint");
Попытка
HTTPОтвет = HTTPСоединение.Получить(HTTPЗапрос);
Если HTTPОтвет.КодСостояния = 200 Тогда
ДанныеОтпечатка = HTTPОтвет.ПолучитьТелоКакСтроку();
// Дальнейшая обработка полученных данных в 1С
КонецЕсли;
Исключение
ЗаписьЖурналаРегистрации("Оборудование", УровеньЖурналаРегистрации.Ошибка,,, "Служба сканера не отвечает.");
КонецПопытки;
Такой подход полностью снимает проблемы с разрядностью платформы 1С, позволяет безболезненно переходить на 64-разрядного клиента и даже запускать 1С в веб-клиенте через браузер или под операционными системами, отличными от Windows (например, Linux), так как сетевой протокол универсален.
В долгосрочной перспективе, если у вас есть исходные коды оригинальной компоненты и базовые навыки программирования, наиболее современным решением станет перенос логики на язык C# (.NET). При компиляции библиотеки в среде .NET можно выбрать целевую платформу Any CPU.
Такая библиотека способна динамически адаптироваться под разрядность вызывающего процесса: в 32-битном клиенте 1С она будет работать как 32-битная, а в 64-битном — нативно загрузится как 64-битная, не требуя никаких промежуточных прокладок и настроек COM+.