Проклятье округления в Paykeeper
Столкнулся с тем, что при отправке счета в Paykeeper согласно API если передавать из 1С цену без скидки, то Paykeeper выдает клиенту ошибку при оплате счёта:
Невозможно создать платёж: сумма всех переданных позиций в корзине заказа не равна полной сумме операции.Видно, что причина в том, что цена передается без скидки, а сумма — со скидкой:
Причем, обидно, что ошибка выдается уже когда счет дойдет до клиента, а не на этапе отправки заказа клиенту.
Можно передавать цену со скидкой, но здесь сталкиваемся с округлением. Смоделировал ситуацию, когда цена после скидки равна 333.3333(3):
Увы, стандарт передачи корзины товаров в Paykeeper не допускает использования поля скидки:
Доработал контроль сумм перед отправкой:
//Проверяем корректность сумм, чтобы можно было определить цену со скидкой Для Каждого Строка ИЗ ТаблицаСчета Цикл //Цену округляем до двух РасчЦена = Окр(?(Строка.Количество = 0, 0, Строка.Всего / Строка.Количество), 2); РасчВсего = РасчЦена * Строка.Количество; Если РасчВсего <> Строка.Всего Тогда ЗавершеноСОшибками = истина; Сообщить("Для товара: " + Строка.Номенклатура + " не сходится сумма: " + Строка.Всего + " и расчетная сумма: " + РасчВсего + " по расчетной цене: " + РасчЦена + " по кол-ву: " + Строка.Количество); Иначе Строка.Цена = РасчЦена; КонецЕсли; КонецЦикла;
До отправки в Paykeeper будет выдана ошибка на стороне 1С:
Для товара: Услуги СДЕК не сходится сумма: 1 000 и расчетная сумма: 999,99 по расчетной цене: 333,33 по кол-ву: 3
Клиент торгует штучным товаром, такие случаи будут редки. Если бы речь шла о другой отрасли, пришлось бы работать над округлением цен в заказе.
Среда: УНФ 3.0.5.145. Объем: 1 час.
Свежие комментарии