Как настроить печать чеков на Атол 55Ф с нескольких рабочих мест в 1С

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

При автоматизации розничной торговли часто возникает ситуация, когда несколько продавцов или менеджеров должны печатать чеки на одну общую онлайн-кассу. В случае с популярной моделью Атол 55Ф, подключенной по Ethernet, пользователи часто сталкиваются с ошибкой: "Устройство правильно настроено и соответствующий порт не занят другим приложением".

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

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

Самый современный и рекомендуемый производителем способ — использование Драйвера торгового оборудования (ДТО) версии 10. В этой версии реализован полноценный веб-сервер, который выступает посредником между 1С и кассой.

Рассмотрим алгоритм настройки этого режима:

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

Проанализируем преимущество этого метода: веб-сервер умеет самостоятельно выстраивать очередь запросов. Если два пользователя нажмут кнопку "Пробить" одновременно, сервер примет оба JSON-задания, выполнит первое, а второе поставит в очередь на несколько миллисекунд, не выдавая ошибку "порт занят".

Вариант 2. Организация очереди чеков через фоновое задание в 1С

Если используется старая конфигурация, такая как Комплексная автоматизация 1.1, и переход на новый драйвер затруднителен, мы можем реализовать механизм очереди на стороне 1С. Суть метода заключается в том, что рабочие места вообще не подключаются к кассе напрямую.

Разберем по шагам, как это реализовать программно:

  1. Создадим новый регистр сведений ОчередьЧековНаПечать. В нем будем хранить данные чека в виде XML или просто ссылку на документ.
  2. При нажатии кнопки "Пробить чек" на рабочем месте пользователя, вместо стандартного кода подключения к ККТ, пишем код записи в этот регистр.
  3. Создаем отдельный сеанс 1С (робот) или регламентное задание, которое будет работать на сервере.

Рассмотрим пример кода для обработки такой очереди:


Процедура ОбработатьОчередьЧеков() Экспорт
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 10 * ИЗ РегистрСведений.ОчередьЧековНаПечать ГДЕ Статус = &СтатусНовый";
    Запрос.УстановитьПараметр("СтатусНовый", Перечисления.СтатусыЧеков.Новый);
    
    Результат = Запрос.Выполнить().Выгрузить();
    
    Для Каждого СтрокаОчереди Из Результат Цикл
        // Подключаемся к кассе только здесь, в одном потоке
        Если ПодключитьККТ() Тогда
            РезультатПечати = НапечататьЧек(СтрокаОчереди.Объект);
            Если РезультатПечати Тогда
                ЗафиксироватьУспех(СтрокаОчереди);
            КонецЕсли;
            ОтключитьККТ();
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Этот метод гарантирует, что к порту кассы всегда обращается только один сеанс 1С — наше фоновое задание. Остальные пользователи лишь добавляют записи в таблицу.

Вариант 3. Настройка автоматического освобождения порта в драйвере

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

Чтобы минимизировать конфликты, необходимо перенастроить логику работы с объектом Драйвер в коде 1С:

  1. Вызывать подключение непосредственно перед методом НапечататьЧек.
  2. Сразу после печати (в блоке Попытка ... КонецПопытки) вызывать деактивацию устройства.
  3. В параметрах самого драйвера (если используется версия 10) установите флаг "Автоматически освобождать порт".

Также полезно будет добавить цикл ожидания в момент подключения. Проанализируем пример функции подключения с "настойчивым" ожиданием:


Функция ПодключитьсяКККТСПовтором(ОбъектДрайвера, КоличествоПопыток = 5)
    Для Счетчик = 1 По КоличествоПопыток Цикл
        Результат = ОбъектДрайвера.Подключить();
        Если Результат = 0 Тогда // 0 - успех для Атол
            Возврат Истина;
        КонецЕсли;
        
        // Если порт занят, ждем 2 секунды перед следующей попыткой
        Пауза(2); 
    КонецЦикла;
    Возврат Ложь;
КонецФункции

Вариант 4. Сторонние программные решения (KKMServer и аналоги)

Существуют специализированные программные "прокладки", такие как KKMServer или проект Print2FR. Они работают по принципу принт-сервера для касс.

Разберем принцип их работы: На компьютере, имеющем доступ к Атол 55Ф, устанавливается небольшая утилита. Она эмулирует работу кассы для всех остальных компьютеров в сети. 1С на рабочих местах обращается не к драйверу Атол, а к этому серверу по протоколу HTTP. Преимущество: полная независимость от версии 1С и платформы. Вы можете печатать чеки даже из браузера или разных баз данных одновременно.

Это решение особенно эффективно, если у вас смешанная среда (например, часть рабочих мест на 1С 7.7, а часть на 8.3), так как сервер очереди берет на себя все вопросы совместимости с низкоуровневым протоколом ККТ.

Важные рекомендации по 54-ФЗ

При использовании одной кассы на нескольких рабочих местах, мы должны помнить о требованиях законодательства:

Подводя итог, можно сказать, что для современных конфигураций оптимальным выбором будет веб-сервер АТОЛ, а для кастомизированных или старых систем (КА 1.1) — создание внутренней очереди чеков в 1С или использование KKMServer.

← На главную