Ошибка в бонусной системе в типовой УТ11
При проведении нескольких розничных возвратов по одному клиенту по одному отчету о розничных продажах расчет бонусных баллов в типовой конфигурации выполняется некорректно. В данной статье рассмотрено исправление этой ошибки.
- Описание
- Подробнее
Описание
Обнаружили вот такую не очень приятную ошибку в бонусной системе УТ11: при оформлении нескольких возвратов по одному клиенту по одному сменному отчету бонусные баллы не списываются, а добавляются.
Создадим бонусную программу лояльности:

Создадим вид карт лояльности:

Создадим вид скидки бонусом для нашего вида карт лояльности:

Сделаем разовое начисление баллов

Теперь оформим продажу — Чек ККМ на какую-либо позицию в количестве 2-х штук, и закроем смену

Посмотрим остатки бонусных баллов:

Теперь проведем последовательно два документа возврата:

После проведения возвратов остаток бонусных баллов должен вернуться в исходное состояние, но не тут-то было:

Две ошибки содержатся в процедуре ЗаполнитьБонусныеБаллыВозвратТоваровОтКлиента модуля БонусныеБаллыСервер.
Во-первых, в запросе к оплатам бонусными баллами — при учете уже выполненных возвратов — разработчики учитывают их со знаком "-":
| ТаблицаБонусныеБаллы.БонуснаяПрограммаЛояльности,
| ТаблицаБонусныеБаллы.ДатаОплаты,
| -ТаблицаБонусныеБаллы.СуммаБонусныхБаллов
| ИЗ
| Документ.ВозвратТоваровОтКлиента.ОплатаБонуснымиБаллами КАК ТаблицаБонусныеБаллыХотя по смыслу вот этого участка кода в запросе надо брать со знаком "+":
НоваяСтрока = ТекущийОбъект.ОплатаБонуснымиБаллами.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаТЧ, "БонуснаяПрограммаЛояльности, ДатаОплаты");
НоваяСтрока.СуммаБонусныхБаллов = -КСписанию;Во-вторых, для пропорционального распределения возвращаемых бонусных баллов неправильно берется база распределения — берутся все товары из отчета о розничных продажах, а надо за вычетом уже сделанных возвратов.
В итоге правильный запрос должен выглядеть так:
