При работе со сканерами штрихкодов, подключенными в режиме эмуляции клавиатуры (HID), часто возникает проблема: если у пользователя в операционной системе включена русская раскладка, вместо латинских букв кода маркировки (DataMatrix) в 1С попадают кириллические символы. Например, вместо HZkP мы получаем РЯкз. Это критично для систем маркировки «Честный Знак», где важен точный регистр и набор символов. Разберем подробно, как решить эту задачу программными и аппаратными методами.
Наиболее очевидный способ — перехватить строку, полученную от сканера, и принудительно заменить кириллические символы на соответствующие им латинские клавиши. Это решение полезно, когда нет возможности изменить настройки самого сканера. Проанализируем реализацию такой функции.
Нам необходимо сопоставить каждый символ русской раскладки с символом английской раскладки. Важно учитывать не только буквы, но и знаки препинания, которые при смене раскладки меняются нелинейно (например, точка и запятая).
Рассмотрим пример функции для преобразования строки:
Функция ПреобразоватьКириллицуВЛатиницу(Знач ИсходныйТекст) Экспорт
Рус = "йцукенгшщзхъфывапролджэячсмитьбю.ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ,";
Лат = "qwertyuiop[]asdfghjkl;'zxcvbnm,./QWERTYUIOP{}ASDFGHJKL:""ZXCVBNM<>?";
Результат = "";
Для Индекс = 1 По СтрДлина(ИсходныйТекст) Цикл
Символ = Сред(ИсходныйТекст, Индекс, 1);
Позиция = Найти(Рус, Символ);
Если Позиция > 0 Тогда
Результат = Результат + Сред(Лат, Позиция, 1);
Иначе
Результат = Результат + Символ;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Обратите внимание, что в данном примере мы включили замену для верхнего и нижнего регистра, а также для спецсимволов. Важный нюанс: коды маркировки чувствительны к регистру (Case Sensitive), поэтому использование простого ВРегистр() может повредить данные. Нужно именно посимвольное сопоставление.
Профессиональное решение, которое рекомендуют опытные системные администраторы и программисты, заключается в отказе от режима «в разрыв клавиатуры». Если сканер работает как Virtual COM Port (CDC), данные передаются напрямую в драйвер 1С в виде ASCII-кодов, и текущая раскладка клавиатуры в Windows никак не влияет на результат.
Разберем алгоритм действий по шагам:
Этот метод полностью устраняет проблему раскладки, а также исключает случайное попадание лишних символов, если пользователь решит что-то печатать на клавиатуре в момент сканирования.
Если специфика работы требует оставить сканер в режиме клавиатуры (например, данные должны падать в любое активное окно без использования драйверов 1С), можно воспользоваться режимом Alt Mode (или Universal Keyboard).
Выясним принцип работы этого режима: сканер имитирует не нажатие клавиши A, а ввод цифрового кода символа через клавишу Alt (например, зажимается Alt и на цифровой клавиатуре набирается 065). Windows интерпретирует такие комбинации как конкретные символы ASCII независимо от выбранного языка ввода.
Для включения этого режима проанализируйте документацию сканера на наличие опций:
Если вы используете современные конфигурации на базе 1С:Библиотека подключаемого оборудования (БПО), проверьте настройки драйвера. В параметрах многих современных драйверов для устройств ввода присутствует флаг «Исправлять раскладку» или «Преобразовывать символы».
Посмотрим, как это работает: при получении данных драйвер анализирует входящий поток скан-кодов и, если видит несоответствие (например, данные приходят слишком быстро для ручного ввода и содержат кириллицу в полях, где её быть не может), автоматически выполняет транслитерацию. Однако этот метод не всегда надежен на 100%, поэтому программная проверка в коде 1С остается хорошей подстраховкой.
Проанализируем ситуацию с символом-разделителем GS (Group Separator), который имеет ASCII-код 29. В режиме клавиатуры этот символ часто интерпретируется как нажатие комбинации Ctrl+] или вовсе игнорируется операционной системой.
Для корректной работы с маркировкой в режиме клавиатуры рекомендуется настроить сканер так, чтобы он заменял непечатный символ GS на печатную последовательность (например, # или [GS]). После этого в 1С нужно выполнить обратную замену или учесть этот разделитель при парсинге кода.
Пример программной обработки разделителя после получения данных:
// Предположим, сканер заменяет GS на символ "$"
Штрихкод = СтрЗаменить(ПолученныйШтрихкод, "$", Символ(29));
// Теперь штрихкод готов для передачи в модули интеграции с ГИС МТ
Подводя итоги, можно выделить следующую иерархию решений:
При использовании программного метода всегда учитывайте, что штрихкоды маркировки могут содержать знаки >, ., , и другие, которые в русской раскладке находятся на клавишах Ю, Б и .. Убедитесь, что ваша таблица соответствия заполнена максимально полно.