Перевод старых конфигураций 1С на новые платформы — это частая практика, продиктованная требованиями законодательства. Например, для подключения современных онлайн-касс (54-ФЗ) разработчикам приходится обновлять старые базы «1С:Управление торговлей 10.3» (УТ 10.3), работавшие годами на платформе 8.1, и запускать их под управлением современной платформы «1С:Предприятие 8.3». Однако при таком переходе часто ломается годами отлаженная интеграция с торговым оборудованием. Типичный пример — считыватель магнитных карт (СМК), который внезапно перестает определяться в программе, хотя в системе (в Блокноте) исправно выводит считанные коды.
В этой статье мы подробно разберем, почему возникает данная проблема, проанализируем внутренние механизмы взаимодействия драйверов АТОЛ с платформой 8.3 и найдем несколько путей решения этой технической неполадки.
---
Рассмотрим ситуацию: считыватель настроен в режиме эмуляции клавиатуры. При проведении карты в Блокноте появляется строка вида ;2588?. Это говорит о том, что само устройство аппаратно исправно. Однако 1С отказывается реагировать на событие проведения карты. Разберем основные причины такого поведения оборудования:
; превратится в букву ж, а суффикс ? — в запятую или другой символ. В результате драйвер 1С не сможет распознать границы посылки данных и проигнорирует событие.Scaner1C.dll) написаны под 32-разрядную архитектуру и физически не могут инициализироваться в 64-битном процессе 1С.---
Самый быстрый и рабочий способ, который помог автору темы — это использование проверенной временем бесплатной версии драйвера АТОЛ. Версии «Драйвера устройств ввода» 6.x (например, 6.5.3 или 6.6) не требовали платных лицензий для работы в режиме эмуляции клавиатуры.
Чтобы реализовать этот метод, выполним следующие шаги:
Scaner1C.dll.---
Если вы вынуждены работать на новых драйверах или хотите гарантировать стабильную работу клавиатурного считывателя вне зависимости от раскладки клавиатуры операционной системы, необходимо настроить префиксы и суффиксы с помощью виртуальных кодов клавиш (Virtual Key Codes). Это позволит драйверу идентифицировать нажатия клавиш на низком уровне.
Проанализируем стандартные параметры для второй дорожки магнитной карты (Track 2):
; (виртуальный код клавиши — #186).? (виртуальный код клавиши — #191).Enter (виртуальный код клавиши — #13).Выполним пошаговую настройку параметров в окне настроек драйвера 1С:
---
Работа торгового оборудования в режиме эмуляции клавиатуры таит в себе множество архитектурных проблем (зависимость от фокуса ввода, перехват другими программами, искажение раскладки). Наиболее надежным решением является перевод СМК в режим виртуального COM-порта (Virtual COM Port).
Рассмотрим алгоритм перевода устройства в режим эмуляции последовательного порта:
COM3).COM3 вместо клавиатурного интерфейса.При такой схеме работы драйверу 1С больше не нужно отлавливать нажатия клавиш в операционной системе. Как только карта проводится через ридер, данные напрямую поступают в соответствующий COM-порт, и платформа 1С мгновенно генерирует асинхронное внешнее событие.
---
Давайте посмотрим, как устроен механизм обработки данных на уровне кода конфигурации УТ 10.3. При успешном сканировании карты драйвер посылает сигнал, который обрабатывается предопределенной процедурой ПриВнешнемСобытии (или ОбработкаВнешнегоСобытия) в модуле формы или в глобальном модуле.
Разберем пример программного кода, который выполняется при чтении магнитной карты кассира или дисконтной карты покупателя:
Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные)
// Проверяем, что событие пришло именно от торгового оборудования
Если ПолучитьЭкземплярТО().ПолучитьТипПодключаемогоОборудования(Источник) = Перечисления.ВидыПодключаемогоОборудования.СчитывательМагнитныхКарт Тогда
// Очищаем полученную строку от возможных лишних пробелов и управляющих символов
ОчищенныеДанные = СокрЛП(Данные);
// Разберем ситуацию, когда данные пришли в формате ";КодКарты?"
Если Лев(ОчищенныеДанные, 1) = ";" Тогда
ОчищенныеДанные = Сред(ОчищенныеДанные, 2);
КонецЕсли;
Если Прав(ОчищенныеДанные, 1) = "?" Тогда
ОчищенныеДанные = Лев(ОчищенныеДанные, СтрДлина(ОчищенныеДанные) - 1);
КонецЕсли;
// Вызываем функцию поиска считанной карты в базе данных
ОбработатьСчитанныйКодКарты(ОчищенныеДанные);
КонецЕсли;
КонецПроцедуры
Если в процессе отладки вы видите, что процедура ОбработкаВнешнегоСобытия вообще не вызывается системой при проведении карты, это однозначно указывает на проблему связи драйвера с устройством в операционной системе, либо на несовместимость разрядности платформы 1С и подключаемой dll-библиотеки торгового оборудования.
Используя приведенные инструкции и методы диагностики, вы сможете оперативно локализовать и устранить проблемы со считывателями магнитных кодов при любых обновлениях платформы и конфигураций семейства 1С.