При работе с торговым оборудованием в 1С:Предприятие часто возникает ситуация, когда сканер штрихкода, работающий в режиме «разрыва клавиатуры» (keyboard wedge), успешно выводит данные в блокнот или в поле ввода, но программный код в конфигурации на это никак не реагирует. Рассмотрим подробнее, как устроена механика работы со сканером и разберем по шагам, как заставить систему корректно обрабатывать внешние события.
Прежде всего, проанализируем ситуацию. Сканер в режиме разрыва клавиатуры просто «печатает» символы штрихкода так, будто их вводит человек. Для того чтобы 1С воспринимала этот ввод не как обычный текст, а как Внешнее событие, необходимо использование специального драйвера (например, 1С:Сканеры штрихкода (NativeAPI)). Драйвер анализирует скорость поступления символов и наличие суффикса (обычно это Enter или код 13). Если символы пришли мгновенно и завершились суффиксом, драйвер перехватывает их и генерирует событие в платформе. При возникновении проблем со считыванием маркировки в таком режиме можно использовать способ сохранения символа GS при работе сканера в разрыв клавиатуры.
В современных конфигурациях, построенных на базе Библиотеки подключаемого оборудования (БТО), прямое использование обработчика ОбработкаВнешнегоСобытия в модуле формы часто не дает результата, так как БТО перехватывает это событие на уровне ядра и транслирует его в систему оповещений. Выясним, как правильно интегрировать сканер в свою форму.
Для того чтобы форма начала «слушать» сканер, его необходимо инициализировать. Недостаточно просто настроить оборудование в интерфейсе «Подключение и настройка оборудования». В коде управляемой формы, где требуется работа со штрихкодами, мы должны вызвать методы менеджера оборудования.
Рассмотрим пример кода в модуле формы, который необходимо добавить в процедуру ПриОткрытии:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// Подключаем оборудование через БТО
ПоддерживаемыеТипы = Новый Массив;
ПоддерживаемыеТипы.Добавить("СканерШтрихкода");
// Инициализируем переменную формы для хранения поддерживаемых типов
// Если этого свойства нет в метаданных, его можно создать программно
ЭтаФорма.Вставить("ПоддерживаемыеТипыПодключаемогоОборудования", ПоддерживаемыеТипы);
МенеджерОборудованияКлиент.НачатьПодключениеОборудованиеПриОткрытииФормы(Неопределено, ЭтаФорма, "СканерШтрихкода");
КонецПроцедуры
Важный момент: если вы работаете в нетиповой конфигурации или создаете новую форму в типовой, вы можете столкнуться с ошибкой Поле объекта не обнаружено (ПоддерживаемыеТипыПодключаемогоОборудования). Проанализируем причину: методы БТО ожидают наличие этого реквизита у формы для фильтрации событий. Решить это можно добавлением реквизита в редакторе формы или программным способом через ЭтаФорма.Вставить(...), как показано выше.
В типовых решениях (таких как Комплексная автоматизация 2, ERP 2.5 или УТ 11) событие от сканера не приходит напрямую в ОбработкаВнешнегоСобытия. Вместо этого используется механизм оповещений. Разберем, как реализовать обработчик:
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
// Проверяем, что событие пришло от подключаемого оборудования
Если Источник = "ПодключаемоеОборудование" Тогда
Если ИмяСобытия = "ScanData" Тогда
// Параметр содержит массив данных штрихкода
// Обычно Параметр[0] - это считанный ШК (строка)
// Параметр[1] - данные штрихкода в виде структуры
ОбработатьШтрихкод(Параметр[0]);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОбработатьШтрихкод(Штрихкод)
Сообщить("Считан штрихкод: " + Штрихкод);
// Здесь ваша логика: поиск товара, добавление в корзину и т.д.
КонецПроцедуры
Очень важно освобождать ресурсы при закрытии формы, чтобы сканер мог корректно работать в других окнах системы. Для этого используем процедуру ПриЗакрытии:
&НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)
МенеджерОборудованияКлиент.НачатьОтключениеОборудованияПриЗакрытииФормы(Неопределено, ЭтаФорма);
КонецПроцедуры
Если код написан, а точка останова в ОбработкаОповещения все равно не срабатывает, проанализируем технические настройки самого устройства:
#13 (CR). Проверить это можно кнопкой «Тест устройства». Если в окне теста при сканировании данные появляются, значит суффикс настроен верно.1С:Сканеры штрихкода (NativeAPI). Старые версии драйверов могут некорректно работать в 64-битных клиентах 1С.Вопрос() или Предупреждение() в модальном режиме). Используйте асинхронные вызовы.Если стоит задача сделать так, чтобы сканер работал во всех формах приложения без добавления кода в каждую, можно рассмотреть вариант подключения в Модуле управляемого приложения. В этом случае в процедуре ОбработкаВнешнегоСобытия модуля приложения можно анализировать считанные данные и использовать метод Оповестить(), чтобы передать штрихкод в активную на данный момент форму. Однако стандартный подход БТО рекомендует именно явное подключение в нужных формах для более стабильной и предсказуемой работы оборудования.
Таким образом, мы выяснили, что для успешной работы со сканером в 1С 8.3 необходимо не только настроить само железо, но и правильно интегрировать вызовы БТО в жизненный цикл управляемой формы. Использование ОбработкаОповещения является современным стандартом для конфигураций на управляемых формах. Для решения частных задач в типовых конфигурациях можно использовать готовые инструменты, например, готовое расширение для интеграции сканера в форму подбора УТ 11.