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