При подключении терминалов сбора данных (ТСД) марки Opticon (модели OPL-9728, PHL-1300, OPH-1004 и др.) через драйвер «Штрих-М» на операционных системах Windows 7 специалисты нередко сталкиваются с неприятным поведением: тест драйвера отрабатывает корректно, однако при попытке загрузки или выгрузки данных непосредственно из 1С система намертво зависает. Терминал переходит в статус «Готов к запросу», после чего обмен останавливается, а вывести устройство из этого состояния удается только клавишей сброса (Clr).
Разберем детально, в чем кроется техническая причина такого сбоя, на каких участках программного кода 1С он проявляется и какие шаги необходимо предпринять для восстановления стабильной работы оборудования.
Проанализируем типовой стек вызовов Библиотеки подключаемого оборудования (БПО). Сбой происходит в клиентском модуле при обращении к внешнему COM-объекту драйвера ТСД. Ошибка локализуется в процедуре начала обмена данными:
// Модуль: ОбщийМодуль.ПодключаемоеОборудованиеШтрихМТерминалыСбораДанныхКлиент
Процедура НачатьЗагрузку(ОбъектДрайвера, Параметры, ПараметрыПодключения, Количество, ВыходныеПараметры) Экспорт
// Перевод терминала в режим формирования пакета данных
ОбъектДрайвера.НачалоОтчета;
// На этой строке выполнение блокируется: внешняя компонента ожидает ответа от порта
// и не возвращает управление в платформу 1С:Предприятие
КонецПроцедуры
Вызов метода НачалоОтчета переводит компоненту драйвера в режим синхронного ожидания подтверждающего сигнала от ТСД через виртуальный COM-порт. Если на уровне драйвера включен некорректный механизм межпроцессного или сетевого обмена, либо параметры последовательного порта не согласованы с протоколом прошивки ТСД, драйвер уходит в бесконечный цикл ожидания данных (Deadlock), блокируя основной поток клиента 1С.
Наиболее частая причина зависания метода ОбъектДрайвера.НачалоОтчета в версиях драйвера «Штрих-М: Драйвер ТСД» (например, 3.6.x) — попытка драйвера использовать вспомогательную сетевую динамическую библиотеку NetU.dll для маршрутизации пакетов.
Выполним корректировку параметров драйвера по следующим шагам:
Если отключение NetU.dll не решило проблему целиком или драйвер продолжает периодически терять связь с устройством, проанализируем настройки COM-порта подставки (кредла) или кабеля ТСД в диспетчере устройств операционной системы.
RTS/CTS или отсутствует None). Значение должно строго совпадать с настройками, заданными в прошивке самого терминала.В операционной системе Windows 7 активны агрессивные схемы энергосбережения, которые могут временно обесточивать кредл ТСД при смене фаз обмена данными:
Платформа «1С:Предприятие» в подавляющем большинстве клиентских рабочих мест запускается как 32-битный процесс. В 64-разрядной среде Windows 7 регистрация библиотек драйвера должна осуществляться через специализированный системный интерпретатор.
Выполним перерегистрацию библиотеки драйвера в командной строке (CMD), запущенной от имени Администратора:
C:\Windows\SysWOW64\regsvr32.exe "C:\Program Files (x86)\ShtrihM\DrvTSD\DrvTSD.dll"
После выполнения команды должно появиться системное сообщение об успешном завершении вызова DllRegisterServer.
В базовых версиях конфигураций (например, «1С:Розница Базовая» или «1С:Управление торговлей Базовая») прямое редактирование модулей конфигуратора заблокировано. В такой ситуации скорректировать программный код вызова ОбъектДрайвера.НачалоОтчета невозможно.
В этом случае рекомендуются следующие архитектурные решения:
Новый COMОбъект("AddIn.Terminals") с собственными безопасными таймаутами и алгоритмами разбора данных.