Поставщик запустил акцию: 5% скидка за количество товара, выписанное кратно 2 упаковкам.
Т.е. если в упаковке 10 шт, а в заказе выписывается 21 шт, то скидка рассчитывается на 20 шт, 1шт. идет по полной стоимости без скидки.
Аналогично и с наценкой, наценка делается на количество товара не кратного упаковке.
Ничего готового найти не удалось, пришлось вспоминать, как пишутся внешние скидки. В результате родилась данная обработка. Код не оптимизировался, вполне возможны более изящные решения, но задача была решена.
Обработка тестировалась и работает на конфигурации УТ 11.5.26.118, на более ранних версиях может не работать.
Функция Рассчитать(СкидкаНаценка, Настройки, Товары, ПараметрыРасчета) Экспорт
ТекущийКвант = 0;
ТекущийПроцент = 0;
ТекущаяЕд = Справочники.УпаковкиЕдиницыИзмерения.ПустаяСсылка();
Если ТипЗнч(Настройки) = Тип("Структура") Тогда
Если Настройки.Свойство("ПроцентСкидки") Тогда
ТекущийПроцент = Настройки.ПроцентСкидки;
КонецЕсли;
Если Настройки.Свойство("Квант") Тогда
ТекущийКвант = Настройки.Квант;
КонецЕсли;
Если Настройки.Свойство("Ед") Тогда
ТекущаяЕд = Настройки.Ед;
КонецЕсли;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
| УпаковкиЕдиницыИзмерения.Числитель КАК КоличествоВУпаковке
|ИЗ
| Справочник.УпаковкиЕдиницыИзмерения КАК УпаковкиЕдиницыИзмерения
|ГДЕ
| УпаковкиЕдиницыИзмерения.Владелец = &Номенклатура
| И УпаковкиЕдиницыИзмерения.ЕдиницаИзмерения = &ЕдиницаИзмерения";
Запрос.УстановитьПараметр("ЕдиницаИзмерения",ТекущаяЕд);
РезультатРасчета = СкидкиНаценкиСервер.ПустаяТаблицаСкидокСРасшифровкой();
Если ТекущийКвант = 0 или ТекущийПроцент = 0 Тогда
Возврат РезультатРасчета;
КонецЕсли;
// Пробегаем по строкам ТЧ документа (Заказ, Реализация, Чек ККМ)
Для Каждого СтрокаТовара Из Товары Цикл
// Пропускаем пустые строки или услуги, если это необходимо
Если Не ЗначениеЗаполнено(СтрокаТовара.Номенклатура) Тогда
Продолжить;
КонецЕсли;
Если СтрокаТовара.Количество > 0 Тогда
Если Не ЗначениеЗаполнено(ТекущаяЕд) Тогда
Возврат РезультатРасчета;
КонецЕсли;
Запрос.УстановитьПараметр("Номенклатура",СтрокаТовара.Номенклатура);
Результат = Запрос.Выполнить().Выбрать();
КоличествоВУпаковке = 1;
Пока Результат.Следующий() Цикл
КоличествоВУпаковке = Результат.КоличествоВУпаковке;
КонеЦцикла;
Если ТекущийПроцент < 0 Тогда // Это наценка на товар не кратный упаковке
КоличествоСоСкидкой = СтрокаТовара.Количество - Цел(СтрокаТовара.Количество/(ТекущийКвант*КоличествоВУпаковке))*КоличествоВУпаковке; // количество не в упаковках
СуммаАвтоматическойСкидки = КоличествоСоСкидкой * СтрокаТовара.Цена * ТекущийПроцент/100;
Иначе
КоличествоСоСкидкой = Цел(СтрокаТовара.Количество/(ТекущийКвант*КоличествоВУпаковке));
СуммаАвтоматическойСкидки = КоличествоСоСкидкой * КоличествоВУпаковке * ТекущийКвант * СтрокаТовара.Цена * ТекущийПроцент/100;
КонецЕсли;
СкидкиНаценкиСервер.ПрименитьЗначениеСкидкиКТовару(СкидкаНаценка, СуммаАвтоматическойСкидки, СтрокаТовара, РезультатРасчета, ПараметрыРасчета);
КонецЕсли;
КонецЦикла;
Возврат РезультатРасчета;
КонецФункции
Проверено на следующих конфигурациях и релизах:
- Управление торговлей, редакция 11, релизы 11.5.26.118
Вступайте в нашу телеграмм-группу Инфостарт