Как подключить сканер штрихкода к порту выше COM32 в 1С на обычных формах?

Программист 1С v8.3 (Обычные формы) Управленческий учет Торговля и дистрибуция
← На главную

При работе в терминальных сессиях (RDP) системные администраторы и разработчики часто сталкиваются с ситуацией, когда количество виртуальных COM-портов превышает стандартные лимиты. В старых конфигурациях 1С, таких как «Управление торговым предприятием» (УТП) или «Управление производственным предприятием» (УПП), работающих на обычных формах, штатные драйверы часто ограничены выбором порта до COM32. Попытка вручную расширить этот список в обработке обслуживания обычно приводит к ошибке: "Ошибка при подключении устройства. Необходимо убедиться, что устройство правильно настроено". Рассмотрим подробно, почему это происходит и как решить данную проблему несколькими способами.

Разберем причину ограничения

Основная причина кроется не в самой платформе 1С, а в архитектуре используемого драйвера. Старая внешняя компонента ScanOPOS.dll (версии 8.x и ниже), работающая по технологии COM-объекта, имеет внутреннее жесткое ограничение в программном коде. Разработчики драйвера на тот момент заложили проверку диапазона портов, и если передаваемое значение превышает 32, метод инициализации возвращает отказ. Именно поэтому «Тест устройства» в настройках 1С может показывать корректные данные (так как он может использовать другие механизмы опроса), а реальная форма документа выдает ошибку при попытке захвата порта драйвером.

Способ 1. Переход на современный драйвер NativeApi (версии 9.x и выше)

Наиболее правильный и стабильный метод — отказаться от использования устаревшего COM-драйвера в пользу технологии NativeApi. Начиная с версии 9.0, драйвер 1С «Сканер штрихкода» поддерживает до 255 COM-портов. Однако сложность заключается в том, что старые конфигурации на обычных формах «не умеют» напрямую общаться с Native-компонентами через старые обработки обслуживания.

Для реализации этого метода проанализируем необходимые шаги:

  1. Обновление компоненты: Необходимо установить актуальную версию драйвера «1С:Сканер штрихкода» (например, 9.0.12.x или выше). Это обеспечит наличие нужных библиотек в системе.
  2. Замена обработки обслуживания: Стандартная 1CScanOPOSScan_v2.epf не подойдет. Нужно найти или адаптировать обработку 1CScanOPOSScan_v3.epf, которая была выпущена позже специально для поддержки новых стандартов работы с оборудованием.
  3. Модификация кода: Если готовой обработки нет, нам придется переписать процедуру подключения устройства. Вместо прямого создания объекта через AddIn.Scanner, используется другой механизм инициализации.

Рассмотрим пример того, как меняется логика инициализации в коде 1С:


// Старый метод (COM), ограниченный 32 портами:
Попытка
    ЗагрузитьВнешнююКомпоненту("ScanOPOS.dll");
    ОбъектДрайвера = Новый("AddIn.Scanner");
Исключение
    Сообщить("Ошибка загрузки драйвера");
КонецПопытки;

// Новый метод (NativeApi), поддерживающий до COM255:
Попытка
    УстановитьВнешнююКомпоненту("ОбщийМакет.Драйвер1ССканерШтрихкода"); // Если загружаем из макета
    ПодключитьВнешнююКомпоненту("AddIn.1C.Scanner");
    ОбъектДрайвера = Новый("AddIn.1C.Scanner");
Исключение
    Сообщить("Не удалось подключить Native-компоненту");
КонецПопытки;

Способ 2. Принудительное переназначение номера порта в ОС

Если вмешательство в программный код 1С невозможно или крайне нежелательно, мы можем пойти путем обмана драйвера на уровне операционной системы. Даже если RDP-сессия назначила сканеру COM62, мы можем переназначить его на свободный номер в диапазоне 1–31.

Выполним следующие шаги по шагам:

  1. Откройте Диспетчер устройств на сервере, где запущена 1С.
  2. Найдите ваш порт в разделе «Порты (COM и LPT)».
  3. Перейдите в Свойства порта -> Параметры порта -> Дополнительно.
  4. В поле «Номер COM-порта» выберите свободный номер, например, COM5.
  5. Система может предупредить, что порт «используется», — в большинстве случаев это можно проигнорировать, если вы уверены, что физически под этим номером ничего не подключено.

После этого в настройках торгового оборудования 1С укажите COM5, и старый драйвер успешно инициализирует устройство, так как значение 5 входит в его допустимый диапазон.

Способ 3. Оптимизация работы RDP-портов через реестр

Проблема «высоких» номеров портов часто возникает из-за того, что сервер терминалов не очищает таблицу занятых портов или динамически инкрементирует их для каждой новой сессии. Мы можем проанализировать настройки реестра, чтобы ограничить этот рост.

Рассмотрим путь в реестре Windows Server:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd

Здесь можно управлять параметрами проброса устройств. Однако более эффективным будет использование команды NET USE для связки портов. Вы можете создать скрипт при входе пользователя в систему, который будет «маппить» высокий порт на низкий:


// Пример команды для командной строки (bat-файл)
net use com2: \\tsclient\com62

Это создаст виртуальную связь, и 1С сможет работать с COM2, передавая команды на реальный COM62.

Способ 4. Перевод сканера в режим эмуляции клавиатуры

Если специфика бизнес-процесса позволяет, мы рекомендуем рассмотреть самый простой и надежный способ — перевести сканер из режима COM-эмуляции в режим Keyboard Emulation. В этом случае номер порта перестает иметь значение, так как данные будут поступать в активное поле ввода (или перехватываться драйвером клавиатуры).

Преимущества этого подхода:

Для реализации этого метода необходимо отсканировать специальный управляющий штрихкод из инструкции к вашему сканеру (обычно называется USB Keyboard Mode или HID Mode).

Выясним причину ошибки "Порт занят"

Иногда даже после настройки порта выше 32 пользователь получает ошибку о том, что порт занят. Проанализируем, почему это происходит. В старых конфигурациях 1С при открытии каждой формы (например, формы подбора товара и формы чека ККМ одновременно) каждая форма пытается создать свой экземпляр драйвера и подключиться к одному и тому же порту.

Для решения этой ситуации убедитесь, что:

  1. В настройках оборудования стоит флажок «Устройство включено» только в одном месте.
  2. Используется глобальный обработчик оповещений, который не блокирует порт монопольно для одной формы.
  3. Версия драйвера поддерживает многопоточное обращение (что опять же возвращает нас к необходимости использования NativeApi).

Подводя итог, можно сказать, что наиболее перспективным решением является обновление программного слоя (драйвера и обработки обслуживания). Если же бюджет времени на разработку ограничен, использование Symbolic Links через net use или ручное переназначение номеров портов в диспетчере устройств станут отличным временным решением, позволяющим обойти ограничение ScanOPOS.

← На главную