Как исправить ошибку «Неверная цена (сумма)» и предотвратить аннулирование чеков на ККТ Атол?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

Проблема аннулирования чеков с диагностикой «Неверная цена (сумма)» (код ошибки 16) является одной из самых распространенных при работе с кассовым оборудованием Атол, особенно на современных прошивках Платформы 5.0 (версии 5.7.х, 5.8.х). Чаще всего эта ошибка возникает в конфигурациях 1С, использующих сложные системы скидок, автоматическое распределение оплат или при оформлении чеков на основании документов с дробным количеством товара.

В данной статье мы разберем природу возникновения этой ошибки, проанализируем внутреннюю логику работы кассового аппарата и рассмотрим пошаговые методы решения — от простых настроек в пользовательском интерфейсе до внесения изменений в программный код фискализации.

Выясним причину: почему касса аннулирует чек?

Начиная с Платформы 5.0, компания Атол перенесла жесткий контроль математических операций непосредственно в саму ККТ. Теперь кассовый аппарат самостоятельно перепроверяет каждую входящую позицию по формуле: Цена * Количество = Сумма. Если результат этого умножения отличается от переданного в ККТ значения суммы позиции более чем на 0.01 руб. (1 копейку), чек немедленно аннулируется.

Рассмотрим классическую ситуацию. Клиент покупает 3 единицы товара по цене 53 рубля. Общая сумма без скидки — 159 рублей. К чеку применяется общая скидка в 8 рублей. Итоговая сумма к оплате: 151 рубль. Проанализируем, что происходит при передаче данных в ККТ:

  1. 1С рассчитывает цену со скидкой для одной единицы: 151 / 3 = 50,3333... руб.
  2. При округлении до копеек цена становится равной 50,33 руб.
  3. Касса получает данные: Цена = 50,33; Количество = 3; Сумма позиции = 151.
  4. Касса умножает 50,33 * 3 и получает 150,99.
  5. Разница между 151.00 и 150.99 составляет ровно 1 копейку. В данном случае чек может пройти. Но если расхождение составит 2 копейки и более, касса выдаст ошибку 16.

Особую сложность представляют случаи с дробным количеством (например, 0.534 кг) или чеки предоплаты, где 1С пытается распределить сумму аванса по товарным строкам с учетом ранее сделанных скидок.

Решение 1: Настройка форматно-логического контроля (ФЛК)

Самый простой и эффективный способ для большинства типовых конфигураций (УТ 10.3, УТ 11, Розница) — использование встроенного механизма ФЛК. Рассмотрим, как это работает. В 1С существует настройка «Способ форматно-логического контроля», которая управляет подготовкой данных перед отправкой в драйвер ККТ.

Для исправления ошибки нам необходимо выполнить следующие действия:

  1. Перейдем в справочник «Подключаемое оборудование».
  2. Откроем карточку нашего фискального регистратора Атол.
  3. Найдем параметр «Способ форматно-логического контроля».
  4. Установим значение «Разбивать строку».

Как это работает: Если 1С видит, что сумма позиции не сходится с результатом умножения цены на количество, она автоматически разбивает одну строку товара на две. Например, вместо того чтобы отправить 3 шт. по 50,33 руб. (итог 150,99), система отправит две строки: 2 шт. по 50,33 руб. и 1 шт. по 50,34 руб. В сумме получится ровно 151 рубль, и касса примет такой чек без ошибок.

Важное ограничение: Метод разбиения строк работает только для целого количества товара. Если у вас в чеке указано 1.5 кг или 0.234 ед., 1С не сможет разделить строку, и ошибка «Неверная цена (сумма)» возникнет снова. В этом случае придется прибегнуть к программным доработкам.

Решение 2: Передача цены без округления (Программный метод)

Если настройка ФЛК не помогает или специфика бизнеса требует работы с дробным количеством, проанализируем возможности драйвера Атол 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.

Решение 3: Изменение алгоритма расчета скидок в документах

Проанализируем ситуацию, когда проблема кроется в самой методологии 1С. Часто типовые механизмы рассчитывают скидку «от суммы» документа, а затем распределяют ее по строкам. Чтобы избежать накопления погрешности округления, попробуем изменить подход и рассчитывать скидку «от цены».

Рассмотрим алгоритм действий:

  1. При применении скидки в документе (например, «Заказ покупателя» или «Чек ККМ») сначала рассчитываем новую цену со скидкой для каждой единицы товара.
  2. Округляем полученную цену до 2 знаков (до 1 копейки).
  3. Умножаем округленную цену на количество и получаем итоговую сумму строки.
  4. Разницу, возникшую при округлении, корректируем в последней строке чека или принимаем как «неизбежное зло» (итоговая сумма документа может измениться на несколько копеек в пользу клиента или компании).

Для реализации этого метода в УТ 10.3 часто приходится добавлять в табличную часть скрытую колонку ИсходнаяЦена, чтобы при изменении процента скидки расчет всегда шел от базовой стоимости, не накапливая ошибки при повторных пересчетах.

Особенности работы с предоплатой

Посмотрим на логи, приведенные в примере. При использовании способа расчета prepayment (предоплата), часто передается признак предмета расчета «Платеж» (10). В этом режиме касса особенно чувствительна. Если вы пробиваете чек на частичную оплату или закрытие аванса, рекомендуется принудительно устанавливать Количество = 1, а Цену = Сумме оплаты. Это позволит избежать любых математических расхождений, так как умножение на единицу всегда дает исходное число.

Резюме и рекомендации

Подведем итог нашему разбору. Для стабильной работы ККТ Атол без аннулирования чеков рекомендуется придерживаться следующего порядка действий:

Соблюдение этих правил позволит вам избежать ошибок при печати чеков и обеспечит корректную передачу данных в ОФД.

← На главную