Как решить проблему с подключением Scaner1c.dll в 64-разрядном клиенте 1С

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

Переход с 32-разрядного (x86) на 64-разрядный (x64) клиент платформы «1С:Предприятие» — это важный шаг для повышения производительности и стабильности работы системы. Однако в этот момент системные администраторы и разработчики часто сталкиваются с аппаратными трудностями. Типичный пример — внезапный отказ работы торгового оборудования, в частности, сканеров штрихкода, которые годами исправно функционировали через старую библиотеку Scaner1c.dll.

В этой статье мы подробно разберем, почему возникает ошибка подключения внешней компоненты в 64-битной среде, проанализируем причины ее несовместимости и рассмотрим три практических способа решения данной проблемы: от самого правильного (переход на Native API) до альтернативных обходных путей.

Почему старая компонента Scaner1c.dll не работает в x64 клиенте 1С?

Выясним первопричину сбоя. Библиотека Scaner1c.dll представляет собой классический 32-разрядный драйвер (чаще всего это старая бесплатная версия драйвера устройств ввода от компании «АТОЛ» серии 6.x). Архитектура операционных систем семейства Windows накладывает жесткое техническое ограничение: 64-разрядный процесс не способен напрямую загрузить в свое адресное пространство 32-разрядную динамическую библиотеку (DLL).

Когда вы запускаете 64-битный клиент «1С:Предприятия», платформа пытается выполнить инициализацию компоненты. Натыкаясь на несовместимость архитектур, операционная система блокирует вызов, и 1С выдает стандартное, но малоинформативное сообщение: «Внешняя компонента драйвера не найдена». Поскольку официальной 64-битной версии старого бесплатного драйвера Scaner1c.dll не существует в природе, нам придется искать альтернативные пути решения.

Решение 1. Переход на современную технологию 1С:Сканер штрихкода (Native API)

Это самый правильный, стабильный и поддерживаемый метод автоматизации. Фирма 1С уже давно разработала собственный универсальный драйвер торгового оборудования, работающий по технологии Native API. Он поставляется в двух вариантах разрядности — x86 и x64. Для внедрения такого подхода в типовых конфигурациях можно использовать обработку обслуживания сканеров штрихкода на базе NativeAPI.

Основная ошибка многих разработчиков при попытке использовать новые драйверы заключается в использовании устаревшего метода ЗагрузитьВнешнююКомпоненту. Этот метод ориентирован в первую очередь на COM-технологии и часто дает сбой при работе с Native API в новых версиях платформы. Вместо него мы должны использовать современную функцию ПодключитьВнешнююКомпоненту.

Рассмотрим по шагам, как правильно организовать архитектуру подключения через общие макеты конфигурации:

  1. Создание общего макета: В конфигураторе добавьте новый Общий макет. Задайте ему имя, например, Драйвер1ССканерШтрихкода, и выберите тип макета — Двоичные данные.
  2. Подготовка ZIP-архива: Для обеспечения кроссплатформенности подготовьте ZIP-архив. Внутри него должны находиться файлы драйверов под обе архитектуры (например, ScanOPOSNativeWin32.dll и ScanOPOSNativeWin64.dll), а также специальный файл описания manifest.xml. Этот манифест подскажет платформе 1С, какую именно библиотеку нужно распаковать и запустить под текущим клиентом. Загрузите этот ZIP-архив в созданный общий макет.
  3. Написание программного кода: Нам нужно написать отказоустойчивый код инициализации сканера. Посмотрим на практический пример реализации подключения на клиенте:

&НаКлиенте
Процедура ПодключитьСканерШтрихкода()
    
    ИмяМакета = "ОбщийМакет.Драйвер1ССканерШтрихкода";
    ИмяКомпоненты = "ScanOPOS";
    
    // Платформа автоматически выберет нужную разрядность DLL из ZIP-архива макета
    Если ПодключитьВнешнююКомпоненту(ИмяМакета, ИмяКомпоненты, ТипВнешнейКомпоненты.Native) Тогда
        Попытка
            // Создаем объект внешней компоненты
            ОбъектСканера = Новый("AddIn.ScanOPOS.Scanner");
            Сообщить("Внешняя компонента сканера Native API успешно подключена!");
        Исключение
            Сообщить("Не удалось создать объект сканера. Текст ошибки: " + ОписаниеОшибки());
        КонецПопытки;
    Иначе
        Сообщить("Не удалось подключить внешнюю компоненту из макета конфигурации!");
    КонецЕсли;
    
КонецПроцедуры

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

Решение 2. Обходной путь через системный механизм Windows COM+ (DLL Surrogate)

Проанализируем ситуацию, когда перейти на Native API по каким-то причинам невозможно (например, конфигурация сильно кастомизирована под логику работы старого драйвера АТОЛ, и переписывание кода повлечет за собой огромные трудозатраты). В этом случае можно заставить 64-битную 1С работать с 32-битной Scaner1c.dll.

Для этого мы воспользуемся встроенной службой операционной системы Windows — COM+ (DLL Surrogate). Суть метода заключается в том, что операционная система запускает специальный изолированный 32-битный процесс суррогата dllhost.exe, загружает в него нашу старую компоненту Scaner1c.dll, а 64-битный клиент 1С общается с этим процессом посредством межпроцессного взаимодействия.

Разберем по шагам алгоритм настройки COM+ в Windows:

  1. Регистрация библиотеки: Сначала необходимо зарегистрировать библиотеку в реестре Windows. Поскольку библиотека 32-битная, запускать регистратор нужно строго из системной папки WOW64. Откройте командную строку от имени администратора и выполните следующую команду:

    C:\Windows\SysWOW64\regsvr32.exe "C:\ПутьКФайлу\Scaner1c.dll"

  2. Настройка Служб компонентов: Нажмите сочетание клавиш Win + R, введите команду comexp.msc и нажмите Enter. Перед вами откроется окно настройки служб компонентов Windows.
  3. Создание приложения COM+: В левом дереве перейдите по пути: Службы компонентов -> Компьютеры -> Мой компьютер -> Приложения COM+. Нажмите правой кнопкой мыши по разделу «Приложения COM+», выберите Создать -> Приложение. В мастере создания выберите «Создать новое приложение», укажите понятное имя (например, 1C_Scanner_Legacy) и обязательно установите флаг «Серверное приложение» (это укажет системе запустить библиотеку в выделенном процессе dllhost.exe). На вкладке удостоверения выберите «Интерактивный пользователь» (или укажите локального администратора).
  4. Импорт компоненты: Внутри созданного приложения раскройте ветку и найдите папку Компоненты. Нажмите по ней правой кнопкой мыши, выберите Создать -> Компонент. В мастере выберите пункт «Импорт уже зарегистрированных компонентов». Найдите в предложенном списке зарегистрированную ранее библиотеку сканера (она может называться, например, AddIn.Scaner45) и завершите импорт.
  5. Подключение в коде 1С: Теперь ваша 64-битная платформа 1С сможет успешно создавать объект сканера через стандартный COM-механизм:

    Сканер = Новый COMОбъект("AddIn.Scaner45");

    Система сама перенаправит вызов в 32-битное окружение, и сканер начнет функционировать без изменения разрядности платформы 1С.

Решение 3. Принудительный запуск 32-разрядного клиента 1С

Посмотрим на самое простое альтернативное решение. Если на компьютерах пользователей установлена 64-битная операционная система Windows, это совершенно не обязывает вас использовать 64-разрядное клиентское приложение «1С:Предприятия».

Если ваша база данных работает в файловом режиме, локально, или если пользователи не формируют сверхтяжелые отчеты, которые могут упереться в лимит оперативной памяти для 32-битных процессов (около 2-4 ГБ), вы можете просто вернуть пользователей на работу под 32-битным клиентом.

Разберем по шагам настройку принудительного запуска:

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

После этой настройки при старте данной базы платформа автоматически запустит 32-разрядный исполняемый файл клиента 1С. В результате старая внешняя компонента Scaner1c.dll мгновенно заработает в своем привычном режиме без каких-либо доработок конфигурации или операционной системы.

Резюмируем: Для долгосрочной перспективы и стабильной работы в современных реалиях мы настоятельно рекомендуем выполнить переход на Native API компоненты от 1С (Решение 1). Если же требуется быстрое реанимационное решение «здесь и сейчас» без изменения кода — воспользуйтесь принудительным запуском 32-битного клиента (Решение 3) или настройте обертку COM+ (Решение 2).

← На главную