Почему 1С занимает COM-порт ККТ и выдает ошибку при работе в нескольких сеансах?

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

Многие пользователи и разработчики, работающие с конфигурациями на базе 1С:Управление торговлей 10.3, сталкиваются с неприятной ошибкой: при попытке печати чека из второго сеанса 1С или при параллельной работе двух баз система выдает сообщение «Порт занят». Давайте разберем, почему это происходит и как устранить данную проблему, обеспечив стабильную работу торгового оборудования.

Анализ причин конфликта портов

Основная причина заключается в несовпадении архитектурных подходов. Старые механизмы ТорговоеОборудование в 1С 8.2/8.3 (особенно в УТ 10.3) проектировались во времена, когда драйверы касс работали иначе. Современные драйверы Атол (ДТО 10 и выше) при инициализации через COM-порт требуют монопольного доступа к ресурсу.

В чем заключается технический конфликт:

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

Методы решения проблемы

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

Способ 1: Использование «АТОЛ: Сервер ККТ»

Это самое надежное и рекомендуемое производителем решение. Вместо прямой работы с COM-портом 1С подключается к локальному или сетевому веб-серверу (службе), который распределяет запросы от нескольких приложений.

Преимущества решения:

Способ 2: Оптимизация логики подключения в коде 1С

Если внедрение сервера ККТ по каким-то причинам невозможно, необходимо переработать код обработки обслуживания. Нам нужно добиться того, чтобы порт освобождался сразу после выполнения операции печати.

Разберем типичный алгоритм правильной работы с драйвером:

Вместо удержания оборудования активным, нам следует реализовать принцип: «Подключил — Напечатал — Отключил».


// Пример логики для реализации в модуле обработки
Процедура ПечатьЧека()
    // 1. Инициализация и подключение
    ПодключитьОборудование();
    
    // 2. Выполнение операции
    Драйвер.ПечатьЧека();
    
    // 3. Явное освобождение ресурса
    ОтключитьОборудование();
КонецПроцедуры

Важно обратить внимание на то, что объект драйвера Драйвер, хранящийся в экспортных переменных модуля приложения, должен быть очищен или принудительно освобожден. В ДТО 10 используйте метод Release для явного освобождения интерфейса компоненты.

Практические рекомендации по настройке

Проанализируем шаги, которые необходимо предпринять системному администратору или программисту для стабилизации системы:

  1. Проверка драйвера: Убедитесь, что версия ДТО (драйверов торгового оборудования) одинакова для всех баз и сеансов на данном компьютере. Несоответствие версий библиотек (например, если одна база использует ДТО 8, а другая ДТО 10) часто приводит к «зависанию» порта в одном из состояний.
  2. Очистка объектов: Если вы дорабатываете обработку обслуживания, добавьте вызов метода ОтключитьКлиента в обработчик события формы ПриЗакрытии. Это гарантирует, что при закрытии формы ПКО порт будет принудительно освобожден.
  3. Настройка TCP/IP: Если ККТ поддерживает подключение через Ethernet, всегда переходите на этот протокол вместо эмуляции COM-порта (USB). Сетевое подключение через IP-адрес позволяет обращаться к одной кассе из нескольких мест без физических конфликтов драйверов.
  4. Отладка: Если ошибка сохраняется, пройдитесь отладчиком по цепочке вызовов методов ПолучитьСерверТО().ОтключитьКлиента(ЭтаФорма). Проверьте, не блокируется ли выполнение этого кода какими-либо исключениями или условиями, из-за которых процедура отключения просто не вызывается.

Помните, что архитектура УТ 10.3 требует внимательного обращения к ресурсам. Если вы видите, что переменная Драйвер остается заполненной после закрытия всех документов, значит, где-то в коде происходит утечка соединения, которую необходимо устранить явным вызовом методов очистки.

← На главную