Почему считыватели магнитных карт в 1С выдают разный код для одной и той же карты?

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

При подключении считывателей магнитных карт (ридеров) в 1С:Розница и других конфигурациях на платформе 1С предприятия часто сталкиваются с ситуацией, когда одно и то же физическое устройство или разные ридеры возвращают для одной карты различные значения. Например, считыватель с интерфейсом COM считывает строку ;000963?, а USB-считыватель возвращает ж000963? или з000963?. В результате карта, зарегистрированная на одном рабочем месте, не распознается на другом.

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

Причины возникновения проблемы

Разница в считываемых данных обусловлена двумя ключевыми факторами: особенностями передачи данных по разным интерфейсам и структурой записи на магнитной дорожке.

  1. Влияние интерфейса и языковой раскладки Windows: Считыватель с интерфейсом COM (или Virtual COM) передает байты напрямую в виде кодов символов по протоколу RS-232, поэтому операционная система и текущая раскладка клавиатуры на них не влияют. USB-считыватели по умолчанию работают в режиме HID Keyboard Wedge (эмуляция клавиатуры). При считывании ридер эмулирует быстрое нажатие клавиш. Если в операционной системе в этот момент активна русская раскладка, скан-код клавиши ; преобразуется драйвером клавиатуры Windows в символ ж, а символ 3 или { может превратиться в з.
  2. Служебные символы стандарта ISO/IEC 7811 и 7813: На магнитных картах данные дорожек записываются по международному стандарту. Для второй дорожки (Track 2) символ ; является стартовым маркером (Start Sentinel), а символ ? — стоповым маркером (End Sentinel). Чистый номер карты располагается между ними. Разные модели считывателей или драйверов могут быть сконфигурированы по-разному: одни передают «сырой» поток со всеми маркерами, другие автоматически отсекают служебные символы.

Способ 1. Настройка форматов магнитных карт в типовой 1С:Розница

Если используется типовая конфигурация 1С:Розница (или решения на базе Библиотеки подключаемого оборудования — БПО), дорабатывать программный код не требуется. В системе предусмотрен штатный механизм разбора дорожек.

Выполним настройку по шагам:

  1. Перейдем в раздел Администрирование → Подключаемое оборудование → Форматы записи кодов магнитных карт (или Шаблоны магнитных карт).
  2. Создадим новый элемент с помощью встроенного помощника.
  3. Укажем параметры шаблона для дорожки, с которой считываются данные:
    • Номер дорожки: обычно используется дорожка №2.
    • Начальный символ (префикс): символ ;.
    • Конечный символ (суффикс): символ ?.
    • Разделитель полей: знак = (если на дорожке кроме номера карты записан срок действия).
    • Длина значащего кода: количество символов самого номера (например, 6 знаков).
  4. Сохраним шаблон. После этого 1С при считывании карты с любого устройства будет автоматически отсекать префиксы и суффиксы, выделяя только полезный номер карты (например, 000963).

Способ 2. Аппаратная перенастройка считывателя магнитных карт

Чтобы исключить зависимость USB-считывателя от активной раскладки клавиатуры операционной системы, настроим само устройство:

  1. Перевод в режим Virtual COM (эмуляция последовательного порта): Большинство современных ридеров (Posiflex, CipherLab, Honeywell и др.) поддерживают переключение в режим виртуального COM-порта с помощью управляющих магнитных карт, DIP-переключателей или сервисной утилиты производителя. После установки драйвера виртуального порта считыватель подключается в 1С как устройство с интерфейсом COM, что полностью устраняет влияние раскладки.
  2. Включение режима Alt-кодов (Alt-Mode / NumPad Emulation): В сервисной утилите ридера можно активировать передачу символов через цифровой блок клавиатуры (комбинации Alt + цифры). В таком режиме драйвер клавиатуры Windows всегда выдает ASCII-символы независимо от языка.
  3. Отключение передачи служебных символов (Sentinels): В утилите настройки ридера можно отключить флаги Send Start/End Sentinel для дорожек. Тогда ридер будет отправлять только чистый номер карты без знаков ;, %, ?.

Способ 3. Программная нормализация кода карты в 1С

Если конфигурация нестандартная или требуется обработать уже накопленную базу карт, в которой часть номеров записана с русскими символами, а часть с латинскими спецсимволами, реализуем программную очистку входного значения.

Рассмотрим пример функции для очистки считанного кода от служебных символов и корректировки русской раскладки:


Функция НормализоватьКодМагнитнойКарты(Знач ИсходныйКод) Экспорт

    // Заменяем символы русской раскладки на стандартные маркеры ISO
    ИсходныйКод = СтрЗаменить(ИсходныйКод, "ж", ";");
    ИсходныйКод = СтрЗаменить(ИсходныйКод, "Ж", ";");

    // Удаляем начальные и конечные маркеры дорожек
    ОчищенныйКод = ИсходныйКод;
    ОчищенныйКод = СтрЗаменить(ОчищенныйКод, ";", "");
    ОчищенныйКод = СтрЗаменить(ОчищенныйКод, "%", "");
    ОчищенныйКод = СтрЗаменить(ОчищенныйКод, "?", "");
    ОчищенныйКод = СтрЗаменить(ОчищенныйКод, "+", "");

    // Если на дорожке присутствуют дополнительные данные после знака "=", отсекаем их
    ПозицияРазделителя = СтрНайти(ОчищенныйКод, "=");
    Если ПозицияРазделителя > 0 Тогда
        ОчищенныйКод = Лев(ОчищенныйКод, ПозицияРазделителя - 1);
    КонецЕсли;

    Возврат СокрЛП(ОчищенныйКод);

КонецФункции

При использовании этого подхода необходимо выполнить однократную обработку информационной базы, чтобы привести коды всех ранее зарегистрированных карт к единому числовому виду без спецсимволов.

Особенности работы в среде удаленного рабочего стола (RDP)

При работе в терминальном режиме эмуляция клавиатуры (HID Keyboard Wedge) работает нестабильно: сетевые задержки приводят к разрыву потока ввода, а рассинхронизация раскладок между локальным клиентом и терминальным сервером искажает символы. Для терминальных ферм рекомендуется использовать исключительно режим COM-порта (или Virtual COM) с последующим пробросом порта в RDP-сессию через стандартную команду перенаправления или средства тонкого клиента 1С.

← На главную