Как настроить сканер Honeywell 1450g для чтения DataMatrix с больничных листов в 1С без искажения кириллицы?

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

При попытке автоматизировать ввод бумажных листков нетрудоспособности с помощью 2D-сканеров (в частности, популярной модели Honeywell 1450g2D) пользователи и программисты часто сталкиваются с ошибкой сопоставления данных. При считывании двумерного штрихкода DataMatrix в окне 1С вместо русских букв появляются символы неопознанного знака Unicode �, из-за чего система выдает сообщение о невозможности найти сотрудника и организацию.

Разберем по шагам, почему возникает эта ошибка и какими способами можно наладить корректное считывание информации в информационные базы 1С.

Причина возникновения ошибки кодировки

Проанализируем техническую сторону формирования штрихкода на бланке больничного листа:

  1. Кодировка данных в коде: Текстовые данные на бланке листка нетрудоспособности (ФИО сотрудника, наименование ЛПУ, диагнозы и т.д.) зашифрованы разработчиками ФСС в однобайтовой кодовой странице Windows-1251 (CP1251).
  2. Ограничение встроенного драйвера 1С: Стандартная компонента «1С:Сканеры штрихкода (NativeAPI)» при работе с виртуальным COM-портом по умолчанию ожидает поток данных в кодировке UTF-8 либо транслирует байты по таблице ISO-8859-1. Старшая половина таблицы байтов (символы кириллицы с 0xC0 по 0xFF) не может быть корректно сопоставлена, что приводит к генерации символов подстановки � (код 65533).
  3. Особенности режима клавиатуры (USB HID-POS / Keyboard Wedge): При передаче данных в режиме эмуляции клавиатуры сканер посылает скан-коды клавиш. Если в момент сканирования в операционной системе активна английская раскладка, кириллический текст превращается в бессмысленный набор латинских символов. При активной русской раскладке текст в блокноте читается корректно, однако 1С не перехватывает этот поток как внешнее событие оборудования.

Способ 1. Использование сторонних сертифицированных драйверов торгового оборудования

Наиболее надежным решением при работе сканера через эмуляцию виртуального COM-порта является замена стандартного драйвера 1С NativeAPI на специализированный сторонний драйвер (например, драйвер устройств ввода АТОЛ). В отличие от типовой компоненты 1С, специализированные драйверы предоставляют возможность явно зафиксировать входную кодовую страницу CP1251 для входящего COM-потока. В этом случае внешнее событие в платформу передается уже с готовой корректной строкой UTF-8.

Способ 2. Настройка сканера в клавиатурном режиме с генерацией внешнего события

Если требуется использовать клавиатурный режим (USB HID Keyboard), необходимо настроить передачу спецсимволов, чтобы 1С распознала скан-код как внешнее событие от торгового оборудования:

  1. Переводим сканер в режим эмуляции клавиатуры с включенной поддержкой Alt-режима (ALT Mode / KBDALT1) по инструкции к сканеру Honeywell. В этом режиме сканер отправляет символы через комбинацию клавиши Alt и цифрового кода на Numpad, что исключает зависимость от текущей раскладки клавиатуры в Windows.
  2. Программируем в сканере управляющий суффикс (например, CR / Enter) и префикс (например, STX или F7).
  3. В 1С в справочнике «Подключаемое оборудование» создаем устройство с типом «Сканеры штрихкода» на базе драйвера клавиатурного ввода и прописываем аналогичные значения префикса и суффикса для перехвата события.

Способ 3. Программная перекодировка входящего потока в 1С

Если сканер работает в режиме эмуляции COM-порта, но данные поступают байт-в-байт по таблице ISO-8859-1 (где каждый кириллический символ CP1251 представлен байтом в диапазоне 192–255), можно выполнить программное преобразование строки в обработчике внешнего события через расширение конфигурации.

Посмотрим на пример функции перекодировки двоичных данных в кодировку Windows-1251 средствами встроенного языка 1С:


Функция ПреобразоватьСтрокуБольничногоВКириллицу(ВходнаяСтрока) Экспорт
    // Преобразуем входящую строку в двоичные данные как ISO-8859-1
    ДвоичныеДанные = ПолучитьДвоичныеДанныеИзСтроки(ВходнаяСтрока, "ISO-8859-1", Ложь);
    
    // Считываем те же байты, интерпретируя их как windows-1251
    Результат = ПолучитьСтрокуИзДвоичныхДанных(ДвоичныеДанные, "windows-1251");
    Возврат Результат;
КонецФункции

Такой подход позволяет восстановить оригинальный текст, содержащий ФИО сотрудника, наименование медицинской организации и периоды нетрудоспособности, после чего передать его в стандартный алгоритм заполнения документа «Больничный лист».

Альтернатива: Прямой обмен через СЭДО

Отметим, что в современных версиях программ 1С (1С:ЗУП, 1С:Бухгалтерия, 1С:ERP) работа с бумажными листками нетрудоспособности сведена к минимуму. Рекомендуется использовать функционал социального электронного документооборота (СЭДО) с Социальным фондом России (СФР). При наличии номера электронного листка нетрудоспособности (ЭЛН) и СНИЛС сотрудника документ загружается автоматически напрямую из фонда через защищенный шлюз, что полностью исключает необходимость ручного сканирования штрихкодов.

← На главную