При переходе с платных драйверов торгового оборудования на стандартные бесплатные решения от 1С специалисты часто сталкиваются с неочевидными проблемами. Разберем по шагам классическую ситуацию: сканер штрихкодов успешно проходит тестирование, в блокнот или поля ввода считываются правильные цифры, но программа наотрез отказывается попадать во ВнешнееСобытие (или ОбработкаВнешнегоСобытия). Вторая проблема, с которой мы столкнемся — это критическая ошибка программы при физическом отключении сканера от компьютера.
Проанализируем обе ситуации подробно и найдем оптимальные решения, чтобы торговое оборудование работало стабильно и без сбоев.
Посмотрим на исходную ситуацию. Пользователь использует бесплатный драйвер сканера от 1С (например, версию 8.1.6.1). В окне "Тест устройства" COM-порт определяется корректно, штрихкод отображается. Однако при сканировании в самой обработке или документе код просто вводится как текст, а платформа не генерирует внешнее событие.
Выясним причину такого поведения. Дело кроется в механике работы драйверов:
Чтобы драйвер понял, что последовательность символов является законченным штрихкодом и пора вызвать ОбработкаВнешнегоСобытия, сканер должен передавать суффикс (разделитель). Если суффикс не настроен, 1С воспринимает сканирование как быструю печать на клавиатуре (эмуляция клавиатуры). Внешнее событие при этом не формируется.
Рассмотрим подробнее, как исправить эту проблему. Нам нужно настроить суффикс передачи данных. Чаще всего в качестве суффикса используется символ возврата каретки CR (Enter, в настройках 1С обозначается как #13) и/или перевода строки LF (в 1С — #10).
Чтобы сканер начал отправлять этот символ, выполним следующие шаги:
13 или CR).После этой настройки сканер начнет посылать завершающий символ, драйвер 1С перехватит его и корректно передаст вызов во ВнешнееСобытие.
Проанализируем вторую проблему. После успешной настройки сканера выясняется, что если устройство физически отключить (например, вытащить USB-кабель), документы в 1С перестают открываться и выдают ошибку:
{ВнешняяОбработка.СканерШтрихкода.МодульОбъекта(268)}: Ошибка при вызове метода контекста (Занять)
Если Объект.Драйвер.Занять(1) = 0 Тогда
по причине:
Ошибка вызова метода внешней компоненты
Выясним причину. Метод Занять() используется внешней компонентой для монопольного захвата системного COM-порта (или эмулированного USB-COM порта). Когда сканер отключают, порт мгновенно пропадает из диспетчера устройств Windows. При открытии формы документа 1С инициализирует подключенное оборудование и пытается обратиться к несуществующему порту. Драйвер не может найти порт и возвращает фатальную ошибку, которая прерывает выполнение кода и обрушивает открытие формы.
Рассмотрим решение на уровне кода 1С. Поскольку мы не можем гарантировать, что сканер всегда будет подключен, нам нужно защитить код инициализации драйвера с помощью перехвата исключений. Это классический и технически правильный подход, который применяется в современных версиях Библиотеки подключаемого оборудования (БПО).
Обернем проблемный участок стандартной обработки обслуживания в конструкцию Попытка ... Исключение. Посмотрим на пример кода, который решает эту задачу:
Попытка
Если Объект.Драйвер.Занять(1) = 0 Тогда
Объект.Драйвер.УстройствоВключено = 1;
Объект.Драйвер.ПосылкаДанных = 1;
Объект.Драйвер.ОчиститьВход();
Объект.Драйвер.ОчиститьВыход();
Если Объект.Драйвер.УстройствоВключено <> 1 Тогда
Отключить(Объект);
Результат = мОшибкаПриПодключении;
КонецЕсли;
Иначе
Отключить(Объект);
Результат = мОшибкаПриПодключении;
КонецЕсли;
Исключение
// Если порт не найден или оборудование физически отключено,
// перехватываем ошибку метода Занять(), отключаем объект в 1С
// и корректно возвращаем флаг ошибки, не прерывая работу пользователя.
Отключить(Объект);
Результат = мОшибкаПриПодключении;
КонецПопытки;
Проанализируем ситуацию: теперь, если порт отсутствует, метод Занять() все равно вызовет исключение в платформе 1С, но оно будет перехвачено блоком Исключение. Программа аккуратно вернет результат об ошибке подключения и продолжит открывать документ. Пользователь просто увидит информационное сообщение о том, что сканер не подключен, но сможет продолжить работу с базой.
Если внесение изменений в код обработки обслуживания по каким-то причинам нежелательно, рассмотрим альтернативный, административный путь решения проблемы.
В настройках 1С оборудование привязывается к справочнику "Рабочие места" (идентификация обычно идет по имени компьютера клиента). Если на одном и том же компьютере сканер то используется, то отключается, можно создать в 1С два разных рабочих места:
При запуске 1С без сканера пользователь может выбрать "пустое" рабочее место. Программа даже не будет пытаться инициализировать COM-порт, и ошибка с методом Занять() не возникнет. Однако программное решение с использованием блока Попытка ... Исключение остается наиболее надежным и автоматизированным подходом, избавляющим пользователей от лишних действий.