Проблема аннулирования чеков с диагностикой «Неверная цена (сумма)» (код ошибки 16) является одной из самых распространенных при работе с кассовым оборудованием Атол, особенно на современных прошивках Платформы 5.0 (версии 5.7.х, 5.8.х). Чаще всего эта ошибка возникает в конфигурациях 1С, использующих сложные системы скидок, автоматическое распределение оплат или при оформлении чеков на основании документов с дробным количеством товара.
В данной статье мы разберем природу возникновения этой ошибки, проанализируем внутреннюю логику работы кассового аппарата и рассмотрим пошаговые методы решения — от простых настроек в пользовательском интерфейсе до внесения изменений в программный код фискализации.
Начиная с Платформы 5.0, компания Атол перенесла жесткий контроль математических операций непосредственно в саму ККТ. Теперь кассовый аппарат самостоятельно перепроверяет каждую входящую позицию по формуле: Цена * Количество = Сумма. Если результат этого умножения отличается от переданного в ККТ значения суммы позиции более чем на 0.01 руб. (1 копейку), чек немедленно аннулируется.
Рассмотрим классическую ситуацию. Клиент покупает 3 единицы товара по цене 53 рубля. Общая сумма без скидки — 159 рублей. К чеку применяется общая скидка в 8 рублей. Итоговая сумма к оплате: 151 рубль. Проанализируем, что происходит при передаче данных в ККТ:
Особую сложность представляют случаи с дробным количеством (например, 0.534 кг) или чеки предоплаты, где 1С пытается распределить сумму аванса по товарным строкам с учетом ранее сделанных скидок.
Самый простой и эффективный способ для большинства типовых конфигураций (УТ 10.3, УТ 11, Розница) — использование встроенного механизма ФЛК. Рассмотрим, как это работает. В 1С существует настройка «Способ форматно-логического контроля», которая управляет подготовкой данных перед отправкой в драйвер ККТ.
Для исправления ошибки нам необходимо выполнить следующие действия:
Как это работает: Если 1С видит, что сумма позиции не сходится с результатом умножения цены на количество, она автоматически разбивает одну строку товара на две. Например, вместо того чтобы отправить 3 шт. по 50,33 руб. (итог 150,99), система отправит две строки: 2 шт. по 50,33 руб. и 1 шт. по 50,34 руб. В сумме получится ровно 151 рубль, и касса примет такой чек без ошибок.
Важное ограничение: Метод разбиения строк работает только для целого количества товара. Если у вас в чеке указано 1.5 кг или 0.234 ед., 1С не сможет разделить строку, и ошибка «Неверная цена (сумма)» возникнет снова. В этом случае придется прибегнуть к программным доработкам.
Если настройка ФЛК не помогает или специфика бизнеса требует работы с дробным количеством, проанализируем возможности драйвера Атол 10-й версии. Параметр драйвера LIBFPTR_PARAM_PRICE (65632) позволяет передавать цену с очень высокой точностью — до 10 знаков после запятой.
Рассмотрим пример кода, который можно внедрить в модуль фискализации (обычно это Обработка.ТОФРОбъектВызова.ФискализироватьЧек или аналогичный модуль в БПО):
// Вместо передачи округленной до 2 знаков цены,
// передаем расчетную величину с максимальной точностью
Для Каждого СтрокаТЧ Из ТаблицаТоваров Цикл
Если СтрокаТЧ.Количество <> 0 Тогда
// Рассчитываем цену напрямую из суммы без предварительного округления в 1С
ТочнаяЦена = СтрокаТЧ.Сумма / СтрокаТЧ.Количество;
// Передаем параметры в драйвер Атол 10
Драйвер.setParam(65632, ТочнаяЦена); // LIBFPTR_PARAM_PRICE
Драйвер.setParam(65633, СтрокаТЧ.Количество); // LIBFPTR_PARAM_QUANTITY
Драйвер.setParam(65634, СтрокаТЧ.Сумма); // LIBFPTR_PARAM_POSITION_SUM
КонецЕсли;
КонецЦикла;
В этом случае внутренняя математика ККТ отработает корректно. Касса сама произведет необходимые округления при расчете итога, и, так как входная цена имела высокую точность, результат умножения совпадет с переданной суммой LIBFPTR_PARAM_POSITION_SUM.
Проанализируем ситуацию, когда проблема кроется в самой методологии 1С. Часто типовые механизмы рассчитывают скидку «от суммы» документа, а затем распределяют ее по строкам. Чтобы избежать накопления погрешности округления, попробуем изменить подход и рассчитывать скидку «от цены».
Рассмотрим алгоритм действий:
Для реализации этого метода в УТ 10.3 часто приходится добавлять в табличную часть скрытую колонку ИсходнаяЦена, чтобы при изменении процента скидки расчет всегда шел от базовой стоимости, не накапливая ошибки при повторных пересчетах.
Посмотрим на логи, приведенные в примере. При использовании способа расчета prepayment (предоплата), часто передается признак предмета расчета «Платеж» (10). В этом режиме касса особенно чувствительна. Если вы пробиваете чек на частичную оплату или закрытие аванса, рекомендуется принудительно устанавливать Количество = 1, а Цену = Сумме оплаты. Это позволит избежать любых математических расхождений, так как умножение на единицу всегда дает исходное число.
Подведем итог нашему разбору. Для стабильной работы ККТ Атол без аннулирования чеков рекомендуется придерживаться следующего порядка действий:
Сумма / Количество без промежуточного округления до 2 знаков.Цена * Количество всегда было равно Сумме.Соблюдение этих правил позволит вам избежать ошибок при печати чеков и обеспечит корректную передачу данных в ОФД.