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