Переход с Атол ДТО 8 на ДТО 10 — это не просто обновление версии драйвера, а полная смена парадигмы взаимодействия с кассовым оборудованием. Если в восьмой версии мы работали через прямую установку свойств объекта, то в десятой реализована логика стека параметров. В этой статье мы подробно разберем, как адаптировать вашу самописку под новые требования, проанализируем архитектурные отличия и рассмотрим рабочие примеры кода.
Разберем фундаментальное отличие. В ДТО 8 программный код выглядел как последовательная установка свойств объекта драйвера: Объект.Name = "Товар"; Объект.Price = 100; Объект.Registration();. В ДТО 10 этот подход больше не работает. Драйвер версии 10 использует методы setParam для наполнения внутреннего буфера данными и команды для их выполнения. После вызова команды (например, регистрации позиции) буфер параметров автоматически очищается.
Рассмотрим пример инициализации драйвера. Вместо старых библиотек мы подключаем новый компонент AddIn.Fptr10. Для 32-разрядной версии 1С крайне важно использовать соответствующую разрядность драйвера, даже если ОС 64-битная.
// Инициализация объекта драйвера в ДТО 10
Попытка
ЗагрузитьВнешнююКомпоненту("fptr10.dll");
ОбъектККТ = Новый("AddIn.Fptr10");
Исключение
Сообщить("Не удалось загрузить драйвер Атол ДТО 10: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
Работа с отчетами в ДТО 10 стала лаконичнее, однако перед выполнением операций крайне важно проверять текущее состояние смены. Проанализируем ситуацию: если смена превысила 24 часа, касса заблокирует пробитие чека, но драйвер может не выдать явную ошибку сразу. Рассмотрим код для корректной проверки статуса смены:
// Проверка состояния смены перед операциями
ОбъектККТ.setParam(ОбъектККТ.LIBFPTR_PARAM_DATA_TYPE, ОбъектККТ.LIBFPTR_DT_SHIFT_STATE);
ОбъектККТ.queryData();
СостояниеСмены = ОбъектККТ.getParamInt(ОбъектККТ.LIBFPTR_PARAM_SHIFT_STATE);
Если СостояниеСмены = ОбъектККТ.LIBFPTR_SS_CLOSED Тогда
Сообщить("Смена закрыта. Необходимо открыть смену.");
ИначеЕсли СостояниеСмены = ОбъектККТ.LIBFPTR_SS_EXPIRED Тогда
Сообщить("Смена истекла (более 24 часов). Закройте смену и откройте новую.");
Возврат;
КонецЕсли;
// Снятие Z-отчета (закрытие смены)
ОбъектККТ.setParam(ОбъектККТ.LIBFPTR_PARAM_REPORT_TYPE, ОбъектККТ.LIBFPTR_RT_CLOSE_SHIFT);
ОбъектККТ.report();
Процесс формирования чека теперь требует строгого соблюдения порядка команд. Выясним причину: параметры должны быть установлены до вызова метода регистрации, иначе касса не "увидит" данные. Разберем последовательность действий при открытии чека и добавлении позиций:
Посмотрим на практический пример кода для регистрации одной позиции товара:
// Регистрация позиции в чеке прихода
ОбъектККТ.setParam(ОбъектККТ.LIBFPTR_PARAM_RECEIPT_TYPE, ОбъектККТ.LIBFPTR_RT_SELL);
ОбъектККТ.openReceipt();
// Параметры товара
ОбъектККТ.setParam(ОбъектККТ.LIBFPTR_PARAM_COMMODITY_NAME, "Наименование товара");
ОбъектККТ.setParam(ОбъектККТ.LIBFPTR_PARAM_PRICE, 150.00);
ОбъектККТ.setParam(ОбъектККТ.LIBFPTR_PARAM_QUANTITY, 1);
ОбъектККТ.setParam(ОбъектККТ.LIBFPTR_PARAM_TAX_TYPE, ОбъектККТ.LIBFPTR_TAX_VAT18); // Тип налога
ОбъектККТ.registration();
// Оплата
ОбъектККТ.setParam(ОбъектККТ.LIBFPTR_PARAM_PAYMENT_TYPE, ОбъектККТ.LIBFPTR_PT_CASH);
ОбъектККТ.setParam(ОбъектККТ.LIBFPTR_PARAM_PAYMENT_SUM, 150.00);
ОбъектККТ.payment();
// Закрытие чека
ОбъектККТ.closeReceipt();
В ДТО 10 каждый вызов метода возвращает результат: 0 (успех) или -1 (ошибка). Чтобы понять, почему чек не пробился (например, закончилась бумага или отсутствует связь с ФН), необходимо использовать методы errorCode() и errorDescription(). Важно помнить: драйвер хранит информацию об ошибке только до следующего вызова любого метода, поэтому считывать ее нужно немедленно.
Результат = ОбъектККТ.closeReceipt();
Если Результат <> 0 Тогда
КодОшибки = ОбъектККТ.errorCode();
ОписаниеОшибки = ОбъектККТ.errorDescription();
Сообщить("Ошибка при закрытии чека: " + ОписаниеОшибки + " (код: " + КодОшибки + ")");
ОбъектККТ.cancelReceipt(); // Отмена чека в случае фатальной ошибки
КонецЕсли;
Одной из главных ловушек для программиста при переходе на ДТО 10 является механизм EthernetOverTransport (EoT). В отличие от старого EoU, который работал как отдельная служба, EoT использует тот же канал связи, что и драйвер. Проанализируем важный момент: если ваше приложение закрывает соединение с ККТ (ОбъектККТ.close()) сразу после печати чека, данные могут не успеть уйти в ОФД.
Рекомендация: При использовании EoT не закрывайте соединение мгновенно. Либо оставляйте соединение открытым на все время работы кассира в АРМ, либо используйте проверку состояния обмена с ОФД перед закрытием. В настройках самого драйвера также проверьте флаг "Разрешать работу с ОФД при закрытом соединении".
Если ваша логика формирования чеков сложная (агентские схемы, маркировка, множество налогов), мы рекомендуем рассмотреть метод processJson. Вместо вызова сотен методов setParam, вы формируете одну структуру JSON. Это значительно упрощает отладку, так как JSON легко прочитать и валидировать.
Пример структуры JSON для пробития чека:
{
"type": "sell",
"items": [
{
"name": "Товар 1",
"price": 100,
"quantity": 1,
"amount": 100,
"tax": { "type": "vat20" }
}
],
"payments": [
{ "type": "cash", "sum": 100 }
]
}
Этот JSON передается в метод драйвера одной строкой, что сводит вероятность ошибки в порядке следования тегов к минимуму. Рассмотрим этот вариант как наиболее перспективный для современных конфигураций 1С, особенно при внедрении ФФД 1.2 и обязательной маркировки товаров.
Переход на Атол ДТО 10 в среднем занимает от 6 до 15 рабочих часов для опытного разработчика 1С. Основное время уходит на переписывание логики печати чека и адаптацию под новые методы обработки ошибок. Помните о разрядности компонент, следите за состоянием смены и не забывайте про специфику передачи данных через EoT. Правильный подход к обработке errorCode() позволит вашим пользователям получать понятные ответы от системы, а вам — тратить меньше времени на поддержку.