При работе с торговым оборудованием в 1С, в частности со сканерами штрихкодов (например, CipherLab 1070), специалисты часто сталкиваются с критической остановкой системы. Ошибка вида {ВнешняяОбработка.СканерШтрихкода.МодульОбъекта(268)}: Ошибка при вызове метода контекста (Занять) сигнализирует о том, что программная компонента не может получить монопольный доступ к порту, к которому подключено устройство. Разберем подробно, почему это происходит и как устранить проблему на разных уровнях: от программного кода до настроек операционной системы.
Метод Занять(1) используется драйвером (часто это ScanOPOS.dll) для активации порта и начала прослушивания сигналов от сканера. Если метод возвращает 0 или генерирует исключение, это означает, что порт уже используется другим процессом, недоступен физически или драйвер настроен некорректно. Рассмотрим основные сценарии возникновения этой ситуации:
Проанализируем ситуацию, когда ошибка блокирует работу всей программы (например, нельзя зайти в номенклатуру без подключенного сканера). В этом случае наиболее эффективным «быстрым» решением будет модификация кода обработки обслуживания 1CScanOPOSScan_v2.epf (или аналогичной). Мы обернем вызов метода в защитный блок Попытка ... Исключение.
Найдем в модуле объекта функцию Подключить(Объект) и внесем изменения в логику захвата устройства:
Попытка
// Пытаемся занять порт драйвером
Если Объект.Драйвер.Занять(1) = 0 Тогда
// Если захват успешен, настраиваем параметры устройства
Объект.Драйвер.УстройствоВключено = 1;
Объект.Драйвер.ПосылкаДанных = 1;
Объект.Драйвер.ОчиститьВход();
Объект.Драйвер.ОчиститьВыход();
Если Объект.Драйвер.УстройствоВключено <> 1 Тогда
Отключить(Объект);
Результат = мОшибкаПриПодключении;
КонецЕсли;
Иначе
// Порт занят другим приложением
Отключить(Объект);
Результат = мОшибкаПриПодключении;
КонецЕсли;
Исключение
// Обработка критической ошибки вызова метода внешней компоненты
Отключить(Объект);
Результат = мОшибкаПриПодключении;
КонецПопытки;
Такой подход позволит программе продолжить работу, даже если сканер физически отключен или порт недоступен. Пользователь увидит предупреждение, но форма (например, «Чек ККМ») откроется успешно.
Сканеры CipherLab часто работают через USB, но для 1С требуется режим эмуляции COM-порта. Разберем по шагам системную настройку:
Занять.ScanOPOS могут работать нестабильно. Рекомендуем вручную изменить номер порта на свободный в диапазоне от 1 до 9 в настройках порта (Дополнительно).Если 1С запущена на сервере через терминальный клиент, а сканер подключен к локальному ПК, проанализируем настройки проброса портов. Ошибка часто возникает, когда:
Посмотрим на пример из практики: если один пользователь уже занял порт в своей сессии, второй при попытке открыть торговую форму получит отказ доступа к методу Занять. В таких случаях стоит проверить константы 1С, отвечающие за использование торгового оборудования, и убедиться, что настройки привязаны к конкретному рабочему месту (компьютеру), а не к пользователю.
Иногда метод Занять не отрабатывает из-за проблем с регистрацией библиотеки ScanOPOS.dll в реестре Windows. Проделаем следующие действия:
regsvr32 "C:\ПутьКФайлу\ScanOPOS.dll".Native API.Если работа через COM-порт вызывает неустранимые конфликты (например, в сложной топологии терминального сервера), рассмотрим переход на режим эмуляции клавиатуры (HID). В настройках торгового оборудования 1С в поле «Порт» выберем значение «Клавиатура». В этом режиме метод Занять не требуется, так как данные поступают в поле ввода напрямую, как если бы они были набраны пользователем. Однако помните, что при таком подходе фоновое сканирование (без фокуса на поле ввода) работать не будет.
Мы проанализировали основные причины сбоя. В большинстве случаев для исправления ошибки достаточно физически проверить подключение и убедиться, что никакая другая программа (или другая сессия 1С) не держит порт открытым. Если сканер используется периодически, обязательно внедрите обработку исключения в коде (Решение 1), чтобы отсутствие устройства не парализовало работу всей учетной системы.