Бонусы без скидок. Розница 2.3
Клиент поставил задачу — начислять бонусы клиенту только за те строки чека, в которых не были предоставлены другие ручные или автоматические скидки.
Условие начисления по бонусам такое:
Условия предоставления бонусов такие:
Второе условие добавил я:
Внешняя обработка в справочнике выглядит так:
Попробовал первый код внешней обработки предоставления скидок на основании примера с Инфостарта:
Функция ПроверитьУсловие(Условие, СтрокаДереваСкидок, ПараметрыВнешнейОбработки = Неопределено, ПараметрыРасчета) Экспорт //https://forum.infostart.ru/forum9/topic248626/ - взято отсюда РезультатПроверки = Новый Структура; ТекущееУсловиеВыполнено = Истина; Для Каждого СтрокаТовара Из СтрокаДереваСкидок.СтруктураДополнительныхДанных.ТаблицаТоваровПоСегментам Цикл //В СтрокаТовара имеем доступ к таб.части. Например СтрокаТовара.Характеристика //Если УсловиеВыполняется Тогда СтрокаТовара.УсловиеПоСтрокеВыполнено = Истина; //КонецЕсли; Если ЛОЖЬ Тогда ТекущееУсловиеВыполнено = Ложь; Прервать; КонецЕсли; КонецЦикла; Сообщить("Результат проверки:" + ТекущееУсловиеВыполнено); РезультатПроверки.Вставить("ТекущееУсловиеВыполнено", ТекущееУсловиеВыполнено); Возврат РезультатПроверки; КонецФункции
Получил, что результат проверки выполняется.
Если установить ТекущееУсловиеВыполнено = Ложь, то бонусы применены не будут. Поэтому нужно его устанавливать.
Чтобы посмотреть, что доступно для анализа в внешней обработке, поставил точку останова в процедуре ПроверитьУсловияСкидки модуля СкидкиНаценкиСервер:
К моему счастью, суммы ручной и автоматической скидки есть в таблице СтрокаДереваСкидок.СтруктураДополнительныхДанных.ТаблицаТоваровПоСегментам:
Итоговый код проверки условия вышел таким:
Функция ПроверитьУсловие(Условие, СтрокаДереваСкидок, ПараметрыВнешнейОбработки = Неопределено, ПараметрыРасчета) Экспорт //https://forum.infostart.ru/forum9/topic248626/ - взято отсюда РезультатПроверки = Новый Структура; ТекущееУсловиеВыполнено = ложь; Для Каждого СтрокаТовара Из СтрокаДереваСкидок.СтруктураДополнительныхДанных.ТаблицаТоваровПоСегментам Цикл //В СтрокаТовара имеем доступ к таб.части. Например СтрокаТовара.Характеристика СтрокаТовара.УсловиеПоСтрокеВыполнено = СтрокаТовара.СуммаРучнойСкидки = 0 И СтрокаТовара.СуммаАвтоматическойСкидки = 0; ТекущееУсловиеВыполнено = ТекущееУсловиеВыполнено ИЛИ СтрокаТовара.УсловиеПоСтрокеВыполнено; КонецЦикла; Сообщить("Результат проверки:" + ТекущееУсловиеВыполнено); РезультатПроверки.Вставить("ТекущееУсловиеВыполнено", ТекущееУсловиеВыполнено); Возврат РезультатПроверки; КонецФункции
Получается, что нужно возвращать и что условие применено и что построчно оно применено для тех строк, где условие выполняется.
Среда: Розница 2.3.9.42.
Объем: 1 час.
Серега, ты что спец по Рознице? Есть пару вопросов, может сталкивался?
Спец, задавай.