При разработке системы учета "с нуля" или при добавлении функционала торгового оборудования в пустую конфигурацию программисты часто сталкиваются с одной и той же проблемой: внешняя компонента (DLL) загружена успешно, но 1С никак не реагирует на сканирование штрихкода. Данные просто вводятся в активное текстовое поле, как с обычной клавиатуры, либо не приходят вовсе, а процедура ОбработкаВнешнегоСобытия игнорируется системой.
В этой статье мы подробно разберем, как правильно реализовать механизм подключения сканера, почему простого вызова ЗагрузитьВнешнююКомпоненту() недостаточно и какие настройки драйвера являются критическими для возникновения события в 1С.
Прежде всего, проанализируем, как ваш сканер передает данные в компьютер. Существует два основных режима:
ВнешнееСобытие. Это самый надежный и правильный способ работы с оборудованием.Рассмотрим подробнее ситуацию, когда используется клавиатурный сканер и старый драйвер АТОЛ (например, версия 6.6, файл Scaner1C.dll), который умеет "перехватывать" клавиатурный ввод и превращать его в событие 1С.
Одной загрузки библиотеки в память недостаточно. Чтобы драйвер начал перехватывать данные, необходимо создать объект и явно включить устройство. Разберем этот процесс на примере кода для платформы 1С 8.х:
// В модуле формы или глобальном модуле
Перем ОбъектСканер;
Процедура ПодключитьОборудование()
ПутьКДрайверу = "C:\Drivers\Scaner1C.dll";
Если ЗагрузитьВнешнююКомпоненту(ПутьКДрайверу) Тогда
// Создаем экземпляр объекта драйвера
Попытка
ОбъектСканер = Новый COMОбъект("AddIn.Scaner45");
// Очень важный момент: активация устройства
ОбъектСканер.УстройствоВключено = 1;
ОбъектСканер.Включить(1);
Сообщить("Сканер успешно подключен и активирован!");
Исключение
Сообщить("Не удалось создать объект драйвера. Проверьте регистрацию DLL.");
КонецПопытки;
Иначе
Сообщить("Файл драйвера не найден по указанному пути.");
КонецЕсли;
КонецПроцедуры
Если вы не установите свойство УстройствоВключено = 1, драйвер будет находиться в режиме ожидания и не будет генерировать никаких событий, даже если штрихкод физически считывается.
Для того чтобы драйвер АТОЛ (или любой другой) понял, что набор символов является именно штрихкодом, а не случайным нажатием клавиш пользователем, используются специальные маркеры — префиксы и суффиксы. Как правило, сканеры по умолчанию настроены на передачу суффикса "Возврат каретки" (Enter, код 13).
Выясним причину, по которой событие может не приходить: если в настройках драйвера в 1С (через меню Сервис — Параметры — Драйвер сканера) указан суффикс #13, а сам физический сканер этот суффикс не посылает, драйвер будет бесконечно ждать завершения строки и не передаст событие в систему.
Рекомендация:
CR или LF).Часто пользователи жалуются: "Я настроил сканер, выбрал 'Клавиатура', нажал 'ОК', но после перезапуска 1С настройки сбросились на COM1". Это происходит из-за того, что старые компоненты (особенно АТОЛ 6.х) пытаются записывать настройки в ветку реестра HKEY_LOCAL_MACHINE, к которой у обычного пользователя нет прав доступа.
Проанализируем ситуацию: если настройки не сохраняются, выполните следующие действия:
После этого настройки будут сохранены в реестре окончательно, и при обычном запуске сканер будет работать корректно.
Теперь, когда оборудование настроено, нужно правильно принять данные. В пустой конфигурации в форме документа или справочника должен быть определен обработчик. Рассмотрим пример реализации для обычных форм:
Процедура ВнешнееСобытие(Источник, Событие, Данные)
// Источник — обычно "Scanner", Событие — "BarCodeValue"
Если Событие = "BarCodeValue" Тогда
Штрихкод = СокрЛП(Данные);
Сообщить("Считан штрихкод: " + Штрихкод);
// Здесь мы можем вызвать функцию поиска товара по штрихкоду
// НайтиТоварПоШтрихкоду(Штрихкод);
// После обработки события важно очистить буфер драйвера (если требуется)
ОбъектСканер.ОчиститьВход();
ОбъектСканер.ПосылкаДанных = 1;
КонецЕсли;
КонецПроцедуры
Если вы работаете в 1С v7.7, структура будет аналогичной, но инициализацию лучше выносить в глобальный модуль в процедуру ПриНачалеРаботыСистемы, чтобы сканер был доступен во всех формах базы.
Если у вас возникают непреодолимые сложности с драйвером АТОЛ (например, из-за платных лицензий в новых версиях или конфликтов с x64 платформой), стоит рассмотреть стандартную компоненту от 1С — ScanOpos.dll. Она работает стабильнее в режиме эмуляции COM-порта.
Для перехода в режим COM-порта обычно нужно найти в инструкции к сканеру специальный настроечный штрихкод "Enable USB Serial Emulation" и считать его. После этого в диспетчере устройств Windows появится новый COM-порт, который нужно указать в настройках 1С.
Если внешнее событие в пустой конфигурации не срабатывает, проверьте следующие пункты:
regsvr32 для DLL или метод ЗагрузитьВнешнююКомпоненту() возвращает Истина?Новый COMОбъект("AddIn.Scaner45") (или другой ProgID)?УстройствоВключено = 1?Соблюдение этих шагов позволит вам успешно интегрировать сканер штрихкодов в любую, даже самую простую конфигурацию на платформе 1С.