HTTP-сервис в 1С получает запрос с входящими параметрами, ищет документ продажи и пробивает по нему безналичную оплату на кассе ATOL. Сумма в сервис посылается произвольная - она же и должна биться в чек. Проблема в том, что когда заявленная сумма меньше, чем сумма в документе продажи, то она никак не пересчитывается при печати чека. А должна. Пробовала пересчитать алгоритмически на стороне 1С, но Атол аннулирует чек. Описание ошибки гласит: {"error":{"code":16,"description":"Неверная цена (сумма)"}. В таблице все значения пересчитаны, значения оплаты заданы такие же.

В чём может быть проблема и как её можно решить?
---
В общем, проблему решили другим путём: обошлись в итоге без пересчётов.

Если клиент вводит сумму больше - ему падает "лишняя часть" как авансовый платёж. Если оплачивает сумму меньше - как задолженность.

У АТОЛа для этого есть специальный приём: изменяем массив с оплатами. Если оплата прошла больше - разбиваем на 2 части, сколько было нужно и сколько привысило. То, что должно было закрыть проводим с типом оплаты как есть, а то, что сверху проводим авансом - с типом prepaid или 2 - предварительная оплата.

Если меньше - тип credir или 3 - последующая оплата.

В чеке это выглядит примерно так:

(Оплата больше)
<...>
НДС 20/120%
ПЛАТЕЖ/ВЫПЛАТА
АВАНС

ЕД.ИЗМЕРЕНИЯ:Платеж
----------------------------------
ИТОГ =3000.00
----------------------------------
ОПЛАТА
 БЕЗНАЛИЧНЫМИ =3000.00
СНО: ОСН
 СУММА НДС 20% =476.37
 СУММА НДС 20/120% =23.63
КАССИР: Администратор

ПОДПИСЬ:__________________________
       СПАСИБО ЗА ПОКУПКУ!
==================================

(оплата меньше)
<...>
НДС 20%
ТОВАР
ЧАСТИЧНЫЙ РАСЧЕТ И КРЕДИТ
2009700338183
----------------------------------
ИТОГ =2858.20
----------------------------------
ОПЛАТА
 БЕЗНАЛИЧНЫМИ =2500.00
 ПОСЛЕДУЮЩАЯ =358.20
СНО: ОСН
 СУММА НДС 20% =476.37
КАССИР: Администратор

ПОДПИСЬ:__________________________
       СПАСИБО ЗА ПОКУПКУ!
==================================
---
В чём может быть проблема и как её можно решить? а логов на кассе никаких нет? Может дробные копейки вылезают, которые касса не понимает.
---
Логов нет, но да, проблема копеек.

Опытным путём удалось установить следующие требования, предъявляемые кассой при печати:

1) Все денежные суммы ("price", "amount") в строках не должны иметь более 2-х знаков после запятой;
2) Результат Цена*Количество ("price"*"quantity") должны совпадать с суммой по строке ("amount");
3) Итог суммы по строкам ("amount") должен совпадать с суммой оплаты (итог таблицы "payments").

*в скобках названия параметров задания для АТОЛа.
---
Попробуйте обратиться в тех поддержку https://www.atol.ru/contacts/partner/
(1)
---
В общем, проблему решили другим путём: обошлись в итоге без пересчётов.

Если клиент вводит сумму больше - ему падает "лишняя часть" как авансовый платёж. Если оплачивает сумму меньше - как задолженность.

У АТОЛа для этого есть специальный приём: изменяем массив с оплатами. Если оплата прошла больше - разбиваем на 2 части, сколько было нужно и сколько привысило. То, что должно было закрыть проводим с типом оплаты как есть, а то, что сверху проводим авансом - с типом prepaid или 2 - предварительная оплата.

Если меньше - тип credir или 3 - последующая оплата.

В чеке это выглядит примерно так:

(Оплата больше)
<...>
НДС 20/120%
ПЛАТЕЖ/ВЫПЛАТА
АВАНС

ЕД.ИЗМЕРЕНИЯ:Платеж
----------------------------------
ИТОГ =3000.00
----------------------------------
ОПЛАТА
 БЕЗНАЛИЧНЫМИ =3000.00
СНО: ОСН
 СУММА НДС 20% =476.37
 СУММА НДС 20/120% =23.63
КАССИР: Администратор

ПОДПИСЬ:__________________________
       СПАСИБО ЗА ПОКУПКУ!
==================================

(оплата меньше)
<...>
НДС 20%
ТОВАР
ЧАСТИЧНЫЙ РАСЧЕТ И КРЕДИТ
2009700338183
----------------------------------
ИТОГ =2858.20
----------------------------------
ОПЛАТА
 БЕЗНАЛИЧНЫМИ =2500.00
 ПОСЛЕДУЮЩАЯ =358.20
СНО: ОСН
 СУММА НДС 20% =476.37
КАССИР: Администратор

ПОДПИСЬ:__________________________
       СПАСИБО ЗА ПОКУПКУ!
==================================