При автоматизации складского или торгового учета часто возникает ситуация, когда оператору необходимо, чтобы сканер штрихкодов продолжал передавать данные в систему 1С, даже если само окно программы свернуто или пользователь переключился на другое приложение. Типичный пример — работа через удаленный рабочий стол (RDP), когда окно терминала сворачивается для выполнения локальных задач, но процесс приемки или отгрузки товара не должен прерываться.
В этой статье мы подробно разберем, почему стандартная настройка сканера «из коробки» не позволяет этого сделать, и проанализируем шаги, необходимые для реализации фоновой обработки событий сканирования.
Разберем ситуацию: по умолчанию большинство USB-сканеров работают в режиме HID (Human Interface Device), то есть эмулируют нажатие клавиш на клавиатуре. Рассмотрим, как это работает на уровне операционной системы. Когда сканер считывает код, он «печатает» символы в то окно, которое в данный момент находится в фокусе (активно). Если окно 1С свернуто, данные попадут в блокнот, в адресную строку браузера или просто «уйдут в пустоту».
Проанализируем решение: для того чтобы данные попадали в 1С независимо от фокуса окна, нам необходимо перевести сканер в режим COM-порта (RS-232 эмуляция). В этом режиме сканер не имитирует нажатие клавиш, а отправляет поток данных в конкретный порт, который слушает драйвер 1С. Поскольку драйвер работает как низкоуровневая служба внутри сессии, ему не важно, активно ли окно визуального интерфейса в данный момент.
Рассмотрим последовательность действий для перевода устройства в нужный режим:
Enable USB Serial Emulation или USB COM Mode. После сканирования устройство может издать специфический звуковой сигнал и переинициализироваться в системе.Honeywell USB Serial Port (COM3).Если ваша 1С запущена на удаленном сервере, нам нужно убедиться, что сервер «видит» локальный COM-порт вашего компьютера. Проанализируем настройки подключения mstsc.exe:
Перед подключением к серверу откройте «Параметры», перейдите на вкладку «Локальные ресурсы». В нижней части окна нажмите кнопку «Подробнее...». В появившемся списке обязательно установите флажок напротив пункта «Порты». Только в этом случае локальный COM3 (из нашего примера) станет доступен в удаленной сессии 1С. Без этой настройки внешнее событие просто не будет инициировано на стороне сервера.
Даже если сканер настроен правильно и данные поступают в 1С, стандартный код конфигурации может блокировать их обработку, если окно не активно. Выясним причину: во многих типовых решениях в коде обработчика события стоит проверка на доступность ввода.
Рассмотрим пример кода в модуле формы или в общем модуле обработки событий оборудования. Нам нужно найти функцию ВнешнееСобытие. Часто она выглядит так:
Процедура ВнешнееСобытие(Источник, Событие, Данные)
// Проверка, которая мешает работать в свернутом окне
Если Не ВводДоступен() Тогда
Возврат;
КонецЕсли;
// Далее идет логика обработки штрихкода
КодДатчик = СокрЛП(Данные);
ОбработатьШтрихкод(КодДатчик);
КонецПроцедуры
Функция ВводДоступен() возвращает Ложь, если окно программы свернуто или перекрыто другим окном. Проанализируем последствия: система получает данные от сканера, вызывает процедуру, но та сразу прекращает работу из-за этого условия.
Решение: Нам необходимо закомментировать или удалить эту проверку. Посмотрим на исправленный вариант кода:
Процедура ВнешнееСобытие(Источник, Событие, Данные)
// Комментируем проверку фокуса, чтобы событие обрабатывалось всегда
// Если Не ВводДоступен() Тогда
// Возврат;
// КонецЕсли;
// Теперь данные будут обрабатываться даже в фоновом режиме
ПакетДиспетчера = СформироватьПакетДанных(Данные);
МенеджерОборудования.ОбработатьСобытиеСканера(ПакетДиспетчера);
КонецПроцедуры
Рассмотрим важный нюанс, который часто называют «суперспособностью» или побочным эффектом данного метода. Если проверка ВводДоступен() отключена, и у пользователя открыто одновременно несколько документов (например, два окна «Приходная накладная»), то при сканировании штрихкода данные могут попытаться записаться сразу во все открытые формы, где инициализирован обработчик события.
Чтобы избежать хаоса, проанализируем стратегию обработки:
Разберем ситуацию с использованием технологии RemoteApp. В этом режиме транслируется не весь рабочий стол, а только конкретное окно 1С. При сворачивании такого окна Windows может перевести удаленную сессию в состояние Suspended (Приостановлено) для экономии ресурсов сервера. В таком состоянии проброс портов может временно отключаться.
Для решения этой проблемы совместно с системным администратором проверьте настройки политик тайм-аутов на терминальном сервере (RD Session Host). Необходимо установить параметры, запрещающие немедленную приостановку фоновых сессий пользователей.
Подведем итог нашего анализа. Для того чтобы сканер работал в свернутом окне, мы должны:
ВнешнееСобытие и отключить в нем ограничитель ВводДоступен().Соблюдение этих инструкций позволит автоматизировать процесс сканирования и сделать работу оператора более гибкой, освободив его от необходимости постоянно держать окно 1С в фокусе.