О чём все коварно забывают при настройке бонусной программы в УТ 11.5?

Столкнулся с ошибкой у клиента. Он жаловался, что клиент покупает, покупает, а бонусы ему не начисляются.

К сожалению, в УТ 11.5 нет отчета по накоплению бонусов, можно посмотреть только в регистре «Бонусные баллы» по ссылке e1cib/list/РегистрНакопления.БонусныеБаллы

Причем нужно сортировать по колонке «Регистратор», т.к. документ делает движение и на будущие даты (списание бонусов):

Универсальный отчет выглядит так:

И вот тут вскрылась серьезная ошибка настройки системы учета бонусных баллов.

Дело в том, что за каждый день 1С делает регламентно начисления и списания бонусных баллов:

Журнал документов куцый, сюда бы вывести правило начисления…

И если правило начисления бонусов всегда описывают — ведь без него не будет работать начисление, то правило списания описать забывают:

А его надо описывать, вот в таком виде, причем включить списание по расписанию:

Возникает вопрос — а зачем? Ведь начисления бонусов и так начисляют бонусы на текущую дату и списывают их датой окончания.

Приведу пример:

1 января 2023 клиенту начислили 100 бонусов.

1 марта 2023 клиент использовал 20 бонусов, у него осталось 80 бонусов.

1 января 2024 клиенту списали 100 бонусов, действующих на год. И у клиента осталось -20 бонусов вместо 80.

Так произошло потому что не были закрыты остатки баллов к списанию. Получилось, что у всех клиентов занижены остатки баллов.

Когда я уже начал искать обсуждения об этой ошибке, встретил только одно обсуждение на Инфостарте. Да и то без решения.

Даже инструкции по настройке бонусной программы не содержат описания настройки списания бонусных баллов, например на 42-cloud.

Исправление ситуации

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

Начисление производится из регламентного задания АвтоматическоеНачислениеИСписаниеБонусныхБаллов:, используется вызов:

БонусныеБаллыСервер.ВыполнитьАвтоматическоеНачислениеИСписание(ПравилоНачисления);

Эту процедуру нужно целиком с небольшими правками добавить в форму обработки, т.к. ее нельзя вызвать за произвольную дату.

Далее по регистру «Бонусные баллы» находим первый документ, который делал движения, у меня это 15 марта 2023:

Предварительно формируем и сохраняем отчет «Бонусные баллы» на начало сегодняшнего дня, чтобы понимать, как изменились бонусы.

И запускаем формирование документов списания с этой даты:

Код обработки:


&НаСервере
Процедура СоздатьДокументыНаСервере()
	Д = Объект.Дата1;
	Пока Д <= Объект.Дата2 Цикл
		Сообщить("Обрабатываем дату: " + Д);
		ВыполнитьАвтоматическоеНачислениеИСписание(Объект.Правило, Д);
		Д = Д + 3600*24;
	КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура СоздатьДокументы(Команда)
	СоздатьДокументыНаСервере();
КонецПроцедуры


Процедура ВыполнитьАвтоматическоеНачислениеИСписание(ПравилоНачисления, ДатаНачисления) Экспорт
	
	//ДатаНачисления = ТекущаяДатаСеанса();  
	
	//Осипов. Ниже скопировано из процедуры БонусныеБаллыСервер.ВыполнитьАвтоматическоеНачислениеИСписание
	
	//ТаблицаНачислениеИСписание = ТаблицаНачислениеИСписание(ПравилоНачисления, ДатаНачисления);
	ТаблицаНачислениеИСписание = БонусныеБаллыСервер.ТаблицаНачислениеИСписание(ПравилоНачисления, ДатаНачисления); //Осипов

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

Период обработался практически за минуту, очень быстро, протокол:

Документы были созданы и заполнены за каждый день:

Но результат меня удивил. Баллы не поменялись.

При этом остатки закрывались не корректно. Вот пример, где оставалось 244 балла и они прошли в расход и по «К списанию» и по «Начислено», хотя при оплате баллами тоже происходит расход по «Начислено»:

По уму, 1С должна была бы делать расход по 4.10 по «Начислено», тогда бы начисления ушли в ноль. Но у нее в документе «Начисление и списание бонусных баллов» только одна колонка «Баллы» для хранения списываемых балов. Получается, нужно списывать отдельным документом колонку «Начислено», отдельным «К списанию».

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

UPD 2024-05-30: мне подсказали, что нужно использовать регламентное задание «Распределение срочных бонусных баллов», настроил его клиенту:

После этого баллы клиенту корректно пересчитались, выделил красным где они не уходят в минус:

В принцип работы регламентного задания не вдавался. Клиент хотел типовое решение — я ему его нашел. Не знаю, устойчив ли этот метод к перероведениям. Судя по результатам, он меняет движения по ОРП на будущие даты. Т.к. в реквизитах движений не содержатся исходные суммы, то в случае изменения ОРП могут быть сбои. Хотя если ОРП меняется, он перепроводится, возвращая начальные проводки. Но ведь ОРП могут быть изменены косвенно. В общем, думаю, решение от 1С костыльное и кривое, но учитывая, что ОРП меняются редко, может иметь место. По крайней мере для клиентов, которые не хотят вкладываться в более надежные решения.

Среда: 11.5.12.222. Объем: 1.5 час диагностика, 1 час исправление.

fixin

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

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

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

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