При разработке учетных систем на платформе 1С:Предприятие 8.3 часто возникает задача интеграции торгового оборудования. Типичная ситуация: сканер подключен, успешно проходит тесты в драйвере, но при сканировании в самой программе ничего не происходит — процедура ВнешнееСобытие не срабатывает. Разберем пошагово, почему это происходит, как правильно инициализировать оборудование и как решить более сложную задачу — идентификацию конкретного устройства, если к одному компьютеру подключено несколько сканеров.
Если устройство успешно «пищит» и выдает код в тестовой утилите драйвера, но 1С «молчит», проанализируем состояние системы. Рассмотрим наиболее частые ошибки:
ВнешнееСобытие.DataEventEnabled = 1.Рассмотрим ситуацию, когда конфигурация самописная и вы не хотите внедрять тяжелую «Библиотеку подключаемого оборудования» (БПО). В этом случае мы работаем с внешней компонентой (ВК) напрямую. Проанализируем пример кода, который позволяет инициализировать сканер при старте системы.
В модуле управляемого приложения определим переменную и инициализируем её:
Перем ДрайверСканШК Экспорт;
&НаКлиенте
Процедура ПриНачалеРаботыСистемы()
Попытка
// Подключаем компоненту, например, АТОЛ
Результат = ПодключитьВнешнююКомпоненту("AddIn.Scaner45");
Если Результат Тогда
ДрайверСканШК = Новый("AddIn.Scaner45");
ДрайверСканШК.OldVersion = 0;
ДрайверСканШК.AutoDisable = 1; // Автовыключение после получения данных
ДрайверСканШК.DataEventEnabled = 1; // Включаем ожидание события
КонецЕсли;
Исключение
Сообщить("Не удалось загрузить драйвер сканера!");
КонецПопытки;
КонецПроцедуры
Затем в форме документа или справочника, где требуется ввод данных, мы перехватываем событие:
&НаКлиенте
Процедура ВнешнееСобытие(Источник, Событие, Данные)
Если ВводДоступен() Тогда
// Проверяем, что событие пришло именно от нашего сканера
Если Источник = "BarCodeScaner" Или Источник = "Scanner" Тогда
Штрихкод = СокрЛП(Данные);
// Здесь логика обработки штрихкода
ОбработатьШтрихкод(Штрихкод);
// Важно: возвращаем драйвер в режим ожидания нового события
ДрайверСканШК.DataEventEnabled = 1;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Для тиражных решений или сложных систем рекомендуется использовать БПО. Это избавляет от необходимости писать низкоуровневый код для каждой модели сканера. Разберем преимущества этого подхода:
При использовании БПО в форме необходимо вызвать методы подключения оборудования при создании и отключения при закрытии. События будут приходить в общую процедуру, где в параметре Данные часто передается структура, содержащая не только штрихкод, но и идентификатор устройства.
Выясним причину сложности: если к одному ПК подключено несколько сканеров (например, на разных постах конвейера), стандартное внешнее событие может возвращать одинаковый источник. Рассмотрим три способа решения этой задачи:
1. Использование префиксов (Самый надежный способ).
Большинство современных сканеров поддерживают программирование префиксов на уровне «железа». Мы можем настроить сканер №1 так, чтобы он добавлял к коду символы S1_, а сканер №2 — S2_. Тогда в 1С достаточно проанализировать начало строки:
Если Лев(Данные, 3) = "S1_" Тогда
// Данные от первого участка
Код = Сред(Данные, 4);
ИначеЕсли Лев(Данные, 3) = "S2_" Тогда
// Данные от второго участка
Код = Сред(Данные, 4);
КонецЕсли;
2. Разные экземпляры объектов драйвера.
Если вы подключаете сканеры через COM-порты вручную, вы можете создать несколько глобальных переменных (например, ДрайверУчасток1, ДрайверУчасток2) и инициализировать их на разные порты. При регистрации компоненты методом ПодключитьВнешнююКомпоненту можно указать уникальное имя источника для каждого экземпляра. Тогда параметр Источник в процедуре ВнешнееСобытие будет содержать конкретное имя, которое вы задали.
3. Идентификатор устройства в БПО.
В современных версиях БПО при обработке события через МенеджерОборудованияКлиент.ПолучитьДанныеСобытия возвращается структура, в которой есть поле Устройство. Это ссылка на элемент справочника «Подключаемое оборудование». Таким образом, вы можете однозначно определить, какой именно экземпляр сканера из справочника прислал данные.
Проанализируем ситуацию, когда 1С запущена на сервере. В этом случае крайне важно:
Подводя итог, отметим, что для простых задач достаточно прямой работы с ВК и настройки DataEventEnabled. Для промышленных решений с несколькими устройствами лучше всего подходит комбинация БПО и аппаратной настройки префиксов сканеров, что гарантирует стабильную идентификацию источника данных вне зависимости от порта подключения.