Версия для печати темы (http://pro1c.org.ua/index.php?s=8befe6d6e14cab3a97a7547f156111e3&showtopic=49809)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 8.3 _ Выбор % или суммы при оповещении ввода значения

Автор: Constantus 07.01.19, 13:41

Приветствую, форумчане!
Самописная, 8.3, управляемые формы

Имеется вот такая процедура

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


Никак не могу сообразить как лучше и правильно сделать, чтобы перед запуском оповещения задавался вопрос в каком формате будет введено число в процентах или числом, типа так:

Если Число Тогда

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

Как дать понять, что сейчас будет вводиться процент или просто сумма??? Посоветуйте как бы Вы это сделали...


Автор: nik389 07.01.19, 13:46

Constantus @ Сегодня, 13:41 * ,
Как вариант, я бы свою форму сделал, с чекбоксом (процент-сумма), и нет проблем..

Автор: Constantus 07.01.19, 14:39

nik389 @ Сегодня, 16:46 * ,


Ну я сейчас так и пытаюсь сделать... Подскажите как это сделать в УФ. Нужно же открыть эту форму, выбрать нужное значение и потом выбранное значение передать в код для дальнейшей обработки...

ОткрытьФорму("Документ.Заказ.Форма.ФормаПС");

На форме есть строковый реквизит. "СписокВыбора": Процент(Процент), Сумма(Сумма)

Как теперь выбранное значение передать код?


&НаКлиенте
Процедура ПрименитьСкидкуМенеджераЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт
    
    
ОткрытьФорму("Документ.Заказ.Форма.ФормаПС").ОткрытьМодально();

//??????????????????? как обработать выбранное значение из спискавыбора формы "ФормаПС"?

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

Автор: nik389 07.01.19, 16:27

Constantus @ Сегодня, 14:39 * ,
ну да, нужно открыть форму, например так, делал хитрый выбор периода:

ПараметрыПодбора = Новый Структура("ЗакрыватьПриВыборе, ПериодЗагрузки", Истина,ПериодЗагрузки);
    ОткрытьФорму("ОбщаяФорма.ВыборКвартала", ПараметрыПодбора, Элементы.ПериодЗагрузки);


в открываемой форме, заполняем переданные значения:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Если Параметры.Свойство("ПериодЗагрузки") Тогда
        ПарамКвартал = Параметры.ПериодЗагрузки;
    Иначе
        Отказ = Истина;
    КонецЕсли;
    
    Если ПарамКвартал = Дата(1,1,1) Тогда
        ПарамКвартал = ТекущаяДата();
    КонецЕсли;
КонецПроцедуры


при закрытии формы, передаем реквизит
&НаКлиенте
Процедура КомандаОК(Команда)
    ВыбКв = ДатьКвартал();
    ОповеститьОВыборе(ВыбКв);
КонецПроцедуры

т.е. у нас период загрузки Элементы.ПериодЗагрузки получает значение ВыбКв

Автор: TrasserZero 07.01.19, 22:28

Я бы влепил обязательный к заполнению реквизит число и на форме указал вид - переключатель (такой типа двух радиобаттонов). Два положения - или процент или сумма - и никаких сложных бубнов. Не надо еще одну форму и нет модальности..

Автор: Constantus 08.01.19, 14:05

Перепробовал много методов, но самое страшное, что вместе с кодом при вызове формы выбора срабатывает код:


 Оповещение = Новый ОписаниеОповещения( "ВведенаСуммаСкидкиМенеджераЗавершение", ЭтотОбъект, ДополнительныеПараметры);
    ПоказатьВводЧисла( Оповещение, 0, ДополнительныеПараметры.МассивДанныхАкций[0].ПредставлениеСкидки );


Хотя по планам должен быть сработан после обработки предыдущего выбора...


Процедура ПрименитьСкидкуМенеджераЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт
Перем ВЗ;    
  Оповещение = Новый ОписаниеОповещения("ПослеВводаЗначения", ЭтаФорма);//, Параметры);
   ОткрытьФорму("Документ.Заказ.Форма.ФормаПС",,,,,,Оповещение);
  
  
   // Здесть обработать результат выбора, потом перейти дальше


    //Оповещение = Новый ОписаниеОповещения("ВведенПроцентСкидкиМенеджераЗавершение", ЭтотОбъект, ДополнительныеПараметры); //Ввод Процента
    Оповещение = Новый ОписаниеОповещения("ВведенаСуммаСкидкиМенеджераЗавершение", ЭтотОбъект, ДополнительныеПараметры);
    ПоказатьВводЧисла( Оповещение, 0, ДополнительныеПараметры.МассивДанныхАкций[0].ПредставлениеСкидки );

КонецПроцедуры

// Выбор Типа скидки Процент/Сумма
&НаКлиенте
Процедура ПослеВводаЗначения(ВыбЗнач, Параметры) Экспорт
    Если ВыбЗнач<>Неопределено Тогда
        // обработка введенного значения
        ВыборТипаСкидки = ВыбЗнач;
    КонецЕсли;
КонецПроцедуры



ВыборТипаСкидки - сделал глобальной переменной в модуле формы...

Пробовал через

ПоказатьВводЗначения(Оповещение, ВЗ, "Выбор типа скидки: Сумма/Процент", ОписаниеТипов); // один из вариантов


Тоже не блокирует срабатывание вызова нового оповещения с вводом числа...

Вообщем совсем зарыл себя... Может есть метод ПоказатьВводЗначения, который открывает окно с выбором 2-х значений (выпадающий список), потом получает это значение и далее в зависимости от выбранного значения определяет срабатывание одного из кодов?



Применил

Массив = Новый Массив;
Массив.Добавить(Тип("ПеречислениеСсылка.ВидМодели"));

ОписаниеТипов = Новый ОписаниеТипов(Массив);
Если ВвестиЗначение(ВЗ, "Введите значение", ОписаниеТипов) Тогда
    // обработка введенного значения
    //Сообщить("Введенное значение: "+ВЗ);
КонецЕсли;


1. А как можно в этом случае вместо ссылки на Перечисления, указать конкретные текстовые значения "Сумма" и "Процент", чтобы выходило в массиве выбор этих значений? //Не хочется добавлять еще одно перечисление...

2. Будет ли такая конструкция работать в тонком клиенте?

Автор: Constantus 08.01.19, 15:10

Применил такое изобретение:

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


Вроде работает, но это модальный метод. Хоть у меня в конфигурате и разрешено применение модального режима, но как-то болезнено это воспринимаю. В хелпах нашел такой метод для НеМодального выбора:



&НаКлиенте
Процедура КакСделатьНемодальныйВыборЗначения(Команда)

    Цвета = Новый СписокЗначений;
    Цвета.Добавить("Красный");
    Цвета.Добавить("Зелёный");
    Цвета.Добавить("Синий");

    // процедура ПослеВыбораЭлемента определена чуть ниже
    ОповещениеПослеВыбораЭлемента = Новый ОписаниеОповещения(
        "ПослеВыбораЭлемента", ЭтотОбъект
    );

    Цвета.ПоказатьВыборЭлемента(
        ОповещениеПослеВыбораЭлемента,
        "Выберите любимый цвет"
    );

КонецПроцедуры

&НаКлиенте
Процедура ПослеВыбораЭлемента(Элемент, Параметры) Экспорт

    Если Элемент <> Неопределено Тогда
        Сообщить(Элемент.Значение);
    КонецЕсли;

КонецПроцедуры


Но как тогда сделать проверку на выбранное значение из "ПослеВыбораЭлемента(Элемент, Параметры)" в основном модуле выбора?

Автор: daveal 09.01.19, 19:31

Вы можете сколько угодно формировать цепочки вызовов, т.е. в данном случае в "ПослеВыбораЭлемента" вызывайте ввод числа со своим оповещением в зависимости от выбранного элемента. Если нужно пробросить какие-то данные пишите в доп параметры или пробросьте дальше доп параметры - по сути и результат выбора, число или процент, можно в доп. параметры пробросить и обойтись одним методом.


У меня так из последнего перенос даты выполнения задачи:
1. Сначала вопрос перенос это или отмена - оповещение
2. При переносе запрос даты - оповещение
3. Если дата раньше другой ключевой даты еще вопрос, а уверены ли Вы, что именно так - оповещение. Здесь в случае прохождения контроля или дальше при подтверждении просто вызывается один метод с фиксацией даты.

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
http://pro1c.org.ua