При обновлении технологической платформы 1С:Предприятие или переходе на работу через терминальный сервер (RDP) пользователи конфигураций на обычных формах (например, 1С:Управление торговлей 10.3) нередко сталкиваются со сбоем инициализации торгового оборудования. В момент открытия документов или форм подбора система аварийно завершает операцию со следующим диагностическим сообщением:
{ВнешняяОбработка.СканерШтрихкода.МодульОбъекта(268)}: Ошибка при вызове метода контекста (Занять): Если Объект.Драйвер.Занять(1) = 0 Тогда
по причине: Ошибка вызова метода внешней компоненты
Посмотрим на практический симптом: если сеанс 1С запускается под учетной записью локального администратора Windows, торговое оборудование работает корректно, однако у обычных пользователей терминала операция всегда завершается сбоем. Разберем по шагам причины такого поведения драйвера ScanOPOS и рассмотрим эффективные варианты устранения неполадки.
Метод Занять(1) внешней компоненты драйвера сканера штрихкода предназначен для монопольного захвата сконфигурированного порта ввода-вывода (как правило, виртуального COM-порта). В терминальной среде RDP падение вызова метода контекста обусловлено несколькими факторами:
HKEY_LOCAL_MACHINE. У непривилегированных учетных записей операционная система блокирует доступ к этим веткам на запись, что вызывает критическое исключение при обращении к компоненте.Разберем основной вариант решения проблемы, когда под администратором сканер функционирует, а под рядовым пользователем падает. Нам необходимо предоставить группе терминальных пользователей права на ветки реестра, с которыми работает драйвер торгового оборудования.
regedit.HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\1C\TradeWare
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\OLEforRetail
HKEY_LOCAL_MACHINE\SOFTWARE\1C\TradeWare
HKEY_LOCAL_MACHINE\SOFTWARE\OLEforRetailЕсли обновление платформы затронуло системные библиотеки или права на них, выполним корректную перерегистрацию библиотеки ScanOpos.dll в операционной системе.
ScanOpos.dll в каталоге установки драйвера (по умолчанию C:\Program Files (x86)\1C\1Cv8...\bin или в каталоге шаблонов торгового оборудования).regsvr32:
regsvr32 "C:\ПутьКФайлу\ScanOpos.dll"Проанализируем ярлык запуска базы 1С:Предприятие. Для работы со старыми драйверами ScanOPOS толстый клиент должен запускаться строго в 32-разрядном режиме. Проверим путь к исполняемому файлу: он должен располагаться в каталоге C:\Program Files (x86)\1cv8\..., а не в C:\Program Files\1cv8\.... При запуске 64-битного клиента внешние COM-компоненты торгового оборудования 1С не смогут корректно подключиться к процессу.
Когда с одним сервером одновременно работают несколько пользователей, вызов метода захвата порта падает при попытке занять несуществующий или чужой COM-порт. Разберем шаги проверки:
change port /queryЧтобы ошибка захвата порта не блокировала работу пользователей, которым в данный момент не требуется сканирование, доработаем модуль внешней обработки 1CScanOPOSScan_v2.epf. Защитим проблемный участок кода конструкцией безопасного выполнения:
Попытка
Если Объект.Драйвер.Занять(1) = 0 Тогда
// Обработка ситуации, когда порт не удалось захватить штатно
Возврат Неопределено;
КонецЕсли;
Исключение
// Предотвращаем аварийное завершение работы программы
ЗаписьЖурналаРегистрации("Подключение торгового оборудования",
УровеньЖурналаРегистрации.Предупреждение,,,
"Не удалось занять порт сканера: " + ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;
Такой подход позволит пользователям без подключенного сканера беспрепятственно открывать документы и журналы программы.
Если эксплуатация устаревшей COM-компоненты ScanOPOS на новых версиях платформы продолжает вызывать сбои, рассмотрим более современные альтернативы:
Занять().