Смысл подобного списания бонусных баллов УТ 11.5?

У клиента обнаружил странные движения по бонусным баллам в чеках и ОРП — при оплате баллами делается расход по «Начислено» и на такую же сумму расход по «К списанию».

Допустим было начислено 1200, к списанию 1000, остаток баллов получается 200.
Если при оплате 50 баллами УТ делает списание начисленных 50 и списание к списанию 50, получается:
начислено 1150, к списанию 950, остаток 200.

Несмотря на то, что должно быть 150, ведь баллами рассчитались.

Хуже того, остаток «К списанию» так может уйти в минус.

В коде УТ эта ошибка явно видна в тексте запроса:

ВЫБРАТЬ
	ТабличнаяЧасть.ДатаОплаты,
	ДатаВремя(1, 1, 1),
	ВЫБОР
		КОГДА НАЧАЛОПЕРИОДА(ТабличнаяЧасть.ДатаОплаты, ДЕНЬ) >= НАЧАЛОПЕРИОДА(&ДатаНачалаРаботыМеханизмаБонусныхБаллов_2_5,
			ДЕНЬ)
			ТОГДА &ТекущаяДата
		ИНАЧЕ ДАТАВРЕМЯ(1, 1, 1)
	КОНЕЦ,
	ВЫБОР
		КОГДА ТабличнаяЧасть.СуммаБонусныхБаллов > 0
			ТОГДА ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход)
		ИНАЧЕ ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
	КОНЕЦ,
	ТабличнаяЧасть.Партнер,
	ТабличнаяЧасть.БонуснаяПрограммаЛояльности,
	ВЫБОР
		КОГДА ТабличнаяЧасть.СуммаБонусныхБаллов > 0
			ТОГДА ТабличнаяЧасть.СуммаБонусныхБаллов
		ИНАЧЕ -ТабличнаяЧасть.СуммаБонусныхБаллов
	КОНЕЦ,
	ВЫБОР
		КОГДА НАЧАЛОПЕРИОДА(ТабличнаяЧасть.ДатаОплаты, ДЕНЬ) >= НАЧАЛОПЕРИОДА(&ДатаНачалаРаботыМеханизмаБонусныхБаллов_2_5,
			ДЕНЬ)
			ТОГДА 0
		ИНАЧЕ ВЫБОР
			КОГДА ТабличнаяЧасть.СуммаБонусныхБаллов > 0
				ТОГДА ТабличнаяЧасть.СуммаБонусныхБаллов
			ИНАЧЕ -ТабличнаяЧасть.СуммаБонусныхБаллов
		КОНЕЦ
	КОНЕЦ
ИЗ
	Документ.ОтчетОРозничныхПродажах.ОплатаБонуснымиБаллами КАК ТабличнаяЧасть

Причем по странной воле разработчиков, для бонусов системы 2.5 эта ошибка не воспроизводится.

Решил исправить небольшим расширением.

Расширяем модуль набора записей регистра накопления БонусныеБаллы:


&После("ПередЗаписью")
Процедура ипбб_ПередЗаписью(Отказ, Замещение)
	Вид = Метаданные.НайтиПоТипу(ТипЗнч(ЭтотОбъект.Отбор.Регистратор.Значение)).Имя;
	Если Вид = "ОтчетОРозничныхПродажах" ИЛИ
		Вид = "ЧекККМ" ИЛИ
		Вид = "ЧекККМВозврат" ИЛИ
		Вид = "РеализацияТоваровУслуг" ИЛИ
		Вид = "ВозвратТоваровОтКлиента" Тогда
		
		Для Каждого МЗ ИЗ ЭтотОбъект Цикл
			Если МЗ.ВидДвижения = ВидДвиженияНакопления.Расход И МЗ.Начислено = МЗ.КСписанию И МЗ.КСписанию <> 0 Тогда
				//Убираем непонятное списание
				МЗ.КСписанию = 0;
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;
КонецПроцедуры

В итоге списание баллов осуществляется корректно:

Не понимаю, как даже в такой простой теме разработчики 1С умудрились накосячить.

Среда: УТ 11.5.21.102

fixin

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

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

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

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