Как настроить одновременную работу двух ККТ Штрих-М на одном компьютере в 1С:Управление торговлей 10.3?

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

При автоматизации рабочего места кассира в 1С:Управление торговлей 10.3 нередко возникает необходимость подключить к одному системному блоку два кассовых аппарата (например, для разделения продаж по разным организациям или системам налогообложения). Однако при подключении двух аппаратов Штрих-М через последовательные интерфейсы (COM1 и COM2) пользователи сталкиваются с тем, что тест драйвера видит оба устройства, но внутри 1С все фискальные операции и опрос параметров (даже при явном выборе первой кассы) направляются исключительно на порт второй кассы.

Разберем подробнее, почему возникает такое поведение, как устроено взаимодействие конфигурации с драйвером и какие варианты решения позволяют настроить стабильную работу обоих аппаратов.

Выясним причину монопольного захвата устройства

Проанализируем архитектуру работы драйвера производителя и типовых механизмов торгового оборудования в 1С:

  1. Концепция активного логического устройства (ЛУ): В драйвере «Штрих-М» все свойства и методы применяются только к так называемому активному устройству. Если в коде перед выполнением команды явно не задан номер активного логического устройства или не изменены параметры подключения текущего объекта, драйвер продолжает выполнять запросы на тот порт, который был открыт первым либо запомнен последним.
  2. Кэширование COM-объекта в сеансе 1С: В типовой архитектуре торгового оборудования УТ 10.3 COM-объект драйвера обычно создается один раз при старте или первом обращении к кассе и сохраняется в контексте сеанса (в глобальной структуре или модуле). При обращении ко второму фискальнику 1С использует тот же экземпляр объекта драйвера, не выполняя корректный сброс параметров связи и переподключение.
  3. Особенности COM-портов: В отличие от сетевого взаимодействия, последовательный COM-порт может быть монопольно занят только одним активным соединением. Если драйвер не закрыл дескриптор соединения на COM2, переключение на COM1 в рамках того же объекта завершается неудачей или просто игнорируется.

Способ 1. Принудительное подключение и отключение перед каждой операцией

Наиболее надежный программный способ для конфигураций на обычных формах — отказаться от постоянного удержания открытого COM-порта. Разберем логику доработки обработки обслуживания кассового аппарата:

  1. Перед отправкой любой команды на ККТ (печать чека, снятие Z-отчета, X-отчета, чтение параметров фискализации) открываем соединение именно с теми параметрами порта и скорости, которые соответствуют целевой кассе.
  2. Выполняем необходимую фискальную операцию.
  3. Сразу после завершения операции (или при возникновении исключения) гарантированно вызываем метод закрытия порта (Disconnect / Отключить), освобождая COM-порт и сбрасывая состояние драйвера.

Посмотрим на пример организации вызова фискальной операции с гарантированным разрывом соединения:


Функция ВыполнитьКомандуККТ(ОбъектДрайвера, ПараметрыПодключения, ИмяМетода)
    
    // 1. Устанавливаем параметры связи для конкретного аппарата
    ОбъектДрайвера.ComNumber = ПараметрыПодключения.НомерCOM;
    ОбъектДрайвера.BaudRate  = ПараметрыПодключения.Скорость;
    ОбъектДрайвера.Timeout   = 1000;
    
    // 2. Открываем соединение
    Если ОбъектДрайвера.Connect() <> 0 Тогда
        Сообщить("Ошибка подключения к ККТ: " + ОбъектДрайвера.ResultCodeDescription);
        Возврат Ложь;
    КонецЕсли;
    
    Попытка
        // 3. Выполняем требуемое действие
        Результат = ВыполнитьДействиеККТ(ОбъектДрайвера, ИмяМетода);
    Исключение
        // Гарантированно отключаемся при ошибке
        ОбъектДрайвера.Disconnect();
        ВызватьИсключение;
    КонецПопытки;
    
    // 4. Обязательно освобождаем порт после завершения
    ОбъектДрайвера.Disconnect();
    
    Возврат Результат;

КонецФункции

Способ 2. Управление активным логическим устройством

Если в коде используется драйвер «Штрих-М» через создание таблицы логических устройств, разберем по шагам альтернативную настройку:

  1. В утилите «Тест драйвера ККТ» создаем два логических устройства: например, ЛУ 1 (настроенное на COM1) и ЛУ 2 (настроенное на COM2). Сохраняем конфигурацию драйвера.
  2. В обработке обслуживания перед вызовом фискальных команд выполняем переключение активного устройства, обращаясь к соответствующему свойству драйвера (DeviceNumber / LogicalNumber).

Посмотрим на пример переключения контекста кассы:


// Устанавливаем номер активного логического устройства драйвера
ОбъектДрайвера.DeviceNumber = НомерЛогическогоУстройства; // 1 или 2
ОбъектДрайвера.SetActiveDevice();

Если ОбъектДрайвера.ResultCode <> 0 Тогда
    Сообщить("Не удалось переключить активное устройство: " + ОбъектДрайвера.ResultCodeDescription);
КонецЕсли;

Способ 3. Локальное создание COM-объекта драйвера

Если типовой механизм торгового оборудования хранит глобальную ссылку на объект драйвера и не позволяет корректно переключать свойства, рекомендуется изменить логику инициализации:

  1. Вместо сохранения экземпляра объекта в глобальной переменной модуля создаем объект Новый COMОбъект("AddIn.DRVFR") (или актуальный COM-класс драйвера) непосредственно внутри функции выполнения операции.
  2. После выполнения операции и вызова Disconnect() переменной с COM-объектом присваиваем Неопределено, что инициирует корректное уничтожение объекта в памяти и освобождение ресурсов операционной системы.

Альтернативные варианты разделения касс

Если программная доработка конфигурации нежелательна или ограничена регламентом, рассмотрим организационные и аппаратные альтернативы:

  1. Запуск двух параллельных сеансов 1С: На компьютере открываются два окна «1С:Предприятие» под разными учетными записями пользователей. В справочнике «Торговое оборудование» первому рабочему месту настраивается только первая касса, а второму — только вторая. В этом случае каждый процесс 1С работает со своим изолированным COM-объектом.
  2. Перевод ККТ на сетевой протокол (TCP/IP / Ethernet / RNDIS): Подключение касс по локальной сети с назначением уникальных IP-адресов и портов полностью устраняет проблему блокировки физических COM-портов операционной системы.
← На главную