Почему не сканируется штрихкод в созданной форме 1С:Розница 2.3 и как это исправить?

Программист 1С v8.3 (Управляемые формы) 1С:Розница Торговля и дистрибуция
← На главную

Часто при доработке конфигурации 1С:Розница 2.3 возникает задача создать в Рабочем месте кассира (РМК) новую кнопку, открывающую произвольную форму с полем для ввода штрихкода. Однако при сканировании штрихкода ничего не происходит: данные не появляются в поле, а система никак не реагирует. Давайте разберем эту ситуацию и выясним причину, а также рассмотрим несколько рабочих способов решения проблемы.

Выясним причины проблемы

Проанализируем ситуацию: почему типовое оборудование перестает работать в новом окне, хотя в самом РМК всё функционирует исправно. Вот основные причины:

  1. Отсутствие обработчиков событий в коде. Новая форма по умолчанию не содержит обработчик события сканирования, поэтому она просто не выводит полученные данные.
  2. Блокировка COM-порта фоновым окном. Если сканер работает в режиме эмуляции COM-порта, операционная система отдает его 1С монопольно. Если основная форма РМК осталась открытой на фоне, она продолжает удерживать порт, и ваша новая форма не сможет к нему подключиться.
  3. Несовпадение режима работы сканера. Сканеры могут работать в режиме эмуляции клавиатуры (USB-HID). В таком режиме внешнее событие 1С может не генерироваться, если в настройках драйвера порт жестко не установлен в значение «Клавиатура».
  4. Отсутствие инициализации в БПО. Библиотека подключаемого оборудования (БПО) требует явного указания, с какими типами устройств умеет работать форма, иначе методы настройки проигнорируют подключение.

Решение 1: Подключение оборудования через стандартные функции БПО

Рассмотрим подробнее классический подход, при котором мы инициализируем сканер штрихкода непосредственно в новой форме при помощи процедур общих модулей Библиотеки подключаемого оборудования. Это то самое решение, которое чаще всего применяют программисты.

Чтобы заставить форму реагировать на сканер, добавим вызовы служебных процедур в стандартные обработчики событий нашей формы:

  1. При создании формы на сервере выполняем базовую настройку оборудования. Вызываем метод НастроитьПодключаемоеОборудование.
  2. При открытии формы инициируем подключение оборудования на клиенте.
  3. При закрытии формы обязательно отключаем оборудование, чтобы освободить его для основного окна РМК.
  4. В обработчике ВнешнееСобытие перехватываем данные от драйвера сканера.

Посмотрим на пример кода, который необходимо разместить в модуле вашей новой формы:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    ПодключаемоеОборудованиеРТВызовСервера.НастроитьПодключаемоеОборудование(ЭтотОбъект);
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
    МенеджерОборудованияКлиент.НачатьПодключениеОборудованиеПриОткрытииФормы(ЭтотОбъект);
КонецПроцедуры

&НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)
    МенеджерОборудованияКлиент.НачатьОтключениеОборудованиеПриЗакрытииФормы(ЭтотОбъект);
КонецПроцедуры

&НаКлиенте
Процедура ВнешнееСобытие(Источник, Событие, Данные)
    ПодключаемоеОборудованиеРТКлиент.ВнешнееСобытиеОборудования(ЭтотОбъект, Источник, Событие, Данные);
КонецПроцедуры

Важное примечание: чтобы конфигурация поняла, что данное окно должно работать именно со сканером, в реквизиты формы обычно требуется добавить строковый реквизит ПоддерживаемыеТипыПодключаемогоОборудования и задать ему значение СканерШтрихкода.

Решение 2: Перехват оповещений от основной формы

Платформа 1С имеет ограничения: она не умеет одновременно получать данные от одного COM-порта в нескольких независимых окнах без конфликтов. Постоянное программное отключение и подключение сканера (как в первом решении) при быстром переключении окон может приводить к сбоям или замедлению работы интерфейса. Разберем альтернативный вариант.

Если оборудование уже успешно инициализировано в основном окне РМК, не пытайтесь захватывать его в новой форме. При сканировании РМК часто рассылает полученные данные платформенным методом Оповестить. Вам достаточно перехватить эту рассылку:

  1. Создайте в новой форме обработчик события ОбработкаОповещения.
  2. Проанализируйте входящие параметры — имя события.
  3. Если событие соответствует сканированию штрихкода, извлеките переданные данные и выполните необходимые действия в форме.

Решение 3: Эмуляция клавиатуры без внешних событий

Если мы хотим максимально упростить задачу и вовсе отказаться от вызовов БПО в новой форме, переведите сканер в режим работы «Клавиатура». Проанализируем по шагам, как это настроить:

  1. Убедитесь, что сканер аппаратно настроен на передачу суффикса (обычно это возврат каретки: CR, Enter). Проверить это легко: откройте Блокнот и отсканируйте код. Если цифры напечатались и курсор автоматически перешел на новую строку — сканер настроен верно.
  2. В 1С, в справочнике «Подключаемое оборудование», убедитесь, что у сканера выбран порт «Клавиатура».
  3. На вашей созданной форме добавьте обычное поле ввода (убедитесь, что тип значения — Строка).
  4. При открытии формы программно устанавливайте фокус в это поле, используя свойство ТекущийЭлемент.
  5. Назначьте этому полю ввода обработчик события ПриИзменении.

Когда кассир сканирует товар, устройство само «введет» цифры в активное поле и сымитирует нажатие клавиши Enter. Это мгновенно вызовет событие ПриИзменении. В этом обработчике вы сможете программно забрать считанный текст, выполнить ваш алгоритм, а затем очистить поле, подготовив его для следующего сканирования.

← На главную