Почему 1С:Управление торговлей 11 не освобождает порт ККТ и как решить эту проблему?

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

При работе в программе 1С:Управление торговлей (начиная с версий 11.4) многие системные администраторы и специалисты по автоматизации сталкиваются с неприятной особенностью: после пробития чека в рабочем месте кассира (РМК) программа намертво блокирует порт подключения ККТ (будь то виртуальный COM-порт или TCP-сокет). В результате этого становится невозможно открыть «Тест драйвера» для проведения сервисных операций, проверки таблиц или снятия отчетов, пока сессия 1С не будет полностью закрыта. Давайте детально проанализируем причины этой проблемы и подробно разберем все способы ее решения.

Выясняем причины монопольного захвата порта в 1С

Для того чтобы понять, почему 1С ведет себя подобным образом, рассмотрим архитектурную логику работы современной Библиотеки подключаемого оборудования (БПО), встроенной в конфигурации на управляемых формах.

В старых версиях программ (например, в УТ 10.3 или «Торговля и Склад» 7.7) подключение к оборудованию происходило непосредственно в момент выполнения операции — при нажатии кнопки «Пробить чек». После завершения печати устройство сразу же программно отключалось. В новых версиях 1С:Управление торговлей 11 разработчики кардинально изменили этот подход.

При первом обращении к кассе (например, при открытии формы РМК или первом чеке) БПО инициализирует драйвер, открывает порт связи с ККТ и кэширует объект драйвера в глобальном модуле или параметрах сеанса пользователя. Соединение сознательно удерживается активным на протяжении всей работы пользователя в системе. Это сделано ради оптимизации быстродействия: постоянное открытие и закрытие порта (особенно при сетевом подключении по протоколу TCP/IP или через эмуляцию RNDIS) вызывает ощутимые задержки (иногда до 3–5 секунд) перед отправкой каждого чека на печать, что крайне критично для кассиров в часы пиковых нагрузок.

Дополнительная сложность возникает при использовании протокола TCP Socket. Если в процессе обмена данными между 1С, драйвером «Штрих-М» (например, версий семейства 4.14) и самой кассой происходит микросбой, сетевой сокет переходит в зависшее состояние (статусы CLOSE_WAIT или ESTABLISHED на уровне операционной системы). В этом случае ККТ считает соединение активным, а операционная система продолжает блокировать порт процессами 1С. Освободить его удается только полной перезагрузкой компьютера или службы кассы.

Давайте подробно рассмотрим четыре практических метода борьбы с этой проблемой, начиная с оригинального аппаратного решения и заканчивая тонкой программной настройкой.

Способ 1. Аппаратное разделение интерфейсов (двухкабельное подключение)

Этот оригинальный и весьма изящный способ предложил автор темы на форуме. Современные фискальные регистраторы марки «Штрих-М» обладают уникальной особенностью — они способны аппаратно поддерживать одновременную работу по нескольким физическим интерфейсам. Мы можем разграничить доступ для разных программ, подключив кассу к компьютеру сразу двумя кабелями.

Проанализируем шаги для реализации этой схемы:

  1. Подключите ККТ к системному блоку компьютера одновременно по двум интерфейсам. Например, один кабель подключается к СОМ-порту материнской платы (или через переходник USB-to-COM), а второй кабель — стандартным USB-кабелем (настраивается эмуляция сетевой карты RNDIS для работы по TCP-сокету).
  2. В настройках подключения торгового оборудования внутри 1С:Управление торговлей укажите локальный СОМ-порт (например, COM3). Программа 1С будет монопольно владеть этим портом для пробития чеков, и это никак не помешает другим процессам.
  3. В системной утилите «Тест драйвера Штрих-М» настройте подключение по сетевому протоколу TCP сокет, указав IP-адрес кассы (например, 192.168.137.111) и соответствующий порт.

В результате такого разделения 1С работает через свой выделенный канал связи (COM), а сервисные утилиты и механизмы отправки чеков в ОФД обращаются к кассе по сетевому каналу (TCP), не мешая друг другу. Порт в 1С остается занят, но это больше не блокирует администрирование устройства.

Способ 2. Настройка локального сервера оборудования

Если физически подключить кассу двумя кабелями невозможно (например, на кассовом узле ограниченное количество свободных портов или ККТ установлена удаленно), рекомендуется использовать промежуточное программное обеспечение, которое выступает в роли мультиплексора соединений.

Рассмотрим по шагам настройку схемы с использованием специализированного ПО:

  1. Сервер ФР (утилита от «Штрих-М»): Установите данную службу на компьютере, к которому подключена касса. Служба монопольно занимает физический порт ККТ. Все внешние программы (и 1С, и локальный «Тест драйвера») настраиваются на подключение не к конкретному COM/TCP-порту кассы, а к локальному IP-адресу службы Сервера ФР. Служба сама распределяет входящие запросы в режиме очереди, мгновенно обрабатывая команды от разных источников без конфликта за порт.
  2. Стороннее решение (например, утилита kkmserver): Эта программа работает как локальный веб-сервер. Она подключается к физическому порту кассы, а в 1С настраивается интеграция через HTTP-запросы. Поскольку обмен идет по протоколу HTTP, монопольного удержания сокета со стороны 1С не происходит — порт освобождается сразу после отправки короткого пакета данных.

Способ 3. Тонкая настройка драйвера и параметров БПО в 1С

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

Разберем, на что необходимо обратить внимание при настройке конфигурации:

  1. Проверка флага временного отключения в 1С: Перейдите в раздел «Администрирование» — «Подключаемое оборудование». Откройте карточку настройки вашей ККТ. В зависимости от версии БПО, в параметрах подключения может присутствовать опция «Освобождать порт» или «Автоматически отключать при бездействии». Активируйте данный флаг. Это заставит 1С принудительно вызывать метод деинициализации драйвера после завершения печати документа.
  2. Обновление версии драйвера: Версии драйверов линейки 4.14 имеют известные проблемы с корректной обработкой асинхронных вызовов, которые активно внедряются в конфигурациях 1С начиная с платформы 8.3. Рекомендуется полностью удалить старый драйвер и установить стабильный релиз из ветки 5.17 (или новее), обновив при этом внешнюю компоненту интеграции в самой базе 1С.

Способ 4. Программное управление сессией через расширение 1С

Для разработчиков и системных администраторов, имеющих навыки конфигурирования, самым надежным решением будет создание небольшого расширения, которое будет принудительно давать команду драйверу освободить порт сразу после того, как чек ККМ будет закрыт на экране или успешно фискализирован.

Рассмотрим пример кода, который можно внедрить в обработчик закрытия формы чека ККМ или в процедуру завершения печати чека в общем модуле РМК:


&НаКлиенте
Процедура ПринудительноОсвободитьПортККТ(ИдентификаторУстройства) Экспорт
    
    // Проверяем, подключено ли устройство в данный момент
    Если ПодключаемоеОборудованиеКлиент.УстройствоПодключено(ИдентификаторУстройства) Тогда
        
        // Формируем описание оповещения для асинхронного отключения
        ПараметрыОтключения = Новый ОписаниеОповещения("ПослеОтключенияУстройства", ЭтотОбъект);
        
        // Вызываем метод БПО для принудительного освобождения занятого порта
        ПодключаемоеОборудованиеКлиент.ОтключитьУстройствоАсинх(ПараметрыОтключения, ИдентификаторУстройства);
        
    КонецЕсли;
    
КонецПроцедуры

&НаКлиенте
Процедура ПослеОтключенияУстройства(РезультатВыполнения, ДополнительныеПараметры) Экспорт
    // Порт успешно освобожден. Теперь касса доступна для сторонних утилит.
КонецПроцедуры

Использование метода ОтключитьУстройствоАсинх гарантирует, что 1С вызовет деструктор объекта драйвера ККТ и операционная система закроет все удерживаемые сетевые сокеты и виртуальные COM-порты.

Дополнительная рекомендация: Энергосбережение USB-портов

Если ваша касса подключена по USB-кабелю в режиме RNDIS (TCP-сокет), обязательно проверьте настройки электропитания операционной системы Windows. По умолчанию в системе включена функция временного отключения USB-портов для экономии энергии. При простое кассы Windows приостанавливает работу порта, сессия драйвера в 1С аварийно обрывается, но порт при этом остается программно заблокированным.

Для исправления этого перейдите в «Панель управления» — «Электропитание» — «Настройка схемы электропитания» — «Изменить дополнительные параметры питания». Найдите в списке «Параметры USB» и установите значение параметра «Временное отключение USB-порта» в положение «Запрещено». Это предотвратит внезапные разрывы связи и зависание сетевых сокетов ККТ.

← На главную