Настройка торгового оборудования в среде 1С 7.7 всегда требовала от разработчика глубокого понимания принципов работы COM-соединений, драйверов и протоколов обмена. С введением требований 54-ФЗ ситуация усложнилась необходимостью постоянного сопряжения фискальных накопителей с операторами фискальных данных (ОФД). Особые трудности возникают при работе в терминальном режиме (RDP), когда ККМ подключена к локальному компьютеру пользователя, а сама база 1С 7.7 («Торговля и Склад») развернута на удаленном сервере.
В этой статье мы подробно рассмотрим, как решить комплекс задач по подключению ККТ АТОЛ 30Ф к платформе 1С 7.7 при работе через RDP. Мы разберем программные алгоритмы закрытия смены, настройку каналов связи с ОФД, методы борьбы с задержками печати по RDP и особенности реализации безналичных платежей.
Согласно требованиям законодательства, фискальная смена на ККТ не может длиться более 24 часов. Если этот интервал превышен, касса блокируется и отказывается пробивать чеки до тех пор, пока не будет снят отчет с гашением (Z-отчет), закрывающий текущую смену. При интеграции с 1С 7.7 эту операцию необходимо автоматизировать.
Рассмотрим два основных способа решения этой задачи в зависимости от используемой версии драйвера торгового оборудования (ДТО).
Вариант А. Использование исторического драйвера ДТО8
Если в вашей системе все еще используется старый 8-й драйвер АТОЛ, управление режимами кассы происходит через последовательную установку свойств объекта драйвера. Разберем пример кода на языке 1С 7.7 для программного закрытия смены:
// Создаем объект драйвера ККМ АТОЛ 8.х
Драйвер = СоздатьОбъект("AddIn.FPrnM45");
// Устанавливаем режим "Отчеты с гашением" (Mode = 3)
Драйвер.Mode = 3;
Драйвер.SetMode();
// Начинаем формирование нового документа
Драйвер.NewDocument();
// Передаем реквизиты кассира (тег 1021) в соответствии с требованиями ФФД
Драйвер.AttrNumber = 1021;
Драйвер.AttrValue = "Старший кассир Иванов И.И.";
Драйвер.WriteAttribute();
// Указываем тип отчета: 1 - Z-отчет (Закрытие смены)
Драйвер.ReportType = 1;
// Запускаем печать отчета
Драйвер.Report();
Вариант Б. Использование современного драйвера ДТО10 (Рекомендуется)
В современных реалиях настоятельно рекомендуется переходить на 10-ю версию драйвера (ДТО10), так как она полностью поддерживает актуальные форматы фискальных данных (ФФД 1.05 и 1.2). Для работы из 1С 7.7 используется внешняя компонента addin_fptr10_x86.dll. API ДТО10 существенно отличается, здесь закрытие смены выполняется методом closeShift():
// Инициализация объекта ДТО10
Драйвер = СоздатьОбъект("AddIn.Fptr10");
// Установка параметров связи (порт, скорость и т.д.) и соединение
// ... (код настройки подключения) ...
// Авторизация кассира перед закрытием смены (обязательный реквизит)
Драйвер.setParam(1021, "Иванов И.И."); // ФИО кассира
Драйвер.setParam(1203, "123456789012"); // ИНН кассира (при наличии)
Драйвер.operatorLogin();
// Вызов метода закрытия смены
Драйвер.closeShift();
Проанализируем ситуацию: если вы не хотите программировать закрытие смены непосредственно в кодовой базе 1С 7.7, кассир всегда может выполнить эту процедуру вручную через стандартную утилиту «Тест драйвера ККТ». Для этого необходимо войти в раздел «Режим», выбрать тип «Отчеты с гашением», войти в него и нажать кнопку «Снять отчет».
Передача чеков в ОФД — критически важная часть работы онлайн-кассы. При прямом подключении ККТ по интерфейсу USB компьютер видит устройство как два виртуальных COM-порта. Разберем, как правильно настроить передачу данных при работе в терминальной сессии.
Классический метод: служба EthernetOverUSB (EoU)
При использовании старых прошивок и ДТО8 передача данных осуществляется через службу EoU. Особенности ее настройки состоят в следующем:
settings.xml (обычно расположенный в каталоге установки драйвера АТОЛ на локальной машине).Современный метод: технология EthernetOverTransport (EoT)
Если вы используете современную платформу 5.0 от АТОЛ и ДТО10, схема существенно упрощается благодаря технологии EoT. При ее использовании нет необходимости в запуске отдельной службы EoU и выделении второго COM-порта:
Многие системные администраторы сталкиваются с проблемой, когда при стандартном пробросе COM-портов средствами Windows RDP печать одного чека занимает от 20 до 40 секунд. Выясним причину: драйвер ККМ обменивается с устройством сотнями мелких пакетов данных. При работе через глобальную сеть (WAN) задержка сети (пинг) накладывается на каждый пакет, что приводит к критическому замедлению печати чека.
Рассмотрим эффективные альтернативные варианты подключения ККТ в терминальном режиме:
При оплате клиентом покупки банковской картой или через СБП, касса обязана зафиксировать соответствующий тип оплаты в фискальном документе. В терминах старых драйверов эта оплата часто называлась «электронной», в современных спецификациях ФФД — «безналичной».
Посмотрим на пример реализации разделения типов оплат при закрытии чека в 1С 7.7.
Реализация для ДТО8 (свойство TypeClose)
В 8-й версии драйвера за тип закрытия чека отвечает свойство TypeClose. Обычно значение 0 соответствует наличной оплате, а значение 1 — безналичному расчету (в зависимости от настроек таблиц самой ККМ эти индексы могут меняться, их необходимо предварительно проверить в утилите администрирования ККТ):
// Предположим, у нас есть сумма наличными и сумма по карте
СуммаНал = Чек.СуммаНаличные;
СуммаБезнал = Чек.СуммаБезналичные;
Если СуммаНал > 0 Тогда
Драйвер.Summ = Окр(СуммаНал, 2, 1);
Драйвер.TypeClose = 0; // Наличные
Драйвер.Payment();
КонецЕсли;
Если СуммаБезнал > 0 Тогда
Драйвер.Summ = Окр(СуммаБезнал, 2, 1);
Драйвер.TypeClose = 1; // Безналичные (или электронные)
Драйвер.Payment();
КонецЕсли;
// Закрываем чек
Драйвер.CloseCheck();
Реализация для ДТО10 (метод closeReceipt)
В ДТО10 структура формирования платежей изменилась. Вместо вызова промежуточного метода Payment() параметры оплат передаются в финальный метод закрытия чека. Тип оплаты задается числовым значением: 0 — наличные, 1 — безналичные.
// Передаем оплаты в ДТО10 перед закрытием чека
Если СуммаНал > 0 Тогда
Драйвер.setParam(Драйвер.LIBFPTR_PARAM_PAYMENT_TYPE, Драйвер.LIBFPTR_PT_CASH); // Наличные
Драйвер.setParam(Драйвер.LIBFPTR_PARAM_PAYMENT_SUM, Окр(СуммаНал, 2, 1));
Драйвер.payment();
КонецЕсли;
Если СуммаБезнал > 0 Тогда
Драйвер.setParam(Драйвер.LIBFPTR_PARAM_PAYMENT_TYPE, Драйвер.LIBFPTR_PT_ELECTRONIC); // Безналичные
Драйвер.setParam(Драйвер.LIBFPTR_PARAM_PAYMENT_SUM, Окр(СуммаБезнал, 2, 1));
Драйвер.payment();
КонецЕсли;
// Финализируем и закрываем документ
Драйвер.closeReceipt();
Таким образом, правильное конфигурирование сетевых интерфейсов, своевременный переход на актуальные версии драйверов ДТО10 и оптимизация передачи данных по RDP позволяют построить надежную и быструю систему фискализации продаж даже на базе классической платформы 1С 7.7.