С наступлением 2025 года и выходом обновлений прошивок для касс АТОЛ (в частности, версии 5.15.102 на Платформе 5.0), многие разработчики столкнулись с проблемами при прямой интеграции 1С с драйвером АТОЛ 10.x. Старые алгоритмы, работавшие годами, начинают выдавать ошибки (например, 0x407), так как ККТ теперь строго контролирует наличие определенных тегов и последовательность операций, особенно в части маркировки и внедренного разрешительного режима на кассах.
В этой статье мы подробно рассмотрим, как адаптировать код на языке 1С для работы с актуальными версиями драйвера и прошивок. Мы разберем этапы от инициализации объекта до закрытия чека с учетом новых требований ФФД.
Первым делом проанализируем процесс создания объекта драйвера. Для работы с АТОЛ 10-й версии мы используем COM-объект AddIn.Fptr10. Важно правильно настроить параметры связи перед началом любых операций. Рассмотрим пример инициализации:
// Создаем объект драйвера
FR = Новый COMОбъект("AddIn.Fptr10");
// Устанавливаем параметры связи (например, через USB)
FR.setSingleSetting(FR.LIBFPTR_SETTING_PORT, Строка(FR.LIBFPTR_PORT_USB));
FR.applySingleSettings();
// Открываем соединение с кассой
FR.open();
Если Не FR.isOpened() Тогда
Сообщить("Ошибка: Касса не подключена!");
Возврат;
КонецЕсли;
Обратим внимание, что метод applySingleSettings() обязателен для применения установленных настроек порта. После открытия соединения необходимо авторизовать кассира. Согласно 54-ФЗ, для наемных сотрудников крайне желательно передавать не только ФИО, но и ИНН кассира.
Разберем ситуацию пробития простого товара. В новых прошивках касса может требовать явного указания системы налогообложения и типа предмета расчета. Выясним, какие параметры являются критически важными, учитывая в том числе поддержку новых ставок НДС 5%, 7%, 22% в актуальных конфигурациях.
// Авторизация оператора (кассира)
FR.setParam(1021, "Иванов Иван Иванович"); // Тег 1021 (ФИО кассира)
// FR.setParam(1203, "123456789012"); // Тег 1203 (ИНН кассира) - рекомендуется
FR.operatorLogin();
// Открытие чека продажи
FR.setParam(FR.LIBFPTR_PARAM_RECEIPT_TYPE, FR.LIBFPTR_RT_SELL);
FR.openReceipt();
// Формирование позиции чека
FR.setParam(FR.LIBFPTR_PARAM_COMMODITY_NAME, "Товар тестовый");
FR.setParam(FR.LIBFPTR_PARAM_PRICE, 100.00);
FR.setParam(FR.LIBFPTR_PARAM_QUANTITY, 1);
FR.setParam(FR.LIBFPTR_PARAM_TAX_TYPE, FR.LIBFPTR_TAX_NO); // Без НДС
// ВАЖНО для новых прошивок: указываем признак предмета расчета (Тег 1212)
// LIBFPTR_ST_COMMODITY = 1 (Товар)
FR.setParam(FR.LIBFPTR_PARAM_COMMODITY_SUBJECT_TYPE, 1);
// Регистрация позиции в чеке
FR.registration();
В приведенном коде мы используем метод registration(). Если касса возвращает ошибку 0x407, это часто означает, что прошивка ожидает дополнительные реквизиты, такие как LIBFPTR_PARAM_MEASUREMENT_UNIT (Мера количества, Тег 2108), которая стала обязательной в некоторых сценариях ФФД 1.05 и 1.2.
После регистрации всех позиций необходимо провести оплату и финализировать документ. Проанализируем пример закрытия чека с проверкой результата:
// Указываем сумму и тип оплаты
FR.setParam(FR.LIBFPTR_PARAM_PAYMENT_SUM, 100.00);
FR.setParam(FR.LIBFPTR_PARAM_PAYMENT_TYPE, FR.LIBFPTR_PT_CASH); // Наличные
FR.payment();
// Закрываем чек
FR.closeReceipt();
// Проверяем, закрылся ли документ фактически
Ответ = FR.checkDocumentClosed();
Если Ответ <> 0 Тогда
Сообщить("Ошибка при закрытии чека! Связь потеряна или возникла ошибка ФН.");
КонецЕсли;
ЧекЗакрыт = FR.getParamBool(FR.LIBFPTR_PARAM_DOCUMENT_CLOSED);
Если ЧекЗакрыт Тогда
Сообщить("Чек успешно пробит. Номер: " + FR.getParamInt(FR.LIBFPTR_PARAM_RECEIPT_NUMBER));
КонецЕсли;
FR.close(); // Закрываем соединение
Для работы с маркированным товаром на новых прошивках (ФФД 1.2) процедура существенно усложняется из-за внедрения разрешительного режима. Теперь нельзя просто передать строку кода маркировки в позицию чека. Процесс должен включать предварительную проверку кода в системе "Честный ЗНАК" через фискальный накопитель. В некоторых случаях может потребоваться внешняя обработка для запроса информации кодов Честного знака для проверки КИ до момента пробития.
Рассмотрим алгоритм действий для маркировки:
beginMarkingCodeCheck(). Передаем полный код маркировки.getMarkingCodeCheckStatus(), пока статус не станет завершенным. Для мобильных рабочих мест можно также контролировать статус марок через Android-устройство с помощью специализированного ПО.acceptMarkingCode() для фиксации кода в памяти ККТ.registration(). Код маркировки при этом подтянется автоматически из результатов проверки.Для пользователей, которые ищут замену для Frontol Mark Unit в условиях новых лицензионных ограничений, крайне важно реализовать данный алгоритм корректно непосредственно в 1С. Для ФФД 1.05 (если ваша организация еще имеет право его использовать) маркировка передается через тег 1162, но прошивка 5.15.102 все равно будет требовать корректного заполнения COMMODITY_SUBJECT_TYPE со значением "Маркированный товар".
Рассмотрим основные причины сбоев на свежих прошивках:
1. Ошибка 0x407 (Не поддерживается в данной версии): Чаще всего возникает, если вы пытаетесь пробить маркированный товар старым способом на кассе, переведенной на ФФД 1.2. Также проверьте наличие тега 2108 (единица измерения).
2. Отсутствие связи после обновления: Прошивка 5.15.x может изменить настройки каналов связи. Убедитесь, что в драйвере выбран правильный интерфейс и актуальная версия Fptr10.dll (рекомендуется не ниже 10.10.7).
3. Ошибки разрешительного режима: Если касса не может связаться с сервером ОИСМ, чек может быть заблокирован.
Подводя итог, можно сказать, что современная работа с АТОЛ через 10-й драйвер требует более строгого подхода к заполнению реквизитов каждой позиции. Мы рекомендуем переходить на формирование чека через processJson(), если ваша учетная система это позволяет, так как это наиболее стабильный способ передачи сложных структур данных в последних версиях ПО АТОЛ.