Как использовать одну ККТ на нескольких рабочих местах в 1С:УТ 11 и избежать ошибки «Порт занят»?

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

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

В этой статье мы подробно проанализируем, почему возникает эта проблема, чем логика работы с торговым оборудованием в 1С:УТ 11 отличается от 1С:Розницы, и разберем по шагам все возможные способы программного и аппаратного решения этой задачи без лишних затрат.

---

Почему возникает ошибка «Порт занят» в 1С:УТ 11?

Для начала выясним причину проблемы на уровне архитектуры платформы и конфигурации. Драйвер ККТ (например, АТОЛ или Штрих-М) при обращении к кассе через локальный COM-порт или USB-эмуляцию монопольно захватывает этот порт в операционной системе. Пока порт удерживается одним сеансом, ни одна другая программа или другой сеанс 1С не могут получить доступ к устройству.

Если в конфигурации 1С:Розница 2.2 подключение к оборудованию происходит динамически (непосредственно в момент пробития чека) и порт сразу же освобождается, то в 1С:Управление торговлей 11 реализована совершенно иная логика:

  1. При открытии формы Рабочего места кассира (РМК) или журнала документов «Чеки ККМ» система выполняет инициализацию и постоянное подключение торгового оборудования.
  2. Программа удерживает порт активным в течение всего времени, пока кассир находится в интерфейсе РМК.
  3. Второй кассир при попытке зайти в РМК или открыть чек получает закономерный отказ, так как порт ККТ уже монополизирован первым рабочим местом.

Давайте рассмотрим подробнее проверенные способы обхода этого ограничения — от штатных настроек драйвера до написания собственного расширения конфигурации.

---

Способ 1. Использование встроенного Web-сервера АТОЛ (ДТО 10)

Если вы используете современное оборудование АТОЛ и драйвер версии 10 (ДТО 10), это самый простой, надежный и полностью бесплатный способ решения проблемы, не требующий изменения кода 1С.

Разберем этот процесс по шагам:

  1. На основном компьютере, к которому ККТ подключена физически через USB-кабель, запустите службу Web-сервер АТОЛ (она входит в стандартный пакет установки ДТО 10). По умолчанию веб-сервер начинает прослушивать порт 16732.
  2. Перейдите в локальный интерфейс управления веб-сервером через браузер (обычно доступен по адресу http://localhost:16732) и убедитесь, что касса успешно определилась в системе.
  3. На втором (удаленном) рабочем месте в локальной сети откройте 1С:УТ 11, перейдите в меню Администрирование — Подключаемое оборудование.
  4. При настройке ККТ укажите способ подключения не через локальный COM-порт, а выберите тип соединения «Сеть» (TCP/IP или Web-сервер).
  5. В поле адреса укажите IP-адрес основного компьютера (например, 192.168.1.100) и порт 16732.

Результат: Драйвер АТОЛ сам берет на себя задачу управления очередью печати. Когда один кассир пробивает чек, веб-сервер принимает запрос, временно обрабатывает его и передает на фискальный накопитель, исключая конфликт блокировки портов на уровне операционной системы.

---

Способ 2. Программное отключение ККТ после печати (Доработка через Расширение)

Если использование сетевого веб-сервера драйвера невозможно (например, используются старые кассы или специфические драйверы), мы можем изменить логику работы самой 1С:УТ 11 с помощью механизма расширений.

Наша задача — заставить программу подключаться к кассе только на миллисекунды пробития чека и мгновенно отключаться от нее сразу после завершения печати. Проанализируем, какие модули за это отвечают.

В типовой БПО (Библиотеке подключаемого оборудования), интегрированной в УТ 11, за подключение устройств отвечает общий модуль МенеджерОборудованияКлиент. Нам необходимо перехватить логику открытия интерфейса РМК и отправки чека.

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


&Вместо("ПодключитьОборудованиеСеанса")
Процедура Мой_ПодключитьОборудованиеСеанса()
    // Блокируем стандартное постоянное подключение при открытии формы
    // Вместо этого инициализируем только структуры данных, не занимая физический порт
КонецПроцедуры

&Перед("ПробитьЧек")
Процедура Мой_ПередПробитьЧек(ДокументСсылка, ПараметрыПечати)
    // Подключаем устройство непосредственно перед отправкой команды на печать
    РезультатПодключения = МенеджерОборудованияКлиент.ПодключитьУстройство(УникальныйИдентификатор, КассаККМ.РабочееМесто);
    Если Не РезультатПодключения Тогда
        ВызватьИсключение "Не удалось временно занять порт кассы! Повторите попытку позже.";
    КонецЕсли;
КонецПроцедуры

&После("ПробитьЧек")
Процедура Мой_ПослеПробитьЧек(ДокументСсылка, ПараметрыПечати)
    // Обязательно освобождаем порт сразу после печати чека
    МенеджерОборудованияКлиент.ОтключитьУстройство(УникальныйИдентификатор, КассаККМ.РабочееМесто);
КонецПроцедуры

Используя этот подход, мы полностью имитируем поведение системы 1С:Розница. Порт будет оставаться свободным всё время, пока кассиры просто подбирают товары в корзину РМК. Ошибка «Порт занят» может возникнуть только в редчайший момент одновременного нажатия кнопки «Оплатить» на двух компьютерах, что легко решается повторным нажатием кнопки через секунду.

---

Способ 3. Виртуализация Рабочего места в 1С (Обход открытия смен)

Даже если мы решим проблему на физическом уровне (через веб-сервер), в 1С возникнет логическая проблема контроля кассовых смен. В 1С:УТ 11 кассовая смена открывается в разрезе справочника РабочиеМеста. Каждому физическому компьютеру соответствует свое рабочее место.

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

Чтобы обойти это ограничение, мы можем принудительно заставить 1С считать оба компьютера одним и тем же рабочим местом. Для этого создадим расширение и подменим результат работы функции определения рабочего места клиента.

Разберем пример кода в общем модуле МенеджерОборудованияКлиентПовтИсп или аналогичном модуле определения параметров системы:


&Вместо("ПолучитьРабочееМестоКлиента")
Функция Мой_ПолучитьРабочееМестоКлиента()
    // Задаем жесткий отбор: все компьютеры локальной сети будут использовать 
    // одно предопределенное рабочее место в справочнике
    СсылкаНаРабочееМесто = Справочники.РабочиеМеста.НайтиПоНаименованию("ОбщаяКассаСервер");
    
    Если ЗначениеЗаполнено(СсылкаНаРабочееМесто) Тогда
        Возврат СсылкаНаРабочееМесто;
    КонецЕсли;
    
    // Если предопределенное место не найдено, возвращаем стандартное поведение
    Возврат ПродолжитьВызов();
КонецФункции

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

---

Способ 4. Использование внешних утилит (Сервер ККМ)

Если вы не хотите вносить изменения в конфигурацию 1С и обновлять измененный код при каждом релизе, рассмотрите приобретение или установку специализированного программного обеспечения. Наиболее известным решением является «KKM-Server» или аналогичные службы очередей печати.

Принцип функционирования таких программ выглядит следующим образом:

---

Резюме и рекомендации

Выбор конкретного решения зависит от технических условий проекта и готовности к доработкам:

Используя данные методы, вы сможете успешно организовать работу нескольких кассиров с одной физической ККТ в 1С:Управление торговлей 11, сэкономив бюджет заказчика без потери производительности системы.

← На главную