Бонусная система. Разработка, внедрение

28.03.24

Задачи пользователя - Адаптация типовых решений

Задача: необходимо запрограммировать механизм начисления бонусов не в день покупки товаров, а только по истечении 14 дней.

Демонстрируются концепция и идеи по разработке подсистемы учета бонусов. Реализовано было на конфигурации Управление торговлей 10.3. Используется до сих пор - на момент обновления публикации Март 2024г.

* * *

Исследования - выводы

Экономистами и маркетологами проводились исследования. Были сделаны выводы. До проведения исследований и получения статистических результатов было непонятно, а теперь это кажется очевидным. Что существуют товары, которые не станут покупать в рознице впрок ни за какие скидки, но купят, не взглянув на цену, при первой необходимости.

Например: автозапчасти, стройматериалы, скоропортящаяся продукция, детское питание. Однако магазины зачастую необдуманно ставят скидки на такие товары и теряют прибыль.

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

Придет покупатель во второй раз и затем в третий раз - вопрос спорный и открытый.

Потенциальные риски бонусной системы

Внедряете ли вы бонусную систему? Внедряете ли вы собственный блок в типовые программы 1С или интегрируете 1С со сторонними системами учета бонусов? 

Мне посчастливилось в начале 2020 года разрабатывать подсистему учета бонусов "с нуля". Процесс был долгим, поскольку подобного опыта у меня не было, аналогов среди "Большой семёрки конфигураций" не было (УТ 10.3, УТ 11, УНФ, БП 3.0, ЗУП, КА 2.4, Розница), очевидных приемов учета не было.

Адаптация типовых механизмов, когда бонусы начисляются в день покупки товара - очевидна. Заводим новые регистры накопления для учета остатков и оборотов бонусов (начисления, списания, сторно при возвратах), прописываем алгоритмы проведения документов продаж/возвратов, разрабатываем формы и поля (пользовательский интерфейс).

Так и было сделано на первоначальном этапе, но на приемке-сдачи была смоделирована ситуация, когда покупатель приобретал товаров на 100 тыс. руб., вместо скидки в 5% получает бонусы в размере 5 тыс. руб. На второй день покупает товар на 5 тыс. руб. за счет бонусов. А на третий день - возвращает товар, купленный в первый день - и возвращает себе 100 тыс. руб.

Магазин остается в убытке...

Что-то подобное случилось со мной в строительном магазине НазваниеСкрыто. Когда они раздавали сертификаты на покупку от 10 тыс. руб. - скидка 1 тыс. руб., на покупку от 20 тыс. руб. - скидка 2 тыс. руб. и т.д. Я тогда закупился ровно на 20 тыс. руб., мне сделали скидку по сертификату на 2 тыс. руб. А через неделю ремонта у меня остался какой-то товар, я его отвез на возврат. Мне вернули деньги за возвращенный товар около 1800 руб., при этом скидку по сертификату в размере 2 тыс. руб. никто не отменил.  

Не скажу, что так было задумано специально, но в тот момент я увидел "финансовый пробел" в системе лояльности данной сети.

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

Потоварный учет бонусов

Я в течение года думал, как реализовать учет бонусов, когда начисление происходит через 14 дней после покупки товаров. Почему именно 14 дней? Потому что у магазина возникает право не возвращать деньги и не забирать товар у покупателя.

Находил на Инфостарте статьи о внедрении бонусной системы для категорий товаров, по которым возврат товаров изначально запрещен: лекарства, нижнее белье, к примеру. Но это не подходило мне.

Также сложность задаче придавал тот факт, что на ряд товаров исторически скидка была 5%, на другие товары скидок не предоставлялось совсем. И когда в чек попадали товары из разных категорий, надо было скидку на каждый товар перевести в начисляемые бонусы один к одному. То есть на ряд товаров бонусы не начисляются, а на остальные начисляются исходя из исторически существующей системы скидок.

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

При списании бонусов (условно говоря 100 бонусов, 1 бонус = 1 рубль) итоговая скидка должна распределяться согласно суммам по товарам в чеке - см. Листинг 1. Тут есть и решение "проблемы копеек", которая возникает в задачах распределения бонусов, НДС, списания себестоимости по ФИФО.

 
 Листинг 1. Распределение бонусов при продаже товаров
Процедура ИтогоСписаноПриИзменении(Элемент)
	
	Если НЕ глЗначениеПеременной("БонуснаяСистемаАктивна") 
		ИЛИ НЕ ЗначениеЗаполнено(ДисконтнаяКарта) Тогда
		Возврат;  //ничего не считаем
	КонецЕсли;
	
	ОбщаяСуммаЧека = Товары.Итог("Сумма");  //без скидок и до распределения бонусов

	Если Товары.Количество() = 0 ИЛИ ОбщаяСуммаЧека = 0 Тогда
		Возврат;
	КонецЕсли;
	
	Если ИтогоСписано>0 Тогда
		МожноСписать = МодульДоработок.ПолучитьОстатокБонусовПоДК(ДисконтнаяКарта);
		Если МожноСписать < ИтогоСписано Тогда
			Сообщить("Нельзя списать бонусов больше, чем накоплено");
			ИтогоСписано = МожноСписать;
		КонецЕсли;
	КонецЕсли;
	 	
	Если ОбщаяСуммаЧека>0 И ИтогоСписано>0 И ОбщаяСуммаЧека <= ИтогоСписано Тогда
		Сообщить("Нельзя списать бонусов больше или равное, чем сумма чека");
		ИтогоСписано = ОбщаяСуммаЧека - 1;
	КонецЕсли;
	
	//дополнительная проверка: сумма с учетом бонусов не должна быть меньше 1 рубля!!! 
	Для Каждого Стр Из Товары Цикл 			
		
		Если ИтогоСписано = 0 Тогда
			СуммаСБонусами = Стр.Сумма;
		Иначе
			СуммаСБонусами = Стр.Сумма - Стр.Сумма * ИтогоСписано / ОбщаяСуммаЧека;
		КонецЕсли;
		
		Если СуммаСБонусами<1 Тогда
			Сообщить("Превышено возможное списание бонусов:" + Символы.ПС +" по товару " + Стр.Номенклатура + " сумма с учетом бонусов стала меньше 1 рубля." + Символы.ПС + "Укажите меньшее списание бонусов");
			Возврат;
		КонецЕсли;
		
	КонецЦикла;

	//распределим бонусы по строкам товаров
	МаксСумма = 0; НомерСтр = 0; СуммаСписания = 0;
	Для Каждого Стр Из Товары Цикл 		
		
		Если ИтогоСписано = 0 Тогда
			Стр.БонусыСписано = 0;
		Иначе
			Стр.БонусыСписано = Стр.Сумма * ИтогоСписано / ОбщаяСуммаЧека;
		КонецЕсли;
		
		СуммаСписания = СуммаСписания + Стр.БонусыСписано; 
		Если Стр.Сумма > МаксСумма Тогда
			МакСумма = Стр.Сумма;  //ищем макс. сумму
			НомерСтр = Стр.НомерСтроки;
		КонецЕсли;
		Стр.СуммаСБонусами = Стр.Сумма - Стр.БонусыСписано;
		
	КонецЦикла;
	
	Разница = СуммаСписания - ИтогоСписано;
	Если Разница <> 0 Тогда  //посадим разницу на самую большую сумму
		Стр = Товары.Получить(НомерСтр-1);
		Стр.БонусыСписано = Стр.БонусыСписано - Разница;
  	    Стр.СуммаСБонусами = Стр.Сумма - Стр.БонусыСписано;
	КонецЕсли;
	
КонецПроцедуры

 

 

 

Учет бонусов по товарам подразумевает ведение учета по каждому товару двух показателей: "Начислено" и "Списано" (рис. выше).

Начисление рассчитывается согласно имеющейся скидке 5% (исходя из соответствующей категории). Списание бонусов рассчитывается согласно распределению по суммам в чеке.

Добавьте сюда сценарии "Продажи" и "Возврата" по чеку, и у вас уже 4 разных сценария проведения документов. Добавьте еще учет периода в 14 дней, и у вас уже 8 сценариев проведения.

Добавьте еще два вида документов при возвратах: это Чек ККМ на возврат в открытой смене и Возврат товаров от покупателя в закрытой смене, и у вас уже 16 сценариев проведения документов по регистрам накопления, связанных с бонусами.

Первая модель бонусной системы

Анализ исходной модели рабочей базы Управление торговлей 10.3 выявил следующее.

Бонусы начисляются сразу при пробитии и проведении документов Чек ККМ. При  закрытии смены документы Чек ККМ удаляются из системы, информация по чекам переносится в документы Архив Чеков ККМ, которые не имеют проводок и движений по регистрам. Документ используется только для хранения информации: кто, что и когда купил, какую скидку получил – для расследования спорных ситуаций.

Для сохранения информации о начисленных и списанных бонусах был реализован документ ЧекККМ_Бонусы.

Он создается при закрытии смены для каждого документа Чек ККМ, делает движения по регистрам накопления бонусов: БонусыПоДискКартам, БонусыОбороты, БонусыПоТоварам, аналогичные регистрам ПродажиПоДискКартам, ПродажиОбороты, ПродажиПоТоварам для документов ЧекККМ.

Документ ОтчетОРозничныхПродажах движений по бонусам не делает, но делает свои типовые движения по товарным и другим регистрам. Также данный документ хранит и показывает общие итоговые суммы начисленных и списанных бонусов за смену.

Документ Возврат товаров от покупателя делает движения по регистрам бонусов, поскольку связан с ЧекомККМ_Бонусы: начисляет сторно "списанные бонусы" и списывает сторно "начисленные бонусы".

Вторая модель бонусной системы: что было сделано

Сперва была протестирована модель - при которой бонусы начисляются  через 14 дней с помощью вспомогательного документа ЧекККМ_Бонусы. Данный документ уже существует в системе доработок бонусов в качестве документа, который хранит информацию о пробитых чеках, купленных товарах, начисленных и списанных бонусах.

Данный документ делает движения по регистрам бонусов. Поэтому необходимо проанализировать на возможность проведения документов через 14 дней после создания.

Данная модель использует закрытие смены для создания документа ЧекККМ_Бонусы, но не проводит его. Таким образом начисления бонусов за товары не производятся день-в-день.

Каждый день при закрытии смены система программно анализирует и проводит:

  1. списание бонусов по дисконтным картам – списание происходит день-в-день согласно информации по документу ЧекуККМ_Бонусы.
  2. начисление бонусов - должна быть проверка на 14 дней со дня создания документа ЧекККМ_Бонусы.

Сложности возникают при учете возвратов.

При возвратах:

  •  в открытой смене – создается документ ЧекККМ на возврат. Соответственно при закрытии смены создается документ ЧекККМ_Бонусы (на возврат), при этом будет создано два документа – ЧекККМ_Бонусы (продажа) и ЧекККМ_Бонусы (на возврат). Требуется дополнительный анализ, по какому товару сколько в итоге начислять бонусов через 14 дней. Плюс надо постоянно следить за связкой этих документов.
  • в закрытой смене – создается документ Возврат товаров от покупателя на основании документа ЧекККМ_Бонусы. При этом возврат бонусов должен происходить или документом Возврат товаров от покупателя или новым документом ЧекККМ_Бонусы, который должен создаваться на основании Возврата товара от покупателя.

В обоих случаях анализ еще одного типа документа и связки Возврат товаров от покупателя + ЧекККМ_Бонусы увеличивает сложность механизма в несколько раз:

  1. нужно уметь распознавать и отличать случай, когда возврат товаров происходит в периоде 14 дней – до начисления бонусов – должен сработать один алгоритм возврата бонусов.
  2. нужно уметь распознавать и отличать случай, когда возврат товаров происходит после периода в 14 дней, когда бонусы на товар начислены на дисконтную карту, и надо начисленные бонусы списать при возвратах, а списанные бонусы наоборот восстановить в остатках по диск. карте – применить так называемый сторно.  

При такой схеме работы опасна ситуация, когда Возврат товаров от покупателя распроводится или проводится задним числом. Связанный ЧекККМ_Бонусы необходимо также распровести или учесть задним числом. При этом всегда надо контролировать в каком периоде с даты покупки находится документ: прошло 14 дней или нет.

Данная модель - как первая пришедшая в голову модель - имела место быть, но схема учета бонусов напоминала очень запутанную взаимосвязь документов и учетных механизмов. Опыт подсказывал, что программировать такую модель (архитектуру) не нужно. Был взято дополнительное время на обдумывание модели.

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

Через несколько дней появилась идея другой схемы учета бонусов, и в анализ и разработку была запущена третья модель – при которой за начисление и списание бонусов отвечают отдельные документы БлокировкаБонусов и РазблокировкаБонусов - см. рис. 1 и 2.

Остальные документы бонусной системы не должны сильно изменяться и сильно дорабатываться: Возврат товаров от покупателей, ЧекККМ_Бонусы – каждый из них несет свою смысловую нагрузку в общей системе бонусов.

Сама схема напоминает схему резервирования товаров на складах, когда товар покупают по предварительным заказам. При такой схеме остаток товара при проведении заказа не уменьшается, но блокируется (резервируется) для дальнейшей продажи по другим заказам.

Для третьей модели бонусной системы был реализован новый документ "Блокировка и разблокировка бонусов". При закрытии смены создается ЧекККМ_Бонусы  - он делает движения, как в исходной первой модели. В данном случае изначальная модель проведения документа не изменяется.

При этом создается и проводится сразу соответствующий документ «Блокировка бонусов» на сумму начисленных бонусов. Списанные бонусы не блокируются. Документ Блокировка бонусов связан с документом ЧекККМ_Бонусы.

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

То есть, если общий остаток бонусов 200, но на данный момент заблокировано 50 бонусов, это значит что использовать в качестве скидки можно только 150 бонусов - см. Листинг 2.

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

 

 

Через 14 дней (сравнивается дата создания документа Блокировка бонусов с текущей датой) – на каждый документ Блокировка бонусов создается связанный документ Разблокировка бонусов. Таким образом количество заблокированных бонусов уменьшается.

При возвратах:

При возвратах всегда указывается  документ ЧекККМ_Бонусы.

Если с ним связан документ Разблокировка, значит 14 дней уже прошли – значит заблокированных бонусов нет по чеку, и тогда система бонусов просто уменьшает общий остаток бонусов на сумму  возвратов.

Механизм проведения ЧекаККМ_Бонусы изменять не надо. То есть изначальная первая модель бонусной системы претерпевает при такой схеме небольшие адаптации.

Если с ЧекомККМ_Бонусы не связан документ Разблокировка, тогда еще действует режим блокировки 14 дней, внутри периода которого достаточно уменьшить количество заблокированных бонусов. То есть общий остаток бонусов не изменяется, только лишь уменьшается кол-во заблокированных бонусов.

Итоги

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

2. Был проведен анализ "очевидной" второй модели, которая была отклонена на основании интуиции (неосознаваемого опыта). Дальнейшие изыскания показали верность принятого решения.

3. Был проведен анализ "неочевидной" третьей модели, идею для которой я почерпнул из системы резервирования товаров по складам и заказам.

4. Были проведены разработка и тестирование механизмов по архитектуре третьей модели.

5. Было проведено внедрение бонусной системы, обучение пользователей, запуск в промышленную эксплуатацию.

6. Руководством было озвучено желание интегрировать бонусную систему с интернет-магазином. Но в дальнейшем переиграли: при покупках в интернет-магазине бонусы только начисляются, а списываются только при личном посещении магазина (с предъявлением дисконтной карты, на которую начисляются бонусы).

Постскриптум

После разработки бонусной системы я понимаю, почему сторонним сервисам и интернет-платформам легче внедрять учет бонусов для сферы услуг - потому что у них нет возврата товаров и, как следствие, возврата бонусов.

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

* * *

На этом все. Всем добра! С пользой для клиентов, Rustig

бонусная система проблема копеек система лояльности

См. также

Табличная часть в доп. реквизитах и формирование таблиц в шаблоне docx для 1С:ДО 3.0

Адаптация типовых решений Платформа 1С v8.3 1С:Документооборот Россия Платные (руб)

Расширение конфигурации для «1С:Документооборот КОРП», редакция 3.0. позволяет: 1.использовать произвольные табличные части в качестве дополнительных реквизитов к документу; 2 использовать произвольные табличные части в шаблонах в формате docx для автоматического заполнения таблиц.

29400 руб.

29.06.2023    4454    9    4    

18

Расширение для 1С:УНФ. Автоматическое снятие резервов в Заказах покупателей

Логистика, склад и ТМЦ Адаптация типовых решений Платформа 1С v8.3 1С:Управление нашей фирмой 1.6 1С:Управление нашей фирмой 3.0 Россия Управленческий учет Платные (руб)

Чтобы не допустить путаницы с обещаниями клиентам и для четкого контроля исполнения заказов мы используем резервирование товаров. Мы доработали УНФ, чтобы она автоматически отменяла старые резервы и не мешала эффективно продавать.

7200 руб.

02.08.2023    2957    4    0    

19

Создать на основании - своя кнопка (БСП). Проблема двух подменю Создать на основании

БСП (Библиотека стандартных подсистем) Адаптация типовых решений Платформа 1С v8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

Понадобилось в подменю "Создать на основании" добавить свою команду, которая открывает обработку. В процессе доработок появилась проблема двух подменю "Создать на основании". В статье о том, как решились проблемы.

01.03.2024    1302    dimanich70    6    

13

Доработка отчета "Связанные документы" (структура подчиненности) для вывода объектов из любого расширения

Адаптация типовых решений Платформа 1С v8.3 1С:Управление торговлей 11 Россия Абонемент ($m)

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

1 стартмани

27.10.2023    1998    13    avmartynov    10    

43

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2078    21    progmaster    7    

3