Почему не работает сканер штрихкодов в рабочем месте работника склада 1С:ERP и как это исправить?

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

При автоматизации складских процессов в конфигурациях 1С:ERP Управление предприятием и 1С:Комплексная автоматизация часто возникает ситуация: подключенный сканер штрихкодов или терминал сбора данных (ТСД) корректно работает во всех складских документах (срабатывает внешнее событие платформы, строки подбираются автоматически), однако в специализированном интерфейсе «Рабочее место работника склада» сканер функционирует исключительно как клавиатура. В результате кладовщику приходится перед каждым сканированием вручную нажимать кнопку (например, клавишу «4») для вызова диалога ввода штрихкода.

Разберем детально, почему так происходит, проанализируем типовой код конфигурации и рассмотрим надежные способы устранения этой проблемы.

Анализ проблемы и механизма работы оборудования в форме

Выясним причину такого поведения. Для интеграции торгового оборудования в типовых решениях используется подсистема Библиотека подключаемого оборудования (БПО). Механизм БПО разделен на клиентскую и серверную логику:

  1. При открытии формы на сервере проверяется включение соответствующих функциональных опций и инициализируется служебный реквизит формы ИспользоватьПодключаемоеОборудование.
  2. При открытии формы на клиенте выполняется вызов процедуры подключения драйвера устройства, которая проверяет значение этого реквизита. Если он равен Истина, драйвер захватывает устройство и начинает передавать данные через внешние события формы (ВнешнееСобытие / ОбработкаОповещения).

В модуле формы рабочего места работника склада задействована процедура подключения:


Процедура НачатьПодключениеОборудованиеПриОткрытииФормы(ОповещениеПриПодключении, Форма, ПоддерживаемыеТипыПодключаемогоОборудования) Экспорт
    
    Форма.ПоддерживаемыеТипыПодключаемогоОборудования = ПоддерживаемыеТипыПодключаемогоОборудования;
    
    Если Форма.ИспользоватьПодключаемоеОборудование Тогда
            
        Если ОповещениеПриПодключении = Неопределено Тогда
            ОповещениеПриПодключении = Новый ОписаниеОповещения("ПодключитьОборудованиеЗавершениеПоУмолчанию", МенеджерОборудованияКлиент);
        КонецЕсли;
        
        НачатьПодключениеОборудованиеПоТипу(ОповещениеПриПодключении, Форма.УникальныйИдентификатор,
            ПреобразоватьСписокСтрокойВМассив(Форма.ПоддерживаемыеТипыПодключаемогоОборудования));
    КонецЕсли;
    
КонецПроцедуры

В некоторых релизах конфигураций (в частности, линейки 2.2) в форме рабочего места работника склада разработчиками была допущена ошибка: на сервере в обработчике ПриСозданииНаСервере вызов инициализации подсистемы БПО отсутствовал. Вследствие этого реквизит Форма.ИспользоватьПодключаемоеОборудование всегда оставался в значении Ложь, ветка подключения оборудования пропускалась, и драйвер не переводился в режим перехвата событий.

Способ 1. Исправление через расширение конфигурации (рекомендуемый)

Рассмотрим, как аккуратно устранить ошибку без снятия конфигурации с поддержки с помощью расширения.

  1. Создадим новое расширение конфигурации в режиме Конфигуратор.
  2. Добавим в расширение форму рабочего места работника склада (или мобильного рабочего места кладовщика).
  3. Перейдем в модуль формы и переопределим обработчик ПриСозданииНаСервере с директивой &После:

&После("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
    
    // Инициализируем подсистему БПО для формы
    ОбщегоНазначенияУТ.НастроитьПодключаемоеОборудование(ЭтаФорма);
    
    // Либо явно включаем использование оборудования при включенной функциональной опции:
    // ЭтаФорма.ИспользоватьПодключаемоеОборудование = Истина;
    
КонецПроцедуры

Обратите внимание: при закрытии формы сканер должен корректно освобождаться для других окон и документов системы. Убедимся, что в обработчике ПриЗакрытии формы присутствует вызов метода МенеджерОборудованияКлиент.НачатьОтключениеОборудованиеПриЗакрытииФормы.

Способ 2. Обновление конфигурации

Если используется устаревшая редакция программы (ERP 2.2), наиболее системным решением будет плановое обновление конфигурации до актуальных релизов ERP 2.4 или 2.5. В обновленных версиях логика работы складских и мобильных рабочих мест переведена на единые шаблоны БПО, где эта ошибка полностью устранена.

Особенности работы клавиатурного сканера через RDP-соединение

Проанализируем особенности подключения сканеров в режиме разрыва клавиатуры (NativeAPI) при работе в терминальной сессии:

  1. Захват потока ввода: Клавиатурный драйвер 1С способен генерировать внешнее событие только тогда, когда форма успешно подключила устройство через МенеджерОборудованияКлиент. Если подключение не состоялось, поток нажатий клавиш попадает напрямую в активное текстовое поле Windows, что требует постоянной установки фокуса ввода.
  2. Таймауты RDP-протокола: При нестабильном сетевом соединении терминальный клиент может фрагментировать пакеты символов штрихкода. Если пауза между символами превышает настроенный в драйвере таймаут, 1С не распознает строку как штрихкод. В параметрах подключаемого оборудования рекомендуется протестировать увеличение параметра задержки (таймаута) клавиатуры.

Альтернативные архитектурные решения

Если терминальный доступ через RDP вызывает сложности со стабильностью сканирования, рассмотрим следующие варианты оптимизации рабочего места:

  1. Перевод сканера в режим эмуляции COM-порта: Настройка ТСД или ручного сканера в режим Virtual COM (USB-CDC / VCP / SPP) с пробросом COM-порта в RDP-сессию. Для COM-сканеров обработка внешних событий выполняется стабильнее и не зависит от фокуса клавиатуры на элементах управления.
  2. Использование Мобильного клиента 1С: Для современных терминалов сбора данных на базе ОС Android предпочтительно использовать Мобильный клиент 1С:ERP вместо RDP-клиентов. В этом случае работа со сканером осуществляется напрямую через мобильные Native-драйверы или Broadcast Intent, обеспечивая максимальное быстродействие и автономность.
← На главную