При интеграции 1С с фискальными регистраторами (например, Атол FPrint-22ПТК) разработчики периодически сталкиваются с ситуацией, когда скидка на чековой ленте отображается некорректно. Например, при сумме товара 100 рублей и скидке 20% касса выводит на печать сумму 100 рублей и скидку 100 рублей. Разберем по шагам, как локализовать источник проблемы, протестировать печать без закрытой фискализации и правильно передать данные позиции чека.
Первым делом выясним, на каком уровне происходит искажение — в прошивке/настройках самого устройства или в алгоритмах 1С. Для этого выполним проверку через штатный тест драйвера ККТ:
Если из теста драйвера скидка рассчитывается и печатается корректно, значит, сама касса и ее табличные параметры функционируют штатно. Проблема кроется в формировании пакета данных или обработке обслуживания внутри 1С.
Часто при отладке торгового оборудования разработчик сталкивается с блокировкой: касса выдает ошибку о том, что накопитель не фискализирован, и прерывает выполнение кода до этапа формирования чека. Рассмотрим способы обойти это ограничение для анализа отправляемых данных.
Способ 1. Временное отключение проверки параметров ФР в коде 1С. В старых типовых и нетиповых конфигурациях перед отправкой XML или вызовом драйвера срабатывают проверки готовности фискального регистратора. Для трассировки алгоритма можно временно закомментировать условие проверки:
// Временное отключение проверки статуса ФР для отладки формирования чека
// Если Не РаботаСТорговымОборудованием.ПолучитьПроверитьПараметрыДляПробитияЧека(ФР) Тогда
// Возврат;
// КонецЕсли;
Способ 2. Использование эмулятора ККТ. В подсистеме подключаемого оборудования (БПО) рекомендуется переключить кассу на 1С:ККТ с передачей данных (эмулятор) или 1С:Фискальный регистратор (эмулятор). Это позволит выполнить типовой алгоритм чека целиком без подключения реального аппарата и увидеть результирующий XML-пакет в отладчике.
Способ 3. Анализ лог-файла драйвера. Драйвер АТОЛ фиксирует все поступающие от 1С команды в файле fptr10.log (или fptr.log). В нем можно увидеть точные значения параметров LIBFPTR_PARAM_PRICE, LIBFPTR_PARAM_POSITION_SUM и LIBFPTR_PARAM_INFO_DISCOUNT_SUM, отправленные из 1С.
Проанализируем математику формирования строки чека. Ошибка, при которой скидка приравнивается к общей стоимости, чаще всего возникает из-за путаницы между суммой строки, ценой со скидкой и абсолютным значением скидки.
В соответствии с требованиями ФФД (форматов фискальных документов), касса регистрирует итоговую стоимость предмета расчета. Рассчитаем результирующую стоимость позиции с явным округлением копеек:
// Корректный расчет стоимости позиции с учетом процента скидки
СуммаСкидки = Окр(Количество * Цена * ПроцентСкидки / 100, 2, РежимОкругления.Окр15как20);
СуммаПозиции = (Количество * Цена) - СуммаСкидки;
При передаче данных через XML-пакет (CheckPackage) или параметры метода драйвера обратим внимание на следующие правила:
<FiscalString> одновременно передаются полная цена без скидки (Price), итоговая сумма позиции (Amount) и сумма скидки (DiscountAmount), драйвер может повторно уменьшить сумму либо интерпретировать переданную сумму как стопроцентную скидку.Количество * Цена = Стоимость).<TextString>) перед или после фискальной позиции товара.Если код расчета в конфигурации корректен, проверим программное окружение:
ExtComp от устаревших версий библиотек (fptr.dll / fptr10.dll).