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

Следующий пример демонстрирует, как с использованием API логических модулей можно реализовать выбор одной скидки из нескольких активных.

Перем ВыбраннаяСкидка;// в переменной модуля формы запоминаем выбранную скидку

//при нажатии кнопки оплаты предлагаем выбрать одну из активных скидок
Процедура Регистрация_ФункцияФормыРегистрации_Оплата_ПредОбработка(НомерВидаОплаты) Экспорт
	
	_Отказ = Ложь; 
	__Источник = _Источник;
	ВыбраннаяСкидка = Неопределено;
	
	Если _Источник.ПросмотрЧека ИЛИ НЕ _Источник.ТипЧека_Продажа Тогда
		Возврат;
	КонецЕсли;
	
	КэшСкидок = _Источник.ФункцииСкидки.ЛокКэшСкидок;
	Если КэшСкидок = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Отбор = Новый Структура("Активность, Использование", Истина, Истина);
	
	СписокВыбора = Новый СписокЗначений();
	Для Каждого Схема Из КэшСкидок.НайтиСтроки(Отбор) Цикл
		
		Для Каждого Ск Из Схема.Скидки.НайтиСтроки(Отбор) Цикл
			СписокВыбора.Добавить(Новый Структура("Схема, Скидка", Схема, Ск), Ск.Скидка.Наименование);		
		КонецЦикла;
		
	КонецЦикла;
	
	Если СписокВыбора.Количество() = 0 Тогда
	ИначеЕсли СписокВыбора.Количество() = 1 Тогда
		ВыбраннаяСкидка = СписокВыбора[0].Значение;
	Иначе
		ФормаВыбораНомер1 = МенеджерОбъектов.ПолучитьОбщийОбъект("Регистрация.ФормаВыбораНомер1");
		ФормаВыбораНомер1.СписокЧеков = СписокВыбора;
		ФормаВыбораНомер1.ТипФормы = 1;
		Ответ = ФормаВыбораНомер1.ОткрытьМодально();
		Если Ответ = Неопределено Тогда
			_Отказ = Истина;
			Возврат;
		Иначе
			ВыбраннаяСкидка = Ответ.Значение;
		КонецЕсли;
	КонецЕсли;
	
	Если ВыбраннаяСкидка <> Неопределено Тогда
		__Источник.ФункцииСкидки.РассчетСкидки();
		__Источник.ОбновитьЭлементыФормыРегистрации();
		__Источник.НажатаПромИтог = Ложь;
                _Источник = __Источник;
	КонецЕсли;
КонецПроцедуры

//устанавливаем активной только выбранную скидку
Функция РассчетСкидок_ПолучитьМассивАктивныхСкидокИзКэша_ПостОбработка(Покупка, ВостСкидки) Экспорт
	
	_Отказ = Ложь;
	Если Покупка = Неопределено Тогда
		
		Если ВыбраннаяСкидка <> Неопределено Тогда
			_РезультатВызова.Очистить();                
			Для Каждого Ск Из ВыбраннаяСкидка.Схема.Скидки Цикл
				Ск.Использование = Ложь;
			КонецЦикла;
			ВыбраннаяСкидка.Скидка.Использование = Истина;
			_РезультатВызова.Добавить(ВыбраннаяСкидка.Схема);
			_Отказ = Истина;
			
		КонецЕсли;
		
	КонецЕсли;
	
	Возврат _РезультатВызова;
	
КонецФункции

//при успешном закрытии чека сбрасываем выбранную скидку
Функция Регистрация_ЗакрытьЧекКонтекст_ПостОбработка(Отмена) Экспорт
	_Отказ = Ложь;
	Если _РезультатВызова = Истина Тогда
		ВыбраннаяСкидка = Неопределено;
	КонецЕсли;
	Возврат _РезультатВызова;
КонецФункции