Проклятье округления в 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 час.

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *