О чём все коварно забывают при настройке бонусной программы в УТ 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 час исправление.
Спасибо большое за статью!Помогли решить вопрос.
Рад помочь!
Спасибо вам! Это действительно было камнем преткновения, и совсем не очевидно.
да, я бы сказал это «мина замедленного действия».
Добрый день. на УТ 11 с УТ 10 перешли в середине года, соответственно с начала года уже были документы отчеты о розничных продажах. В бонусной программе настроили правила списания бонусных баллов и настроено расписание распределение срочных бонусных баллов. Вопрос: требуется ли создавать например в ручную документ начисление и списание бонусных баллов за каждый день для корректности или достаточно после создания правила одного документа на текущюю дату?
Я редко занимаюсь этими вопросами, но там есть регламентная задача, которая сама создает списание-начисление бонусов. Разве ее недостаточно? Она и задумана, чтобы руками каждый день не вводить.