При автоматизации розничной торговли многие системные администраторы и специалисты 1С сталкиваются с крайне неприятной проблемой: кассовый аппарат (например, бюджетный АТОЛ 1Ф) исправно печатает чеки покупателям, но данные в ОФД не отправляются. Документы начинают копиться в фискальном накопителе (ФН), грозя его блокировкой по истечении 30 дней. При этом обнаруживается странная закономерность: стоит только закрыть программу 1С и открыть тест драйвера ККТ АТОЛ для проверки связи — все накопившиеся чеки мгновенно улетают в ОФД.
В этой статье мы подробно разберем, почему возникает этот конфликт, проанализируем разницу в протоколах передачи данных, а также рассмотрим четыре практических способа решения проблемы для конфигурации «1С:Управление торговлей 11.5» (и аналогичных решений на базе Библиотеки подключаемого оборудования — БПО).
Чтобы понять причину сбоя, нам необходимо разобраться в архитектурных различиях двух основных протоколов передачи данных от касс АТОЛ в ОФД — 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С освобождать порт сразу после завершения печати чека. Разберем по шагам, как это настроить.
EthernetOverTransport вместо значения Автоматически. Также рекомендуется установить минимально возможный интервал опроса ОФД в параметрах кассы.185.165.116.14). Рекомендуется прописывать буквенный домен сервера (например, fnoff.ru или gate.platformaofd.ru).---
Если манипуляции с портами в 1С не привели к стабильной отправке, воспользуемся самым надежным и современным способом — переведем работу кассы через локальный Web-сервер АТОЛ. Этот метод полностью решает проблему монопольного захвата портов.
При такой схеме специальная служба Web-сервера АТОЛ запускается на компьютере и постоянно держит открытым COM-порт кассы. Драйвер внутри Web-сервера непрерывно имеет доступ к ККТ, благодаря чему EoT работает без сбоев каждую секунду. 1С при этом общается с кассой не напрямую через COM-порт, а посредством легких HTTP-запросов к Web-серверу.
Настроим эту схему по шагам:
Atol Web Service). По умолчанию она работает на порту 16732.http://127.0.0.1:16732. Мы должны увидеть веб-интерфейс управления кассой.127.0.0.1 и порт 16732.Теперь 1С посылает команды на печать по HTTP, Web-сервер их мгновенно исполняет, а в перерывах между печатью сам непрерывно передает данные в ОФД по открытому каналу EoT. Дополнительный плюс: кассу теперь можно легко расшарить на несколько компьютеров в локальной сети.
---
Существует распространенное заблуждение, что АТОЛ 1Ф — слишком «урезанная» касса, которая физически не умеет работать по протоколу EoU. Ранее это действительно было так, но производитель добавил полноценную поддержку EoU в современных версиях прошивок (платформа 5.0, версия прошивки 5.7.10 и выше).
Если мы обновим ККТ до актуальной прошивки, мы сможем разделить управляющий порт и порт отправки данных в ОФД:
COM3 и COM4).COM3).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С и захвачен ли управляющий порт.
---
Рассмотрим ситуацию, когда касса подключена к 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.
Применяя данные подходы, мы сможем гарантировать бесперебойную и стабильную отправку чеков в ОФД, избежав блокировки фискального накопителя и штрафных санкций со стороны налоговых органов.