При подключении считывателей магнитных карт (ридеров) в 1С:Розница и других конфигурациях на платформе 1С предприятия часто сталкиваются с ситуацией, когда одно и то же физическое устройство или разные ридеры возвращают для одной карты различные значения. Например, считыватель с интерфейсом COM считывает строку ;000963?, а USB-считыватель возвращает ж000963? или з000963?. В результате карта, зарегистрированная на одном рабочем месте, не распознается на другом.
Проанализируем физические и программные причины такого поведения, а также разберем по шагам все способы устранения проблемы — от типовой настройки 1С до аппаратной конфигурации ридеров.
Разница в считываемых данных обусловлена двумя ключевыми факторами: особенностями передачи данных по разным интерфейсам и структурой записи на магнитной дорожке.
; преобразуется драйвером клавиатуры Windows в символ ж, а символ 3 или { может превратиться в з.; является стартовым маркером (Start Sentinel), а символ ? — стоповым маркером (End Sentinel). Чистый номер карты располагается между ними. Разные модели считывателей или драйверов могут быть сконфигурированы по-разному: одни передают «сырой» поток со всеми маркерами, другие автоматически отсекают служебные символы.Если используется типовая конфигурация 1С:Розница (или решения на базе Библиотеки подключаемого оборудования — БПО), дорабатывать программный код не требуется. В системе предусмотрен штатный механизм разбора дорожек.
Выполним настройку по шагам:
;.?.= (если на дорожке кроме номера карты записан срок действия).000963).Чтобы исключить зависимость USB-считывателя от активной раскладки клавиатуры операционной системы, настроим само устройство:
Alt + цифры). В таком режиме драйвер клавиатуры Windows всегда выдает ASCII-символы независимо от языка.;, %, ?.Если конфигурация нестандартная или требуется обработать уже накопленную базу карт, в которой часть номеров записана с русскими символами, а часть с латинскими спецсимволами, реализуем программную очистку входного значения.
Рассмотрим пример функции для очистки считанного кода от служебных символов и корректировки русской раскладки:
Функция НормализоватьКодМагнитнойКарты(Знач ИсходныйКод) Экспорт
// Заменяем символы русской раскладки на стандартные маркеры ISO
ИсходныйКод = СтрЗаменить(ИсходныйКод, "ж", ";");
ИсходныйКод = СтрЗаменить(ИсходныйКод, "Ж", ";");
// Удаляем начальные и конечные маркеры дорожек
ОчищенныйКод = ИсходныйКод;
ОчищенныйКод = СтрЗаменить(ОчищенныйКод, ";", "");
ОчищенныйКод = СтрЗаменить(ОчищенныйКод, "%", "");
ОчищенныйКод = СтрЗаменить(ОчищенныйКод, "?", "");
ОчищенныйКод = СтрЗаменить(ОчищенныйКод, "+", "");
// Если на дорожке присутствуют дополнительные данные после знака "=", отсекаем их
ПозицияРазделителя = СтрНайти(ОчищенныйКод, "=");
Если ПозицияРазделителя > 0 Тогда
ОчищенныйКод = Лев(ОчищенныйКод, ПозицияРазделителя - 1);
КонецЕсли;
Возврат СокрЛП(ОчищенныйКод);
КонецФункции
При использовании этого подхода необходимо выполнить однократную обработку информационной базы, чтобы привести коды всех ранее зарегистрированных карт к единому числовому виду без спецсимволов.
При работе в терминальном режиме эмуляция клавиатуры (HID Keyboard Wedge) работает нестабильно: сетевые задержки приводят к разрыву потока ввода, а рассинхронизация раскладок между локальным клиентом и терминальным сервером искажает символы. Для терминальных ферм рекомендуется использовать исключительно режим COM-порта (или Virtual COM) с последующим пробросом порта в RDP-сессию через стандартную команду перенаправления или средства тонкого клиента 1С.