Почему перестала отключаться касса АТОЛ после обновления на 10 драйвер и как это исправить

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

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

Разбираем причину блокировки: переход от EoU к EoT

Для начала проанализируем ситуацию с технической стороны. В старых версиях (платформа 2.5, драйвер 9) обмен данными с ОФД часто шел через службу EoU (Ethernet over USB), а само соединение с кассой по сети было «дискретным» — драйвер подключался, передавал данные чека и сразу разрывал соединение. Это позволяло нескольким пользователям по очереди обращаться к одному IP-адресу кассы.

С выходом платформы 5.0 и 10-го драйвера компания АТОЛ перешла на технологию EoT (Ethernet over Transport). Теперь канал связи для печати чеков и канал для передачи данных в ОФД совмещены. Чтобы касса могла стабильно отправлять чеки оператору фискальных данных, драйвер удерживает TCP-порт открытым. Как только 1С инициализирует устройство, драйвер 10 «столбит» за собой канал связи. Поскольку сетевой модуль ККТ чаще всего поддерживает только одно активное соединение, все остальные попытки подключения от других пользователей отклоняются до тех пор, пока первый пользователь полностью не закроет программу или не уничтожит объект драйвера.

Вариант 1: Программное принудительное отключение устройства

Рассмотрим ситуацию, когда нам необходимо оставить текущую схему работы, но заставить 1С освобождать порт сразу после печати чека. В типовой УТ 10.3 используется механизм торгового оборудования, базирующийся на обработках обслуживания. Проблема заключается в том, что при открытии смены или просто при инициализации системы 1С вызывает метод подключения и «держит» его.

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

Для решения проблемы в коде обработки или в модуле, отвечающем за печать чека, необходимо принудительно вызывать деинициализацию. Выясним причину, по которой стандартное отключение может не срабатывать: 10-й драйвер требует явного вызова метода done() (или его аналога в зависимости от используемой компоненты). Проанализируем пример логики, которую стоит внедрить в процедуру завершения печати чека:


// Пример логики освобождения устройства в коде 1С
// После выполнения печати чека (команда НапечататьЧеки или аналогичная)
// Необходимо убедиться, что объект драйвера уничтожен или деактивирован

Результат = ОбъектДрайвера.ОсвободитьУстройство(); 
// Если используется стандартная обработка обслуживания АТОЛ 10:
// Нужно проверить, есть ли в ней экспортный метод Отключить() или ЗавершитьРаботу()

Если Результат = Истина Тогда
    ОбъектДрайвера = Неопределено; // Уничтожаем объект для разрыва связи
КонецЕсли;

Важно помнить: если вы используете обработку обслуживания (файл .epf), убедитесь, что в ней реализован механизм «Занимать устройство только на время операции». В новых версиях БПО (Библиотеки подключаемого оборудования) этот флаг выведен в интерфейс настроек. В старой УТ 10.3 этот функционал придется дописывать вручную в модуле РаботаСТорговымОборудованием.

Вариант 2: Использование Веб-сервера АТОЛ (рекомендуемый способ)

Разберем наиболее современный и стабильный метод решения задачи, который предлагает сам производитель. Вместо того чтобы каждое рабочее место 1С пыталось «достучаться» до IP-адреса кассы напрямую, мы создаем промежуточное звено — Драйвер ККТ: Сервер.

  1. Установка: На одном из компьютеров (который всегда включен) или на сервере устанавливается полная версия драйвера АТОЛ 10 и запускается служба «Драйвер ККТ: Сервер».
  2. Настройка сервера: В утилите «Тест драйвера» на этом сервере настраивается постоянное соединение с кассой. Сервер сам будет удерживать порт и управлять очередью запросов.
  3. Настройка в 1С: На рабочих местах пользователей в настройках торгового оборудования тип подключения меняется с «Локально/Сеть» на «Web-сервер». Вместо IP-адреса кассы указывается IP-адрес сервера, где запущена служба АТОЛ, и порт (по умолчанию 16732).

Посмотрим на преимущества этого подхода: 1С взаимодействует с сервером по протоколу HTTP (JSON API). Сервер принимает задания на печать от всех пользователей, выстраивает их в очередь и поочередно отправляет на ККТ. Это полностью снимает проблему блокировки порта EoT.

Нюанс для УТ 10.3: Проанализируем совместимость. Релизы серии 10.3.71 и выше уже имеют встроенную поддержку драйверов версии 10.x. Однако, если ваша конфигурация сильно кастомизирована, может потребоваться обновление обработки обслуживания ATOLKKT.epf до актуальной версии, поддерживающей JSON-интерфейс.

Вариант 3: Настройка таймаутов и параметров в Тесте драйвера

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

Рассмотрим параметры, которые могут помочь:

Однако стоит признать, что этот путь является наименее надежным, так как при интенсивной работе конфликты доступа все равно будут возникать, приводя к ошибкам типа «Порт занят» или «Устройство недоступно».

Выясняем причину ошибки "КоличествоУстройств = 0"

При попытке реализовать отключение через код, как упоминалось в сообщениях форума, программисты часто видят, что массив подключенных устройств пуст. Разберем, почему это происходит. В УТ 10.3 старая архитектура ТО работает через глТорговоеОборудование, а не через глПодключаемоеОборудование (которое характерно для управляемых форм). Если вы вызываете ПолучитьСерверТО().ОтключитьКлиента(ЭтаФорма), система ищет устройства, зарегистрированные в текущем сеансе по новым правилам.

Для корректного отключения в УТ 10.3 следует использовать прямой вызов обработки обслуживания:


// Пример корректного обращения к обработке обслуживания для закрытия соединения
МенеджерТО = глТорговоеОборудование;
СписокОборудования = МенеджерТО.ПолучитьСписокОборудования(Перечисления.ВидыТорговогоОборудования.ФискальныйРегистратор);

Для Каждого СтрокаОборудования Из СписокОборудования Цикл
    // Проверяем, что это наше устройство, и вызываем отключение
    МенеджерТО.ОсвободитьУстройство(СтрокаОборудования.Ссылка);
КонецЦикла;

Подводим итоги

Проблема «неотключаемой» кассы — это не баг 1С или АТОЛ, а следствие изменения архитектуры сетевого обмена в современных ККТ. Для стабильной работы мы рекомендуем:

  1. Перейти на использование АТОЛ Web-server (Драйвер ККТ: Сервер), если конфигурация 1С позволяет настроить такой тип подключения. Это решит проблему очередей и блокировок раз и навсегда.
  2. Если используется прямое подключение, модифицировать код 1С так, чтобы объект драйвера уничтожался (Объект = Неопределено) сразу после завершения печати каждого чека.
  3. Проверить версию прошивки ККТ и версию драйвера — они должны быть совместимы (для 10-го драйвера рекомендуется платформа 5.0).

Такой комплексный подход позволит вам сохранить инвестиции в оборудование и обеспечить бесперебойную работу кассового узла в многопользовательском режиме.

← На главную