Бонусы без скидок. Розница 2.3

Клиент поставил задачу — начислять бонусы клиенту только за те строки чека, в которых не были предоставлены другие ручные или автоматические скидки.

Условие начисления по бонусам такое:

Условия предоставления бонусов такие:

Второе условие добавил я:

Внешняя обработка в справочнике выглядит так:

Попробовал первый код внешней обработки предоставления скидок на основании примера с Инфостарта:

Функция ПроверитьУсловие(Условие, СтрокаДереваСкидок, ПараметрыВнешнейОбработки = Неопределено, ПараметрыРасчета) Экспорт
	//https://forum.infostart.ru/forum9/topic248626/ - взято отсюда
    
    РезультатПроверки = Новый Структура;
    ТекущееУсловиеВыполнено = Истина;
    
    Для Каждого СтрокаТовара Из СтрокаДереваСкидок.СтруктураДополнительныхДанных.ТаблицаТоваровПоСегментам Цикл

        //В СтрокаТовара имеем доступ к таб.части. Например СтрокаТовара.Характеристика
		
       
        //Если УсловиеВыполняется Тогда
            СтрокаТовара.УсловиеПоСтрокеВыполнено = Истина;
        //КонецЕсли;
		Если ЛОЖЬ Тогда
	        ТекущееУсловиеВыполнено = Ложь;
			Прервать;
		КонецЕсли;
    	
	КонецЦикла;
	
	Сообщить("Результат проверки:" + ТекущееУсловиеВыполнено);
    РезультатПроверки.Вставить("ТекущееУсловиеВыполнено", ТекущееУсловиеВыполнено);
    
    Возврат РезультатПроверки;
    
КонецФункции

Получил, что результат проверки выполняется.

Если установить ТекущееУсловиеВыполнено = Ложь, то бонусы применены не будут. Поэтому нужно его устанавливать.

Чтобы посмотреть, что доступно для анализа в внешней обработке, поставил точку останова в процедуре ПроверитьУсловияСкидки модуля СкидкиНаценкиСервер:

К моему счастью, суммы ручной и автоматической скидки есть в таблице СтрокаДереваСкидок.СтруктураДополнительныхДанных.ТаблицаТоваровПоСегментам:

Итоговый код проверки условия вышел таким:

Функция ПроверитьУсловие(Условие, СтрокаДереваСкидок, ПараметрыВнешнейОбработки = Неопределено, ПараметрыРасчета) Экспорт
	//https://forum.infostart.ru/forum9/topic248626/ - взято отсюда
    
    РезультатПроверки = Новый Структура;
    ТекущееУсловиеВыполнено = ложь;
    
    Для Каждого СтрокаТовара Из СтрокаДереваСкидок.СтруктураДополнительныхДанных.ТаблицаТоваровПоСегментам Цикл

        //В СтрокаТовара имеем доступ к таб.части. Например СтрокаТовара.Характеристика
		
        СтрокаТовара.УсловиеПоСтрокеВыполнено = СтрокаТовара.СуммаРучнойСкидки = 0 И СтрокаТовара.СуммаАвтоматическойСкидки = 0;
		
		ТекущееУсловиеВыполнено = ТекущееУсловиеВыполнено ИЛИ СтрокаТовара.УсловиеПоСтрокеВыполнено;
    	
	КонецЦикла;
	
	Сообщить("Результат проверки:" + ТекущееУсловиеВыполнено);
    РезультатПроверки.Вставить("ТекущееУсловиеВыполнено", ТекущееУсловиеВыполнено);
    
    Возврат РезультатПроверки;
    
КонецФункции

Получается, что нужно возвращать и что условие применено и что построчно оно применено для тех строк, где условие выполняется.

Среда: Розница 2.3.9.42.

Объем: 1 час.

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

комментария 2

  1. Типочек:

    Серега, ты что спец по Рознице? Есть пару вопросов, может сталкивался?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *