При подключении торгового оборудования мы часто сталкиваемся с тем, что сканеры или считыватели магнитных карт передают в программу "мусорные" символы вместе с полезными данными. Проанализируем типичную ситуацию: считыватель MSR90 подключен к 1С:УНФ (Управление нашей фирмой) в режиме клавиатуры. При попытке найти сертификат по номеру, программа выдает ошибку: Не найден сертификат по номеру: %025010004,. То есть 1С не отсекает служебные символы, а воспринимает их как часть штрихкода или номера карты.
Давайте подробно разберем по шагам, почему это происходит, выясним причину такого поведения драйверов и рассмотрим несколько надежных способов решения этой задачи.
Магнитные карты имеют три дорожки записи, и по стандарту каждая из них начинается с определенного служебного символа (префикса):
% (ASCII-код 37).; (ASCII-код 59).+ (ASCII-код 43).Суффиксом (закрывающим символом) по стандарту обычно выступает знак вопроса ? (ASCII-код 63), после которого также передается команда Enter (возврат каретки, ASCII 13 и 10).
В нашей ситуации пользователь попытался настроить обрезку первой дорожки, указав в настройках драйвера 1С: префикс 37 и суффикс 44 (запятая). Однако программа не обрезала символ %. Причина кроется в особенностях работы библиотеки подключаемого оборудования (БПО). В современных драйверах 1С часто требуется указывать сам строковый символ, а не его десятичный ASCII-код. Если драйвер ждет строку %, а мы пишем туда цифры 37, он не находит совпадений и пропускает весь "мусор" прямо в поле ввода.
Рассмотрим, как правильно прописать настройки отсечения, если мы хотим решить вопрос исключительно средствами 1С:
37 введем непосредственно сам символ %.? или ваша запятая ,), а также обязательно указать символ перевода строки (Enter), чтобы 1С поняла, что ввод завершен.Чтобы 1С могла перехватить ввод в режиме эмуляции клавиатуры, внешнее событие должно генерироваться корректно. Обычно в коде это обрабатывается примерно так:
Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные)
Если Событие = "MagneticCard" Тогда
// Переменная Данные содержит уже очищенный номер карты
// без префиксов и суффиксов, если драйвер настроен верно
ОбработатьСчитываниеКарты(Данные);
КонецЕсли;
КонецПроцедуры
Самый надежный способ, который избавит вас от конфликтов с драйверами 1С — это настройка самого "железа". Рассмотрим подробнее, как прошить считыватель, чтобы он изначально отдавал чистый номер без префиксов.
Enter (CR/LF).Теперь ридер будет аппаратно отсекать служебные знаки. При прокатывании карты он отправит в компьютер только чистый номер 025010004 и нажмет Enter. В 1С настраивать префиксы больше не придется.
Обратите внимание на то, что считыватель был подключен в режиме Порт: Клавиатура. В этом режиме данные передаются так, как если бы вы быстро набирали их на клавиатуре. Из-за этого возникают проблемы с раскладкой (например, в русской раскладке вместо % может набраться цифра 5, а вместо ? — запятая).
Рекомендуется перевести считыватель в режим эмуляции COM-порта (виртуальный RS-232). Для этого:
В режиме COM-порта 1С общается с устройством напрямую. Данные не "проливаются" в открытые текстовые поля, исключаются проблемы с языковой раскладкой Windows, а внешнее событие генерируется со 100% стабильностью.
Если вы сомневаетесь, какие именно символы отправляет ваш ридер, проведем простой тест:
Посмотрим на результат. Вы увидите точную строку, которую отдает устройство, например: %025010004? и курсор перейдет на новую строку. Именно эти крайние символы (знак процента и знак вопроса) вам нужно будет использовать при настройке драйвера в 1С, если вы решите не использовать аппаратное отключение.
Используя комплексный подход (перевод устройства в режим COM-порта и аппаратное отключение служебных символов), вы навсегда забудете об ошибках поиска сертификатов и дисконтных карт в 1С:УНФ.