Реализация системы скидок

Программирование - Практика программирования

В торговле имеет большое значение система скидок, чем больше типов скидок, тем более вероятность покупки, также можно мотивировать покупателя покупать не 1 вещь. Думаю, информация будет полезной, так как мне нужно было срочно внедрить, а материала не так много в сети, потому хочу поделиться опытом внедрения системы скидок в торговлю. Систему внедрял на УТ 10.3.41.1.

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

Скидка по типу цен

Есть в типовом механизме документа установка скидок "Количество одного товара в документе превысило", механизм представляет собой, если в поле указать кол-во товара 3, то на каждый товар будет скидка, указанная в поле процент. Возникла необходимость, чтобы был не процент скидки, а конкретная сумма.

Для реализации необходимо добавить поле в документе "Установка скидок номенклатуры", в котором и будет критерий (в моем случае видов скидок 4, потому создан справочник и справочник привязан к критериям скидки). В критерии мы указываем, что будет действовать специальная цена (Справочник "Тип Цен", создаем свой, чтобы не был связан с точкой). Далее заполняем документ "Установка скидок номенклатуры" все необходимые поля в типовом механизме.

После заходим в "Установка цен номенклатуры", создаем документ с типом цен, который заполнен в новом критерии. Выставляем цены с учетом скидки, проводим, готово.

Вот код для  "Общие модули - ОбработкаТабличныхЧастей" Процедура РассчитатьСкидкиПриПродаже

//Определение специальных цен для скидки

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

//Расчет скидки

СтрТЗСпецЦены = ТЗСпецЦены.Найти(СтрокаТЧ.Номенклатура, "Номенклатура");
            Если СтрТЗСпецЦены <> Неопределено Тогда
                СтрокаТЧ.Сумма = СтрокаТЧ.Количество * СтрТЗСпецЦены.Цена;
                СтрокаТЧ.ПроцентАвтоматическихСкидок = Окр(((СтрокаТЧ.СуммаБезСкидки - СтрокаТЧ.Сумма) / СтрокаТЧ.СуммаБезСкидки) * 100, 2);
            КонецЕсли;

Скидка на товар кратный условию

Рассмотрим скидку, если купили 2 позиции, то 3 по скидке, 4 снова за полную стоимость (в варианте 1, после выполнения условия, например купили 2 позиции, то на 3,4,5 и т д. уже будет действовать скидка), то есть скидка действует только каждой 3 позиции. Работает абсолютно так же как и первая позиция, только добавляется еще 1 свой критерий ( тип цен, кратность), в первом варианте только тип цен.

Вот код для расчета по кратности

Для Каждого ТекРасчетСкидки Из СтруктМасРасчета["СкидкаПоТипуЦен_КратностьКолТовара"] Цикл
        
        //Определение специальных цен для скидки
        ЗапросЦен = Новый Запрос;
        ЗапросЦен.Текст =
        "ВЫБРАТЬ РАЗРЕШЕННЫЕ
        |    ЦеныНоменклатурыСрезПоследних.Номенклатура,
        |    ЦеныНоменклатурыСрезПоследних.Цена
        |ИЗ
        |    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
        |            &ОтборДата,
        |            ТипЦен = &ОтборТипЦен
        |                И Номенклатура В (&ОтборНоменклатура)) КАК ЦеныНоменклатурыСрезПоследних";
        ЗапросЦен.УстановитьПараметр("ОтборДата", КонецДня(ДокументОбъект.Дата));
        ЗапросЦен.УстановитьПараметр("ОтборТипЦен", ТекРасчетСкидки.СкидкаПоТипуЦен);
        ЗапросЦен.УстановитьПараметр("ОтборНоменклатура", ТаблицаТоваров.ВыгрузитьКолонку("Номенклатура"));
        ТЗСпецЦены = ЗапросЦен.Выполнить().Выгрузить();
        
        //Перебор товаров
        Для Каждого СтрокаТЧ Из ТаблицаТоваров Цикл
            Если СтрокаТЧ.СуммаБезСкидки = 0 Тогда
                Продолжить;
            КонецЕсли;
            
            Если СтрокаТЧ.ПроцентАвтоматическихСкидок = 100 Тогда
                Продолжить;
            КонецЕсли;
            
                СтрТЗСпецЦены = ТЗСпецЦены.Найти(СтрокаТЧ.Номенклатура, "Номенклатура");
                Если СтрТЗСпецЦены <> Неопределено Тогда
                    
                    //Определение кратности товара
                    КолКратныхПачек = Цел(СтрокаТЧ.Количество / ТекРасчетСкидки.СкидкаПоТипуЦен_КратностьКоличестваТовара);
                    
                    Если КолКратныхПачек > 0 Тогда
                        КолТовараСоСкидкой = КолКратныхПачек * ТекРасчетСкидки.СкидкаПоТипуЦен_КратностьКоличестваТовара;
                        
                        //Расчет суммы товара
                        СуммаСПрименениемСкидки = КолТовараСоСкидкой * СтрТЗСпецЦены.Цена;
                        СуммаБезПримененияСкидки = (СтрокаТЧ.Количество - КолТовараСоСкидкой) * СтрокаТЧ.Цена;
                        СтрокаТЧ.Сумма = СуммаСПрименениемСкидки + СуммаБезПримененияСкидки;
                        СтрокаТЧ.ПроцентАвтоматическихСкидок = Окр(((СтрокаТЧ.СуммаБезСкидки - СтрокаТЧ.Сумма) / СтрокаТЧ.СуммаБезСкидки) * 100, 2);
                        
                    КонецЕсли;
                КонецЕсли;
        КонецЦикла;
    КонецЦикла;

Остальные типы скидок, думаю, не так интересны, потому рассматривать не будем.

См. также

Комментарии
1. Владимир Зленко (ZLENKO) 368 11.10.17 20:16 Сейчас в теме
Маркетологи чего только не придумают :-) Я недавно делал скидку за % определенного ассортимента в документе, т.е. заданный список товара должен был составлять не менее 20% от суммы документа. Или, например, чтобы получить скидку надо купить не менее 5 наименований из заданного списка товаров.Или, например, скидку за комплект покупки, т.е. комбинирование товаров в комплекты со скидкой. Вобщем вариантов много :-)
2. Андрей Соловьев (bakler) 10 12.10.17 11:29 Сейчас в теме
А по факту одно и тоже, бездельники
3. Денис Лопато (Terve!R) 18.10.17 09:13 Сейчас в теме
Реализация бонусной системы на старых версиях УТ не менее интересна.
Сейчас повсеместно используют именно накопительные карты с бонусами, а не просто разовые скидки.
4. Владимир Зленко (ZLENKO) 368 18.10.17 13:21 Сейчас в теме
(3) "Сейчас повсеместно используют именно накопительные карты с бонусами, а не просто разовые скидки"

Действительно бонусные системы почему то приобрели популярность, поэтому недавно дописал работу с бонусами.
Технически ничего сложного в бонусах нет. Просто вместо скидки начисляем бонус, а механизмы те же что и для скидок.
6. djek djek (djek88) 1 19.10.17 18:52 Сейчас в теме
(4)
Людям проще знать, что у них есть бонусы и их можно потратить, чем где-то предоставляют скидки.

А как реализовали механизм списания бонусов и оплаты бонусами?
8. Владимир Зленко (ZLENKO) 368 20.10.17 12:04 Сейчас в теме
(6)
А как реализовали механизм списания бонусов и оплаты бонусами?


Начисление бонусов = Начисление скидки, но дается не скидка в документ, а в регистр накопления накапливается сумма бонуса.
Оплата бонусом = Предоставление скидки, но сумма скидки ограничивается суммой накопленного бонуса, а в регистр списывается сумма бонуса.
10. Владимир Зленко (ZLENKO) 368 20.10.17 12:14 Сейчас в теме
(6) "А как реализовали механизм списания бонусов и оплаты бонусами? "

7. Александр Корнев (VampirRo) 20.10.17 10:32 Сейчас в теме
(4) Сейчас повсеместно используют именно накопительные карты с бонусами, а не просто разовые скидки


Бонусные системы приобрели популярность по нескольким причинам. 1. Привлечение клиента на повторное посещение магазина (или покупку)
2.Бонусы обычно обставляются различными условиями, которые делают более прибыльным вариант их использование для магазина при внешней привлекательности для клиента (оплатить им не более какого-то процента от суммы товара, сгорают через определенное время) и т.д. Бонусы начисляемы в баллах (обычно привязанных к рублю) вызывают у покупателя большее чувство собственничества чем проценты скидки от неизвестно какой цены. Грубо говоря сто рублей ощутимее 2 процентов. У меня 3 клиенстких магазина перешли со скидочных накопительных карт на бонусы.
9. Владимир Зленко (ZLENKO) 368 20.10.17 12:09 Сейчас в теме
(7)
У меня 3 клиенстких магазина перешли со скидочных накопительных карт на бонусы.


И что это им дало ? :-) На самом деле ни скидки ни бонусы не повышают лояльность :-)
11. djek djek (djek88) 1 20.10.17 13:02 Сейчас в теме
(7)
У меня 3 клиенстких магазина перешли со скидочных накопительных карт на бонусы.


Присоединяюсь.
А эффект от этого перехода как-то измерили?
5. Владимир Зленко (ZLENKO) 368 18.10.17 13:27 Сейчас в теме
Примерно то же самое:
Если СтрокаСкидки.СпособПредоставленияСкидки = Перечисления.СпособыПредоставленияСкидки.СкидкаНаКратноеКоличество Тогда
			//даем скидку процентом на количество в строке кратное указанному 
			Если Количество > 0 И СтрокаСкидки.ЗначениеСпособПредоставленияСкидки > 0 И Количество >= СтрокаСкидки.ЗначениеСпособПредоставленияСкидки Тогда
				Скидка = (ЦЕЛ(Количество/СтрокаСкидки.ЗначениеСпособПредоставленияСкидки)*СтрокаСкидки.ЗначениеСпособПредоставленияСкидки)*(Сумма/Количество)*СтрокаСкидки.ЗначениеСкидкиНаценки/100;
			КонецЕсли;
Оставьте свое сообщение