В типовой конфигурации «1С:Управление торговлей 10.3» механизм автоматических скидок включает функционал накопительных скидок. Однако классическая бонусная программа работает по другому принципу: при покупке скидка сразу не предоставляется, клиенту начисляются баллы на карту, которые можно потратить на последующие покупки, при этом баллы имеют ограниченный срок жизни (сгорают через определенное время). Рассмотрим архитектуру и пошаговый процесс реализации такой подсистемы собственными силами.
Для корректного отслеживания баланса баллов и их срока действия типового справочника накопительных скидок недостаточно. Разберем структуру новых объектов метаданных, которые потребуется добавить в конфигурацию:
ИнформационныеКарты или создаем отдельный реквизит/перечисление для разделения типов карт (например, «Дисконтная» и «Бонусная»).Измерения регистра:
ИнформационнаяКарта (или Контрагент) — владелец бонусов;ДатаСгорания (тип Дата) или ПартияНачисления (тип ДокументСсылка) — измерение, необходимое для партионного учета и реализации списания баллов по методу FIFO (в первую очередь должны расходоваться те бонусы, у которых быстрее истекает срок действия).Ресурсы регистра:
СуммаБонусов (тип Число, точность 2) — количество активных баллов.Проанализируем процесс начисления бонусов при проведении документа РеализацияТоваровУслуг. Начисление можно реализовать непосредственно в модуле проведения документа либо через механизм подписок на события (ОбработкаПроведения).
Пример алгоритма расчета даты сгорания и формирования приходного движения:
// В процедуре проведения документа РеализацияТоваровУслуг
Если ЗначениеЗаполнено(ДисконтнаяКарта) И ДисконтнаяКарта.ТипКарты = Перечисления.ТипыКарт.Бонусная Тогда
// Рассчитываем сумму бонусов по установленному проценту
ПроцентБонуса = 5; // Значение берется из регистра правил
СрокДействияДней = 30;
СуммаНачисления = Окр(СуммаДокумента * (ПроцентБонуса / 100), 2);
ДатаОкончанияДействия = КонецДня(Дата + СрокДействияДней * 86400);
Движение = Движения.БонусныеБаллы.ДобавитьПриход();
Движение.Период = Дата;
Движение.ИнформационнаяКарта = ДисконтнаяКарта;
Движение.ДатаСгорания = ДатаОкончанияДействия;
Движение.СуммаБонусов = СуммаНачисления;
КонецЕсли;
Частая методическая ошибка — попытка отразить оплату бонусами через кассовые документы (ПриходныйКассовыйОрдер). Делать этого нельзя, так как оформление ПКО на бонусные баллы приведет к появлению фиктивной наличной выручки, расхождению фактической кассы и искажению взаиморасчетов по регистру ВзаиморасчетыСКонтрагентами.
Правильный подход заключается в следующем:
РеализацияТоваровУслуг пользователь указывает сумму списываемых баллов. Эта сумма автоматически распределяется по строкам табличной части «Товары» в колонку скидки (или уменьшает цену позиций).БонусныеБаллы методом FIFO по доступным остаткам, у которых ДатаСгорания больше даты текущего документа.Рассмотрим, как реализовать автоматическое аннулирование неиспользованных баллов по истечении их срока годности:
СписаниеБонусныхБаллов или процедуру в общем модуле, выполняющую прямую запись в регистр.БонусныеБаллы с фильтром по дате сгорания:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| БонусныеБаллыОстатки.ИнформационнаяКарта КАК ИнформационнаяКарта,
| БонусныеБаллыОстатки.ДатаСгорания КАК ДатаСгорания,
| БонусныеБаллыОстатки.СуммаБонусовОстаток КАК СуммаБонусов
|ИЗ
| РегистрНакопления.БонусныеБаллы.Остатки(&ТекущаяДата, ДатаСгорания < &ТекущаяДата) КАК БонусныеБаллыОстатки";
Запрос.УстановитьПараметр("ТекущаяДата", НачалоДня(ТекущаяДата()));
Результат = Запрос.Выполнить().Выгрузить();
Если Результат.Количество() > 0 Тогда
НаборЗаписей = РегистрыНакопления.БонусныеБаллы.СоздатьНаборЗаписей();
Для Каждого Стр Из Результат Цикл
Движение = НаборЗаписей.ДобавитьРасход();
Движение.Период = ТекущаяДата();
Движение.ИнформационнаяКарта = Стр.ИнформационнаяКарта;
Движение.ДатаСгорания = Стр.ДатаСгорания;
Движение.СуммаБонусов = Стр.СуммаБонусов;
КонецЦикла;
НаборЗаписей.Записать(Ложь);
КонецЕсли;
При внедрении бонусной подсистемы важно учесть сопутствующие бизнес-процессы:
ВозвратТоваровОтПокупателя необходимо сторнировать баллы, начисленные за исходную покупку, а также восстановить списанные клиентом бонусы обратно на карту.ДатаАктивации).