Как настроить работу сканера штрихкодов в свернутом окне 1С или через RDP?

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

При автоматизации складского или торгового учета часто возникает ситуация, когда оператору необходимо, чтобы сканер штрихкодов продолжал передавать данные в систему 1С, даже если само окно программы свернуто или пользователь переключился на другое приложение. Типичный пример — работа через удаленный рабочий стол (RDP), когда окно терминала сворачивается для выполнения локальных задач, но процесс приемки или отгрузки товара не должен прерываться.

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

Причина проблемы: Режим эмуляции клавиатуры

Разберем ситуацию: по умолчанию большинство USB-сканеров работают в режиме HID (Human Interface Device), то есть эмулируют нажатие клавиш на клавиатуре. Рассмотрим, как это работает на уровне операционной системы. Когда сканер считывает код, он «печатает» символы в то окно, которое в данный момент находится в фокусе (активно). Если окно 1С свернуто, данные попадут в блокнот, в адресную строку браузера или просто «уйдут в пустоту».

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

Шаг 1. Аппаратная настройка сканера и установка драйверов

Рассмотрим последовательность действий для перевода устройства в нужный режим:

  1. Программирование сканера: Найдите инструкцию к вашему устройству (обычно это PDF-файл на сайте производителя). Вам необходимо считать управляющий штрихкод, который называется Enable USB Serial Emulation или USB COM Mode. После сканирования устройство может издать специфический звуковой сигнал и переинициализироваться в системе.
  2. Установка драйвера VCP: Чтобы Windows распознала устройство как COM-порт, необходимо установить драйвер виртуального COM-порта (Virtual COM Port) от производителя (например, Honeywell, Zebra или Datalogic). После установки в Диспетчере устройств в разделе «Порты (COM и LPT)» должно появиться новое устройство, например, Honeywell USB Serial Port (COM3).
  3. Выбор драйвера в 1С: Перейдем в настройки подключаемого оборудования в 1С. Рекомендуется использовать современные драйверы с поддержкой NativeApi. Рассмотрим их преимущества: они стабильнее работают с асинхронными вызовами и лучше удерживают соединение с портом при переключении между окнами.

Шаг 2. Настройка проброса портов в RDP

Если ваша 1С запущена на удаленном сервере, нам нужно убедиться, что сервер «видит» локальный COM-порт вашего компьютера. Проанализируем настройки подключения mstsc.exe:

Перед подключением к серверу откройте «Параметры», перейдите на вкладку «Локальные ресурсы». В нижней части окна нажмите кнопку «Подробнее...». В появившемся списке обязательно установите флажок напротив пункта «Порты». Только в этом случае локальный COM3 (из нашего примера) станет доступен в удаленной сессии 1С. Без этой настройки внешнее событие просто не будет инициировано на стороне сервера.

Шаг 3. Программная модификация обработчика «ВнешнееСобытие»

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

Рассмотрим пример кода в модуле формы или в общем модуле обработки событий оборудования. Нам нужно найти функцию ВнешнееСобытие. Часто она выглядит так:


Процедура ВнешнееСобытие(Источник, Событие, Данные)
    
    // Проверка, которая мешает работать в свернутом окне
    Если Не ВводДоступен() Тогда
        Возврат;
    КонецЕсли;

    // Далее идет логика обработки штрихкода
    КодДатчик = СокрЛП(Данные);
    ОбработатьШтрихкод(КодДатчик);
    
КонецПроцедуры

Функция ВводДоступен() возвращает Ложь, если окно программы свернуто или перекрыто другим окном. Проанализируем последствия: система получает данные от сканера, вызывает процедуру, но та сразу прекращает работу из-за этого условия.

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


Процедура ВнешнееСобытие(Источник, Событие, Данные)
    
    // Комментируем проверку фокуса, чтобы событие обрабатывалось всегда
    // Если Не ВводДоступен() Тогда
    //     Возврат;
    // КонецЕсли;

    // Теперь данные будут обрабатываться даже в фоновом режиме
    ПакетДиспетчера = СформироватьПакетДанных(Данные);
    МенеджерОборудования.ОбработатьСобытиеСканера(ПакетДиспетчера);
    
КонецПроцедуры

Особенности работы в фоновом режиме

Рассмотрим важный нюанс, который часто называют «суперспособностью» или побочным эффектом данного метода. Если проверка ВводДоступен() отключена, и у пользователя открыто одновременно несколько документов (например, два окна «Приходная накладная»), то при сканировании штрихкода данные могут попытаться записаться сразу во все открытые формы, где инициализирован обработчик события.

Чтобы избежать хаоса, проанализируем стратегию обработки:

Нюансы при использовании RemoteApp

Разберем ситуацию с использованием технологии RemoteApp. В этом режиме транслируется не весь рабочий стол, а только конкретное окно 1С. При сворачивании такого окна Windows может перевести удаленную сессию в состояние Suspended (Приостановлено) для экономии ресурсов сервера. В таком состоянии проброс портов может временно отключаться.

Для решения этой проблемы совместно с системным администратором проверьте настройки политик тайм-аутов на терминальном сервере (RD Session Host). Необходимо установить параметры, запрещающие немедленную приостановку фоновых сессий пользователей.

Резюме по шагам

Подведем итог нашего анализа. Для того чтобы сканер работал в свернутом окне, мы должны:

  1. Отказаться от эмуляции клавиатуры в пользу Virtual COM Port.
  2. Настроить проброс портов в параметрах RDP.
  3. Использовать драйвер NativeApi для обеспечения стабильной связи.
  4. Найти в коде 1С обработчик ВнешнееСобытие и отключить в нем ограничитель ВводДоступен().

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

← На главную