Переход с 32-разрядного (x86) на 64-разрядный (x64) клиент платформы «1С:Предприятие» — это важный шаг для повышения производительности и стабильности работы системы. Однако в этот момент системные администраторы и разработчики часто сталкиваются с аппаратными трудностями. Типичный пример — внезапный отказ работы торгового оборудования, в частности, сканеров штрихкода, которые годами исправно функционировали через старую библиотеку Scaner1c.dll.
В этой статье мы подробно разберем, почему возникает ошибка подключения внешней компоненты в 64-битной среде, проанализируем причины ее несовместимости и рассмотрим три практических способа решения данной проблемы: от самого правильного (переход на Native API) до альтернативных обходных путей.
Выясним первопричину сбоя. Библиотека Scaner1c.dll представляет собой классический 32-разрядный драйвер (чаще всего это старая бесплатная версия драйвера устройств ввода от компании «АТОЛ» серии 6.x). Архитектура операционных систем семейства Windows накладывает жесткое техническое ограничение: 64-разрядный процесс не способен напрямую загрузить в свое адресное пространство 32-разрядную динамическую библиотеку (DLL).
Когда вы запускаете 64-битный клиент «1С:Предприятия», платформа пытается выполнить инициализацию компоненты. Натыкаясь на несовместимость архитектур, операционная система блокирует вызов, и 1С выдает стандартное, но малоинформативное сообщение: «Внешняя компонента драйвера не найдена». Поскольку официальной 64-битной версии старого бесплатного драйвера Scaner1c.dll не существует в природе, нам придется искать альтернативные пути решения.
Это самый правильный, стабильный и поддерживаемый метод автоматизации. Фирма 1С уже давно разработала собственный универсальный драйвер торгового оборудования, работающий по технологии Native API. Он поставляется в двух вариантах разрядности — x86 и x64. Для внедрения такого подхода в типовых конфигурациях можно использовать обработку обслуживания сканеров штрихкода на базе NativeAPI.
Основная ошибка многих разработчиков при попытке использовать новые драйверы заключается в использовании устаревшего метода ЗагрузитьВнешнююКомпоненту. Этот метод ориентирован в первую очередь на COM-технологии и часто дает сбой при работе с Native API в новых версиях платформы. Вместо него мы должны использовать современную функцию ПодключитьВнешнююКомпоненту.
Рассмотрим по шагам, как правильно организовать архитектуру подключения через общие макеты конфигурации:
Драйвер1ССканерШтрихкода, и выберите тип макета — Двоичные данные.ScanOPOSNativeWin32.dll и ScanOPOSNativeWin64.dll), а также специальный файл описания manifest.xml. Этот манифест подскажет платформе 1С, какую именно библиотеку нужно распаковать и запустить под текущим клиентом. Загрузите этот ZIP-архив в созданный общий макет.
&НаКлиенте
Процедура ПодключитьСканерШтрихкода()
ИмяМакета = "ОбщийМакет.Драйвер1ССканерШтрихкода";
ИмяКомпоненты = "ScanOPOS";
// Платформа автоматически выберет нужную разрядность DLL из ZIP-архива макета
Если ПодключитьВнешнююКомпоненту(ИмяМакета, ИмяКомпоненты, ТипВнешнейКомпоненты.Native) Тогда
Попытка
// Создаем объект внешней компоненты
ОбъектСканера = Новый("AddIn.ScanOPOS.Scanner");
Сообщить("Внешняя компонента сканера Native API успешно подключена!");
Исключение
Сообщить("Не удалось создать объект сканера. Текст ошибки: " + ОписаниеОшибки());
КонецПопытки;
Иначе
Сообщить("Не удалось подключить внешнюю компоненту из макета конфигурации!");
КонецЕсли;
КонецПроцедуры
При использовании такого подхода вам больше никогда не придется задумываться, какой именно клиент запущен у конечного пользователя. Платформа самостоятельно определит разрядность операционной системы и сеанса 1С, извлечет нужную DLL из двоичных данных макета и корректно инициализирует ее. Для проверки обработки оповещений и отладки алгоритмов чтения данных подойдёт эмулятор сканера штрихкода для тестирования внешних событий.
Проанализируем ситуацию, когда перейти на Native API по каким-то причинам невозможно (например, конфигурация сильно кастомизирована под логику работы старого драйвера АТОЛ, и переписывание кода повлечет за собой огромные трудозатраты). В этом случае можно заставить 64-битную 1С работать с 32-битной Scaner1c.dll.
Для этого мы воспользуемся встроенной службой операционной системы Windows — COM+ (DLL Surrogate). Суть метода заключается в том, что операционная система запускает специальный изолированный 32-битный процесс суррогата dllhost.exe, загружает в него нашу старую компоненту Scaner1c.dll, а 64-битный клиент 1С общается с этим процессом посредством межпроцессного взаимодействия.
Разберем по шагам алгоритм настройки COM+ в Windows:
C:\Windows\SysWOW64\regsvr32.exe "C:\ПутьКФайлу\Scaner1c.dll"
Win + R, введите команду comexp.msc и нажмите Enter. Перед вами откроется окно настройки служб компонентов Windows.1C_Scanner_Legacy) и обязательно установите флаг «Серверное приложение» (это укажет системе запустить библиотеку в выделенном процессе dllhost.exe). На вкладке удостоверения выберите «Интерактивный пользователь» (или укажите локального администратора).AddIn.Scaner45) и завершите импорт.Сканер = Новый COMОбъект("AddIn.Scaner45");
Посмотрим на самое простое альтернативное решение. Если на компьютерах пользователей установлена 64-битная операционная система Windows, это совершенно не обязывает вас использовать 64-разрядное клиентское приложение «1С:Предприятия».
Если ваша база данных работает в файловом режиме, локально, или если пользователи не формируют сверхтяжелые отчеты, которые могут упереться в лимит оперативной памяти для 32-битных процессов (около 2-4 ГБ), вы можете просто вернуть пользователей на работу под 32-битным клиентом.
Разберем по шагам настройку принудительного запуска:
После этой настройки при старте данной базы платформа автоматически запустит 32-разрядный исполняемый файл клиента 1С. В результате старая внешняя компонента Scaner1c.dll мгновенно заработает в своем привычном режиме без каких-либо доработок конфигурации или операционной системы.
Резюмируем: Для долгосрочной перспективы и стабильной работы в современных реалиях мы настоятельно рекомендуем выполнить переход на Native API компоненты от 1С (Решение 1). Если же требуется быстрое реанимационное решение «здесь и сейчас» без изменения кода — воспользуйтесь принудительным запуском 32-битного клиента (Решение 3) или настройте обертку COM+ (Решение 2).