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

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

В типовой конфигурации «1С:Управление торговлей 10.3» механизм автоматических скидок включает функционал накопительных скидок. Однако классическая бонусная программа работает по другому принципу: при покупке скидка сразу не предоставляется, клиенту начисляются баллы на карту, которые можно потратить на последующие покупки, при этом баллы имеют ограниченный срок жизни (сгорают через определенное время). Рассмотрим архитектуру и пошаговый процесс реализации такой подсистемы собственными силами.

1. Архитектура хранения данных и партионный учет бонусов

Для корректного отслеживания баланса баллов и их срока действия типового справочника накопительных скидок недостаточно. Разберем структуру новых объектов метаданных, которые потребуется добавить в конфигурацию:

  1. Справочник карт: используем существующий справочник ИнформационныеКарты или создаем отдельный реквизит/перечисление для разделения типов карт (например, «Дисконтная» и «Бонусная»).
  2. Регистр накопления «БонусныеБаллы»: создаем регистр остатков.

    Измерения регистра:

    1. ИнформационнаяКарта (или Контрагент) — владелец бонусов;
    2. ДатаСгорания (тип Дата) или ПартияНачисления (тип ДокументСсылка) — измерение, необходимое для партионного учета и реализации списания баллов по методу FIFO (в первую очередь должны расходоваться те бонусы, у которых быстрее истекает срок действия).

    Ресурсы регистра:

    1. СуммаБонусов (тип Число, точность 2) — количество активных баллов.
  3. Документ «УстановкаУсловийНачисленияБонусов»: периодический регистр сведений или отдельный документ, где фиксируются правила: процент начисления от суммы покупки, срок действия баллов в днях, а также ограничения на максимальный процент списания.

2. Начисление баллов при проведении документов

Проанализируем процесс начисления бонусов при проведении документа РеализацияТоваровУслуг. Начисление можно реализовать непосредственно в модуле проведения документа либо через механизм подписок на события (ОбработкаПроведения).

Пример алгоритма расчета даты сгорания и формирования приходного движения:


// В процедуре проведения документа РеализацияТоваровУслуг
Если ЗначениеЗаполнено(ДисконтнаяКарта) И ДисконтнаяКарта.ТипКарты = Перечисления.ТипыКарт.Бонусная Тогда
    
    // Рассчитываем сумму бонусов по установленному проценту
    ПроцентБонуса = 5; // Значение берется из регистра правил
    СрокДействияДней = 30;
    
    СуммаНачисления = Окр(СуммаДокумента * (ПроцентБонуса / 100), 2);
    ДатаОкончанияДействия = КонецДня(Дата + СрокДействияДней * 86400);
    
    Движение = Движения.БонусныеБаллы.ДобавитьПриход();
    Движение.Период = Дата;
    Движение.ИнформационнаяКарта = ДисконтнаяКарта;
    Движение.ДатаСгорания = ДатаОкончанияДействия;
    Движение.СуммаБонусов = СуммаНачисления;
    
КонецЕсли;

3. Методология списания бонусов при оптовой схеме (РТУ + ПКО)

Частая методическая ошибка — попытка отразить оплату бонусами через кассовые документы (ПриходныйКассовыйОрдер). Делать этого нельзя, так как оформление ПКО на бонусные баллы приведет к появлению фиктивной наличной выручки, расхождению фактической кассы и искажению взаиморасчетов по регистру ВзаиморасчетыСКонтрагентами.

Правильный подход заключается в следующем:

  1. Бонусы списываются как скидка: при оформлении документа РеализацияТоваровУслуг пользователь указывает сумму списываемых баллов. Эта сумма автоматически распределяется по строкам табличной части «Товары» в колонку скидки (или уменьшает цену позиций).
  2. Оплата фактической суммы: долг контрагента формируется уже за вычетом предоставленной бонусной скидки, и кассовый чек (ПКО) пробивается строго на фактически внесенные наличные денежные средства.
  3. Расход по регистру бонусов: при проведении документа формируются расходные движения по регистру БонусныеБаллы методом FIFO по доступным остаткам, у которых ДатаСгорания больше даты текущего документа.

4. Механизм автоматического сгорания бонусов

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

  1. Создаем документ СписаниеБонусныхБаллов или процедуру в общем модуле, выполняющую прямую запись в регистр.
  2. Настраиваем Регламентное задание, запускаемое по расписанию (например, ежедневно в полночь).
  3. В фоновом задании выполняем запрос к остаткам регистра БонусныеБаллы с фильтром по дате сгорания:

Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	БонусныеБаллыОстатки.ИнформационнаяКарта КАК ИнформационнаяКарта,
    |	БонусныеБаллыОстатки.ДатаСгорания КАК ДатаСгорания,
    |	БонусныеБаллыОстатки.СуммаБонусовОстаток КАК СуммаБонусов
    |ИЗ
    |	РегистрНакопления.БонусныеБаллы.Остатки(&ТекущаяДата, ДатаСгорания < &ТекущаяДата) КАК БонусныеБаллыОстатки";

Запрос.УстановитьПараметр("ТекущаяДата", НачалоДня(ТекущаяДата()));
Результат = Запрос.Выполнить().Выгрузить();

Если Результат.Количество() > 0 Тогда
    НаборЗаписей = РегистрыНакопления.БонусныеБаллы.СоздатьНаборЗаписей();
    Для Каждого Стр Из Результат Цикл
        Движение = НаборЗаписей.ДобавитьРасход();
        Движение.Период = ТекущаяДата();
        Движение.ИнформационнаяКарта = Стр.ИнформационнаяКарта;
        Движение.ДатаСгорания = Стр.ДатаСгорания;
        Движение.СуммаБонусов = Стр.СуммаБонусов;
    КонецЦикла;
    НаборЗаписей.Записать(Ложь);
КонецЕсли;

5. Обработка возвратов товаров и ограничений

При внедрении бонусной подсистемы важно учесть сопутствующие бизнес-процессы:

  1. Возврат товаров: при проведении документа ВозвратТоваровОтПокупателя необходимо сторнировать баллы, начисленные за исходную покупку, а также восстановить списанные клиентом бонусы обратно на карту.
  2. Ограничения по сумме оплаты: добавьте проверку, чтобы бонусами нельзя было оплатить более определенного процента от стоимости чека (например, не более 30% или 50%), а также запрет на применение бонусов к товарам из специальных ценовых групп (акционные и уцененные позиции).
  3. Отложенная активация: если в правилах компании предусмотрена возможность возврата товара в течение 14 дней, начисленные баллы можно делать доступными к списанию только по истечении этого срока (путем введения дополнительного поля ДатаАктивации).
← На главную