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

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

В торговле имеет большое значение система скидок, чем больше типов скидок, тем более вероятность покупки, также можно мотивировать покупателя покупать не 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) 366 11.10.17 20:16 Сейчас в теме
Маркетологи чего только не придумают :-) Я недавно делал скидку за % определенного ассортимента в документе, т.е. заданный список товара должен был составлять не менее 20% от суммы документа. Или, например, чтобы получить скидку надо купить не менее 5 наименований из заданного списка товаров.Или, например, скидку за комплект покупки, т.е. комбинирование товаров в комплекты со скидкой. Вобщем вариантов много :-)
2. Андрей Соловьев (bakler) 6 12.10.17 11:29 Сейчас в теме
А по факту одно и тоже, бездельники
Оставьте свое сообщение