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

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

При автоматизации складов и торговых точек часто возникает классическая архитектурная проблема: терминал сбора данных (ТСД) на операционной системе Android подключается через удаленный рабочий стол (RDP) к серверу, где запущена база данных 1С. При попытке отсканировать двухмерный штрихкод (например, QR-код или DataMatrix), содержащий кириллические символы в кодировке UTF-8, пользователь сталкивается с тем, что в 1С вместо русских букв попадает хаотичный набор управляющих символов (таких как DC4, SOH) и нечитаемых «кракозябр». При этом в обычном блокноте внутри той же сессии RDP или локально на самом ТСД все отображается корректно.

В этой статье мы подробно разберем, почему возникает эта проблема при использовании стандартного драйвера ScanOpos от 1С, и рассмотрим несколько эффективных способов ее решения — от простых обходных путей до надежных архитектурных перенастроек.

---

Выясняем причину: почему ScanOpos ломает кодировку через RDP?

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

  1. Разница между Блокнотом и ScanOpos: Когда ТСД сканирует штрихкод в режиме клавиатуры, он эмулирует последовательное нажатие клавиш. Блокнот Windows и стандартные текстовые поля ввода получают данные через высокоуровневые сообщения операционной системы (например, WM_CHAR). Эти сообщения умеют работать с Unicode/UTF-8 напрямую, транслируя символы без привязки к раскладке клавиатуры.
  2. Принцип работы драйвера ScanOpos: Драйвер торгового оборудования от 1С работает на более низком уровне для того, чтобы перехватывать данные до того, как они попадут в активное поле ввода. Он использует клавиатурные хуки (через API-функцию SetWindowsHookEx с перехватом событий WM_KEYDOWN/WM_KEYUP). На этом уровне система оперирует скан-кодами клавиш, которые жестко привязаны к текущей активной раскладке клавиатуры RDP-сессии (русская/английская) и системной кодовой странице (например, Windows-1251 или Windows-1252).
  3. Ограничение клавиатурного порта: В официальной спецификации к компоненте 1С «Сканер штрихкода» (ScanOpos) явно указано, что выбор кодировки (UTF-8, Windows-1251 и др.) доступен исключительно при подключении оборудования через COM-порт. Для порта Клавиатура выбор кодировки заблокирован. Драйвер пытается разобрать входящий поток скан-кодов, используя стандартные таблицы Windows, что в случае двухбайтовых символов UTF-8 неизбежно приводит к искажению русских букв.

---

Вариант 1. Сканирование в выделенное текстовое поле («Режим Блокнота»)

Это самый простой программный обходной путь, который не требует установки стороннего софта на сервер или ТСД. Мы используем тот факт, что стандартные поля ввода 1С (как и Блокнот) отлично принимают UTF-8 напрямую от клавиатурного потока RDP.

Рассмотрим по шагам реализацию этого метода:

  1. Создадим на управляемой форме 1С специальное текстовое поле ввода. Назовем его, например, ПолеВводаШК. Это поле должно быть постоянно активным (на нем должен удерживаться фокус ввода).
  2. В настройках утилиты сканирования на самом ТСД укажем, чтобы после каждого успешного сканирования в конец штрихкода автоматически добавлялся символ перевода строки — Enter (суффикс LF или CR).
  3. Для элемента формы ПолеВводаШК создадим обработчик события ПриИзменении или АвтоПодбор, который будет мгновенно перехватывать введенный текст, запускать бизнес-логику обработки штрихкода и очищать поле ввода для приема следующего штрихкода.

Посмотрим на пример реализации кода на встроенном языке 1С:


&НаКлиенте
Процедура ПолеВводаШКПриИзменении(Элемент)
    
    // Получаем строку из поля ввода, куда RDP успешно транслировал UTF-8
    СтрокаШтрихкода = Объект.ВременноеПолеВводаШК;
    
    Если ПустаяСтрока(СтрокаШтрихкода) Тогда
        Возврат;
    КонецЕсли;
    
    // Вызываем процедуру обработки полученных данных
    ОбработатьПолученныйШтрихкод(СтрокаШтрихкода);
    
    // Очищаем поле ввода, подготавливая его к следующему сканированию
    Объект.ВременноеПолеВводаШК = "";
    
    // Возвращаем фокус на поле ввода, чтобы пользователю не нужно было нажимать на него пальцем
    ТекущийЭлемент = Элементы.ПолеВводаШК;
    
КонецПроцедуры

Преимущества метода: Работает «из коробки», надежно как танк, не зависит от сторонних драйверов и настроек портов на сервере RDP.

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

---

Вариант 2. Проброс сканера через виртуальный COM-порт (Рекомендуемый системный подход)

Поскольку драйвер ScanOpos корректно обрабатывает UTF-8 при работе в режиме COM-порта, лучшим решением будет уход от эмуляции клавиатуры.

Проанализируем алгоритм настройки этой схемы:

  1. Настройка ТСД: В системной утилите управления встроенным сканером ТСД (например, Zebra DataWedge, Honeywell ScanWedge, Urovo RS:Core или CipherLab ReaderConfig) переключите режим вывода (Intent/Output) с эмуляции клавиатуры на передачу данных по COM-порту (профиль Bluetooth SPP или TCP/IP-соединение).
  2. Проброс порта в RDP: Используйте специализированное программное обеспечение для проброса последовательных портов через сеть. Подойдут такие решения, как Serial Port Redirector, утилиты от FabulaTech или open-source решения. Они принимают данные от ТСД по протоколу TCP/IP и создают в сессии RDP виртуальный последовательный порт (например, COM5).
  3. Настройка в 1С: Перейдите в меню подключения торгового оборудования в 1С. В настройках сканера штрихкода выберите созданный порт COM5. В параметре «Кодировка» явно укажите значение UTF-8 (или UTF-8 без BOM в зависимости от версии драйвера).

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

---

Вариант 3. Тонкая настройка встроенной утилиты сканирования ТСД

Если изменить способ подключения к RDP-серверу невозможно, попробуйте изменить параметры эмуляции нажатия клавиш в настройках самого Android-устройства. В современных ТСД встроенные утилиты сканирования предлагают гибкие параметры интеграции:

---

Вариант 4. Переход на современную архитектуру: Мобильный клиент 1С

Если ваша конфигурация 1С разработана на управляемых формах, рассмотрите возможность полного отказа от терминального доступа (RDP) для ТСД. Использование RDP на маленьком экране Android-устройства устарело морально и технически.

Современным стандартом является использование Мобильного клиента 1С:

---

Резюме

Проблема искажения русских символов в ScanOpos при работе через RDP обусловлена низкоуровневым перехватом скан-кодов клавиатуры драйвером 1С. Для быстрого решения проблемы без дополнительных затрат используйте Вариант 1 (сканирование в выделенное поле формы). Для построения надежной, масштабируемой промышленной системы автоматизации склада переведите ТСД на схему работы через виртуальный COM-порт (Вариант 2) или внедрите Мобильный клиент 1С (Вариант 4).

← На главную