При работе с устаревшими конфигурациями (например, складскими программами, старыми версиями WMS или самописными решениями) разработчики часто сталкиваются с необходимостью внедрения современного оборудования. Библиотека подключаемого оборудования (БПО) от 1С является стандартом, но её «выдергивание» по частям превращается в бесконечный процесс, что особенно заметно при внедрении мобильных ТСД. Разберем, как избежать этой рутины (по аналогии с тем, как запускаются фоновые задания без БСП) и подключить нативный драйвер сканера напрямую, используя стандартные возможности платформы 1С:Предприятие.
Проанализируем технологическую разницу. Старые драйверы (вроде ScanOpos.dll) работали через технологию COM/ActiveX, иногда требуя программ чтения данных из COM. Это требовало обязательной регистрации библиотеки в реестре Windows (через regsvr32), что часто вызывало проблемы с правами доступа. Современные компоненты Native API лишены этих недостатков:
Для начала нам необходимо получить сам драйвер (если вы хотите подключить телефон вместо обычного сканера, используйте решение для превращения смартфона в беспроводной сканер для 1С). Рассмотрим самый простой путь: возьмем актуальную версию драйвера из любой современной конфигурации, где есть БПО. Нам нужен Общий макет, который обычно называется Драйвер1ССканерШтрихкода (или аналогично). Этот макет представляет собой zip-архив.
Выгрузим этот архив и добавим его в нашу старую конфигурацию как новый Общий макет с типом Двоичные данные. Назовем его, например, ДрайверСканераНативный.
Выясним, как заставить платформу увидеть нашу компоненту. Вместо использования десятков модулей БПО, воспользуемся методами глобального контекста — для удобного интерактивного тестирования и анализа таких алгоритмов есть инструмент отладки программного кода в режиме 1С:Предприятие. Процесс состоит из двух стадий: копирование файлов во временный кэш и их загрузка в память процесса 1С.
Рассмотрим пример кода для инициализации сканера:
// 1. Копируем файлы из макета в локальный каталог пользователя
РезультатУстановки = УстановитьВнешнююКомпоненту("ОбщийМакет.ДрайверСканераНативный");
Если РезультатУстановки Тогда
// 2. Подключаем компоненту. "AddIn.InputDevice" - это программный идентификатор из манифеста
РезультатПодключения = ПодключитьВнешнююКомпоненту("AddIn.InputDevice");
Если РезультатПодключения Тогда
// 3. Создаем объект драйвера
ОбъектДрайвера = Новый("AddIn.InputDevice.Scanner");
Сообщить("Драйвер успешно инициализирован!");
Иначе
Сообщить("Не удалось подключить внешнюю компоненту.");
КонецЕсли;
Иначе
Сообщить("Ошибка при установке компоненты из макета.");
КонецЕсли;
Поскольку мы отказались от визуальных форм настройки БПО, нам придется устанавливать параметры сканера программно. Нативные драйверы 1С управляются через XML-строки или прямые методы. Самый надежный способ — использовать метод УстановитьПараметр.
Проанализируем основные параметры, которые могут нам понадобиться:
Посмотрим на пример установки параметров:
// Установка порта (0 - Клавиатура, 1 - COM1, и так далее)
ОбъектДрайвера.УстановитьПараметр("Port", 0);
// Если используем COM-порт, укажем скорость
ОбъектДрайвера.УстановитьПараметр("BaudRate", 9600);
// Важно! После установки параметров вызываем метод Подключить() самого объекта
Результат = ОбъектДрайвера.Подключить();
Если Результат Тогда
Сообщить("Сканер готов к работе.");
Иначе
ОписаниеОшибки = "";
ОбъектДрайвера.ПолучитьОшибку(ОписаниеОшибки);
Сообщить("Ошибка подключения сканера: " + ОписаниеОшибки);
КонецЕсли;
Полезный совет: Чтобы узнать полный список доступных параметров конкретной версии драйвера, вызовите метод ОбъектДрайвера.ПолучитьПараметры(). Он вернет XML-структуру со всеми настройками, которые поддерживает данная ВК.
Когда сканер считывает штрихкод, он генерирует Внешнее событие — для полноценного использования этих данных в складском учете есть программа автоматизации складских операций по штрихкодам. Чтобы его поймать, в форме (или в модуле приложения) должна присутствовать предопределенная процедура ВнешнееСобытие.
Разберем, как правильно обработать данные:
&НаКлиенте
Процедура ВнешнееСобытие(Источник, Событие, Данные)
// Проверяем, что событие пришло именно от нашего сканера
// Источник совпадает с именем, указанным при подключении (AddIn.InputDevice)
Если Событие = "Barcode" Тогда
// В переменной "Данные" находится считанный штрихкод
Штрихкод = СокрЛП(Данные);
Сообщить("Считан штрихкод: " + Штрихкод);
// Здесь вызываем вашу бизнес-логику поиска товара
ОбработатьШтрихкод(Штрихкод);
КонецЕсли;
КонецПроцедуры
Проанализируем ситуации, которые могут возникнуть при «ручном» внедрении драйверов:
AddIn.InputDevice не работает, откройте zip-архив макета, найдите там файл manifest.xml и посмотрите актуальный progid.ОбъектДрайвера.Освободить() или ОбъектДрайвера.Отключить(). Это предотвратит «зависание» порта.УстановитьПараметр("Suffix", 13), чтобы не заниматься очисткой строк в коде 1С.Использование этого подхода позволяет существенно облегчить конфигурацию. Вместо десятков общих модулей МенеджерОборудования, ПодключаемоеОборудованиеУниверсальныйДрайвер и прочих, вы используете всего один небольшой фрагмент кода, который напрямую взаимодействует с компонентой. Это делает систему более стабильной и простой в поддержке.