Почему не уходят чеки в ОФД на Атол 1Ф при работе в 1С через EoT и как решить эту проблему?

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

При автоматизации розничной торговли многие системные администраторы и специалисты 1С сталкиваются с крайне неприятной проблемой: кассовый аппарат (например, бюджетный АТОЛ 1Ф) исправно печатает чеки покупателям, но данные в ОФД не отправляются. Документы начинают копиться в фискальном накопителе (ФН), грозя его блокировкой по истечении 30 дней. При этом обнаруживается странная закономерность: стоит только закрыть программу 1С и открыть тест драйвера ККТ АТОЛ для проверки связи — все накопившиеся чеки мгновенно улетают в ОФД.

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

Суть проблемы: почему чеки «виснут» при открытой 1С?

Чтобы понять причину сбоя, нам необходимо разобраться в архитектурных различиях двух основных протоколов передачи данных от касс АТОЛ в ОФД — EoU (Ethernet over USB) и EoT (Ethernet over Transport).

Протокол EoU работает как отдельная служба операционной системы Windows (EthOverUsb.exe). Для ее работы на ККТ выделяется отдельный виртуальный COM-порт, параллельный порту управления кассой. Служба функционирует независимо от 1С: программа бьет чеки по одному порту, а служба EoU забирает данные и отправляет их в ОФД по другому. В этой схеме блокировки исключены.

Протокол EoT спроектирован иначе. Это более современный стандарт, работающий внутри самого драйвера ККТ АТОЛ 10-й версии. Отдельная служба для него не требуется, а передача данных в ОФД происходит по тому же самому единственному COM-порту, через который 1С управляет кассой. Но в этом кроется и главная уязвимость: передача данных по EoT возможна только тогда, когда драйвер удерживает активную связь с ККТ, а сам порт свободен от выполнения других команд.

Когда пользователь работает в 1С, конфигурация монопольно захватывает COM-порт кассы для готовности к быстрой печати чеков. Из-за этого фоновые потоки драйвера, отвечающие за EoT, просто не могут «достучаться» до физического устройства и передать пакеты данных в интернет. Как только мы закрываем 1С, порт освобождается, драйвер перехватывает его, и данные уходят в ОФД.

---

Способ 1. Настройка удержания и освобождения порта в 1С и драйвере

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

  1. Откроем 1С:Управление торговлей и перейдем в раздел НСИ и администрирование -> РМК и оборудование -> Подключаемое оборудование.
  2. Откроем карточку нашей кассы АТОЛ 1Ф и нажмем кнопку Настроить....
  3. Найдем параметр «Отключаться от ККТ, даже если канал до ОФД – EthernetOverTransport» (в некоторых релизах БПО он называется просто «Отключаться от ККТ»). Обязательно взведем этот флаг. Это заставит 1С принудительно разрывать соединение с портом кассы сразу после печати чека, давая драйверу ККТ короткие «окна» для отправки данных в ОФД.
  4. Если касса подключена монопольно к одному рабочему месту, а галочка отключения не помогает (1С все равно удерживает порт из-за особенностей работы файловой базы или RDP), откроем «Тест драйвера ККТ» (DTO 10), зайдем в Свойства -> Параметры ККТ -> раздел ОФД.
  5. Проверим значение поля Канал обмена. Нам необходимо принудительно выбрать EthernetOverTransport вместо значения Автоматически. Также рекомендуется установить минимально возможный интервал опроса ОФД в параметрах кассы.
  6. Обратим внимание на адрес сервера ОФД. Некоторые операторы фискальных данных некорректно работают по протоколу EoT, если в кассе прописан IP-адрес сервера в виде цифр (например, 185.165.116.14). Рекомендуется прописывать буквенный домен сервера (например, fnoff.ru или gate.platformaofd.ru).

---

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

Если манипуляции с портами в 1С не привели к стабильной отправке, воспользуемся самым надежным и современным способом — переведем работу кассы через локальный Web-сервер АТОЛ. Этот метод полностью решает проблему монопольного захвата портов.

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

Настроим эту схему по шагам:

  1. При установке Драйвера ККТ АТОЛ 10 на компьютер обязательно отметим галочкой компонент Web-сервер АТОЛ.
  2. Запустим службу Web-сервера через утилиту управления или через диспетчер служб Windows (служба называется Atol Web Service). По умолчанию она работает на порту 16732.
  3. Убедимся, что служба успешно захватила кассу. Для этого откроем браузер и перейдем по адресу http://127.0.0.1:16732. Мы должны увидеть веб-интерфейс управления кассой.
  4. Перейдем в 1С в настройки подключаемого оборудования. Изменим драйвер устройства. Вместо стандартного «АТOL:ККТ с передачей данных в ОФД (10.х)» выберем драйвер «АТОЛ:ККТ с передачей данных в ОФД (Web-сервер)» или настроим подключение через тип соединения TCP/IP (или Web Request).
  5. В параметрах подключения укажем IP-адрес 127.0.0.1 и порт 16732.

Теперь 1С посылает команды на печать по HTTP, Web-сервер их мгновенно исполняет, а в перерывах между печатью сам непрерывно передает данные в ОФД по открытому каналу EoT. Дополнительный плюс: кассу теперь можно легко расшарить на несколько компьютеров в локальной сети.

---

Способ 3. Переход на протокол EoU через обновление прошивки ККТ

Существует распространенное заблуждение, что АТОЛ 1Ф — слишком «урезанная» касса, которая физически не умеет работать по протоколу EoU. Ранее это действительно было так, но производитель добавил полноценную поддержку EoU в современных версиях прошивок (платформа 5.0, версия прошивки 5.7.10 и выше).

Если мы обновим ККТ до актуальной прошивки, мы сможем разделить управляющий порт и порт отправки данных в ОФД:

  1. Подключим кассу к ПК и запустим Тест драйвера ККТ.
  2. Перейдем в Параметры ККТ -> ОФД и заменим значение канала связи на EoU. После применения настроек касса перезагрузится, и в диспетчере устройств Windows вместо одного COM-порта определятся два (например, COM3 и COM4).
  3. В настройках 1С укажем порт управления (например, COM3).
  4. Для работы службы отправки перейдем в каталог установленной службы EoU (обычно это C:\ProgramData\ATOL\EoU\) и отредактируем конфигурационный файл settings.xml. Нам нужно жестко прописать туда второй порт кассы, выделенный под нужды ОФД (например, COM4).

Пример правильной структуры файла settings.xml для службы EoU:


<?xml version="1.0" encoding="UTF-8"?>
<settings>
    <device>
        <id>Atol_1F_EoU</id>
        <port>COM4</port>
    </device>
</settings>

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

---

Способ 4. Программное решение проблемы освобождения порта (для разработчиков)

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

Проанализируем правильный шаблон написания кода на языке 1С для работы с драйвером АТОЛ 10-й версии. Главное правило: подключился -> пробил чек -> сразу закрыл соединение.


// Пример правильного управления жизненным циклом соединения с ККТ
Процедура НапечататьЧекНаККТ(ПараметрыЧека) Экспорт
    
    // Создаем объект драйвера АТОЛ ДТО 10
    ДрайверККТ = Новый ("AddIn.Fptr10");
    
    // Задаем параметры связи с кассой
    ДрайверККТ.УстановитьСвойство("Port", 3); // Идентификатор USB/COM порта
    ДрайверККТ.УстановитьСвойство("BaudRate", 115200);
    ДрайверККТ.УстановитьСвойство("Model", 92); // Код модели АТОЛ 1Ф
    
    // Шаг 1. Открываем порт непосредственно перед печатью
    РезультатПодключения = ДрайверККТ.Открыть();
    Если РезультатПодключения <> 0 Тогда
        ВызватьИсключение "Не удалось подключиться к кассе: " + ДрайверККТ.ПолучитьОшибку();
    КонецЕсли;
    
    Попытка
        // Открываем документ (чек прихода)
        ДрайверККТ.УстановитьСвойство("Type", 1); 
        ДрайверККТ.ОткрытьДокумент();
        
        // Передаем параметры позиции чека
        ДрайверККТ.УстановитьСвойство("Name", ПараметрыЧека.НаименованиеТОВАРА);
        ДрайверККТ.УстановитьСвойство("Price", ПараметрыЧека.Цена);
        ДрайверККТ.УстановитьСвойство("Quantity", ПараметрыЧека.Количество);
        ДрайверККТ.УстановитьСвойство("PositionSum", ПараметрыЧека.Сумма);
        ДрайверККТ.РегистрацияПозиции();
        
        // Проводим оплату и закрываем документ
        ДрайверККТ.УстановитьСвойство("Type", 1); // Оплата наличными
        ДрайверККТ.УстановитьСвойство("Sum", ПараметрыЧека.Сумма);
        ДрайверККТ.Оплата();
        ДрайверККТ.ЗакрытьДокумент();
        
    Исключение
        // В случае сбоя обязательно корректно отменяем документ в буфере ККТ
        ДрайверККТ.ОтменитьДокумент();
        ЗаписатьЛогОшибки(ОписаниеОшибки());
    КонецПопытки;
    
    // Шаг 2. КРИТИЧЕСКИ ВАЖНО: Освобождаем порт кассы для фоновой отправки EoT!
    ДрайверККТ.Закрыть();
    
КонецПроцедуры

Использование конструкции ДрайверККТ.Закрыть() в конце каждой транзакции гарантирует, что порт кассы будет свободен 99% рабочего времени. За эти промежутки служба драйвера АТОЛ успеет без труда передать все фискальные документы оператору ОФД по каналу Ethernet over Transport.

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

← На главную