При попытке автоматизировать ввод бумажных листков нетрудоспособности с помощью 2D-сканеров (в частности, популярной модели Honeywell 1450g2D) пользователи и программисты часто сталкиваются с ошибкой сопоставления данных. При считывании двумерного штрихкода DataMatrix в окне 1С вместо русских букв появляются символы неопознанного знака Unicode �, из-за чего система выдает сообщение о невозможности найти сотрудника и организацию.
Разберем по шагам, почему возникает эта ошибка и какими способами можно наладить корректное считывание информации в информационные базы 1С.
Проанализируем техническую сторону формирования штрихкода на бланке больничного листа:
0xC0 по 0xFF) не может быть корректно сопоставлена, что приводит к генерации символов подстановки � (код 65533).Наиболее надежным решением при работе сканера через эмуляцию виртуального COM-порта является замена стандартного драйвера 1С NativeAPI на специализированный сторонний драйвер (например, драйвер устройств ввода АТОЛ). В отличие от типовой компоненты 1С, специализированные драйверы предоставляют возможность явно зафиксировать входную кодовую страницу CP1251 для входящего COM-потока. В этом случае внешнее событие в платформу передается уже с готовой корректной строкой UTF-8.
Если требуется использовать клавиатурный режим (USB HID Keyboard), необходимо настроить передачу спецсимволов, чтобы 1С распознала скан-код как внешнее событие от торгового оборудования:
Alt и цифрового кода на Numpad, что исключает зависимость от текущей раскладки клавиатуры в Windows.CR / Enter) и префикс (например, STX или F7).Если сканер работает в режиме эмуляции 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) работа с бумажными листками нетрудоспособности сведена к минимуму. Рекомендуется использовать функционал социального электронного документооборота (СЭДО) с Социальным фондом России (СФР). При наличии номера электронного листка нетрудоспособности (ЭЛН) и СНИЛС сотрудника документ загружается автоматически напрямую из фонда через защищенный шлюз, что полностью исключает необходимость ручного сканирования штрихкодов.