Данная обработка позволяет вводить скидки процентом не на все позиции в чеке, а на самые дешевые позиции, кратно выполнению условий скидки. Данный тип скидок позволяет увеличить количество позиций в чеке. Пример условий для скидки: Сумма в документе не менее 2 000 руб., Количество в документе не менее 2 ед.. В результате на каждый второй товар при условии, что сумма чека не менне 2000 будет выдана скидка (например 20 %).
Обработка сделана на основе примера из поставки УТ 11. Основной кусок кода отвечающий за расчет скидки.
// Выполняет расчет скидки (наценки)
//
// Параметры:
// СкидкаНаценка - Строка дерева скидок (наценок). Включает результаты проверки условий, способы совместного применения
// Настройки - Структура - Настройки, заданные пользователем в форме настроек внешней обработки
// Товары - Коллекция товаров, для которых требуется применить скидку (наценку)
// ПараметрыРасчета - Структура - Параметры расчета скидок (наценок)
//
// Возвращаемое значение:
// РезультатРасчета - ТаблицаЗначений - результат расчета
//
Функция Рассчитать(СкидкаНаценка, Настройки, Товары, ПараметрыРасчета) Экспорт
РезультатРасчета = СкидкиНаценкиСервер.ПустаяТаблицаСкидокСРасшифровкой();
СкидкаНаценка.ИспользоватьКратность = Истина;
ТаблицаСтоимостейТоваров = Новый ТаблицаЗначений;
ТаблицаСтоимостейТоваров.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число"));
ТаблицаСтоимостейТоваров.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число"));
ТаблицаСтоимостейТоваров.Колонки.Добавить("КлючСвязи", Новый ОписаниеТипов("Число"));
Для Каждого Товар Из Товары Цикл
Если Товар.Количество = 0 Тогда
Продолжить;
КонецЕсли;
НоваяСтрока = ТаблицаСтоимостейТоваров.Добавить();
НоваяСтрока.Цена = Товар.Сумма / Товар.Количество;
НоваяСтрока.Количество = Товар.Количество;
НоваяСтрока.КлючСвязи = Товар.КлючСвязи;
КонецЦикла;
ТаблицаСтоимостейТоваров.Сортировать("Цена Возр");
ЧислоСкидок = СкидкиНаценкиСервер.КратностьВыполнения(СкидкаНаценка);
ЧислоСкидокИсх = ЧислоСкидок;
ЗначениеСкидки = 0;
Если Настройки <> Неопределено Тогда
Попытка
ЗначениеСкидки = Настройки.ЗначениеСкидки;
Исключение
КонецПопытки;
КонецЕсли;
МассивТоваровДляСкидок = новый Массив;
а = 0;
Пока ЧислоСкидок > 0 Цикл
ЧислоСкидок = ЧислоСкидок -1;
КлючСвязи = ТаблицаСтоимостейТоваров[а].КлючСвязи;
Для Каждого Товар Из Товары Цикл
Если Товар.КлючСвязи = КлючСвязи Тогда
Если МассивТоваровДляСкидок.Найти(Товар) = неопределено Тогда
ЧислоСкидок = ЧислоСкидок - (Товар.Количество - 1);
МассивТоваровДляСкидок.Добавить(Товар);
КонецЕсли;
КонецЕсли;
КонецЦикла;
а = а+1;
КонецЦикла;
ЭтоУмножение = СкидкаНаценка.ПрименятьУмножениеВРамкахВышестоящейГруппы;
Для Каждого Товар Из МассивТоваровДляСкидок Цикл
Сумма = ЗначениеСкидки / 100 * СкидкиНаценкиСервер.ОстатокСуммыПоСтроке(СкидкаНаценка, Товар, ПараметрыРасчета, ЭтоУмножение) * Мин(ЧислоСкидокИсх, Товар.Количество) / Товар.Количество;
СкидкиНаценкиСервер.ПрименитьЗначениеСкидкиКТовару(СкидкаНаценка, Сумма, Товар, РезультатРасчета, ПараметрыРасчета);
ЧислоСкидокИсх = ЧислоСкидокИсх - Мин(ЧислоСкидокИсх,Товар.Количество);
КонецЦикла;
Возврат РезультатРасчета;
КонецФункции
Обработка добавляется как обычно в справочник "Дополнительные отчеты и обработки". После добавления обработки, в справочнике "Скидки (наценки)" появится новый тип скидки "Процент на самые дешевые товары". Установка размера скидки производится с помощью кнопки "Настроить", все остальное стандартно.
Обработка разрабатывалась и тестировать на УТ 11.4.3.126. Платформа 8.3.12.1616