При автоматизации складов и торговых точек часто возникает классическая архитектурная проблема: терминал сбора данных (ТСД) на операционной системе Android подключается через удаленный рабочий стол (RDP) к серверу, где запущена база данных 1С. При попытке отсканировать двухмерный штрихкод (например, QR-код или DataMatrix), содержащий кириллические символы в кодировке UTF-8, пользователь сталкивается с тем, что в 1С вместо русских букв попадает хаотичный набор управляющих символов (таких как DC4, SOH) и нечитаемых «кракозябр». При этом в обычном блокноте внутри той же сессии RDP или локально на самом ТСД все отображается корректно.
В этой статье мы подробно разберем, почему возникает эта проблема при использовании стандартного драйвера ScanOpos от 1С, и рассмотрим несколько эффективных способов ее решения — от простых обходных путей до надежных архитектурных перенастроек.
---
Для того чтобы выбрать наиболее подходящий метод решения, проанализируем ситуацию на низком уровне и разберем разницу в перехвате данных операционной системой:
WM_CHAR). Эти сообщения умеют работать с Unicode/UTF-8 напрямую, транслируя символы без привязки к раскладке клавиатуры.SetWindowsHookEx с перехватом событий WM_KEYDOWN/WM_KEYUP). На этом уровне система оперирует скан-кодами клавиш, которые жестко привязаны к текущей активной раскладке клавиатуры RDP-сессии (русская/английская) и системной кодовой странице (например, Windows-1251 или Windows-1252).---
Это самый простой программный обходной путь, который не требует установки стороннего софта на сервер или ТСД. Мы используем тот факт, что стандартные поля ввода 1С (как и Блокнот) отлично принимают UTF-8 напрямую от клавиатурного потока RDP.
Рассмотрим по шагам реализацию этого метода:
ПолеВводаШК. Это поле должно быть постоянно активным (на нем должен удерживаться фокус ввода).Enter (суффикс LF или CR).ПолеВводаШК создадим обработчик события ПриИзменении или АвтоПодбор, который будет мгновенно перехватывать введенный текст, запускать бизнес-логику обработки штрихкода и очищать поле ввода для приема следующего штрихкода.Посмотрим на пример реализации кода на встроенном языке 1С:
&НаКлиенте
Процедура ПолеВводаШКПриИзменении(Элемент)
// Получаем строку из поля ввода, куда RDP успешно транслировал UTF-8
СтрокаШтрихкода = Объект.ВременноеПолеВводаШК;
Если ПустаяСтрока(СтрокаШтрихкода) Тогда
Возврат;
КонецЕсли;
// Вызываем процедуру обработки полученных данных
ОбработатьПолученныйШтрихкод(СтрокаШтрихкода);
// Очищаем поле ввода, подготавливая его к следующему сканированию
Объект.ВременноеПолеВводаШК = "";
// Возвращаем фокус на поле ввода, чтобы пользователю не нужно было нажимать на него пальцем
ТекущийЭлемент = Элементы.ПолеВводаШК;
КонецПроцедуры
Преимущества метода: Работает «из коробки», надежно как танк, не зависит от сторонних драйверов и настроек портов на сервере RDP.
Недостатки: Требует постоянного удержания фокуса на одном элементе формы. Если пользователь случайно кликнет мимо поля ввода, сканирование перестанет работать.
---
Поскольку драйвер ScanOpos корректно обрабатывает UTF-8 при работе в режиме COM-порта, лучшим решением будет уход от эмуляции клавиатуры.
Проанализируем алгоритм настройки этой схемы:
COM5).COM5. В параметре «Кодировка» явно укажите значение UTF-8 (или UTF-8 без BOM в зависимости от версии драйвера).В результате данные будут передаваться напрямую в обход клавиатурного буфера операционной системы Windows, что полностью гарантирует сохранность кодировки любых кириллических символов.
---
Если изменить способ подключения к RDP-серверу невозможно, попробуйте изменить параметры эмуляции нажатия клавиш в настройках самого Android-устройства. В современных ТСД встроенные утилиты сканирования предлагают гибкие параметры интеграции:
KeyEvent (посимвольная эмуляция нажатий клавиатуры). Это заставит RDP-клиент корректно транслировать каждый символ.Treat data as binary («Передавать данные как бинарные»). Принудительно задайте кодировку windows-1251 или utf-8.---
Если ваша конфигурация 1С разработана на управляемых формах, рассмотрите возможность полного отказа от терминального доступа (RDP) для ТСД. Использование RDP на маленьком экране Android-устройства устарело морально и технически.
Современным стандартом является использование Мобильного клиента 1С:
Intent).---
Проблема искажения русских символов в ScanOpos при работе через RDP обусловлена низкоуровневым перехватом скан-кодов клавиатуры драйвером 1С. Для быстрого решения проблемы без дополнительных затрат используйте Вариант 1 (сканирование в выделенное поле формы). Для построения надежной, масштабируемой промышленной системы автоматизации склада переведите ТСД на схему работы через виртуальный COM-порт (Вариант 2) или внедрите Мобильный клиент 1С (Вариант 4).