Версия для печати темы (https://pro1c.org.ua/index.php?showtopic=5750)

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

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

Автор: bodka 22.12.11, 13:38

Необходимо на форме при смене контрагента получить процент скидки и пересчитать весь табличный документ. Процент скидки по контрагенту получаю в модуле объекта документа:

Процедура ПолучитьПроцентСкидки() Экспорт 
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ ПЕРВЫЕ 1
    |    ШкалаСкидокСрезПоследних.Скидка
    |ИЗ
    |    РегистрСведений.ШкалаСкидок.СрезПоследних(&МоментВремени, ) КАК ШкалаСкидокСрезПоследних
    |ГДЕ
    |    ШкалаСкидокСрезПоследних.ОбъемЗакупок > &ОбъемЗакупок
    |
    |УПОРЯДОЧИТЬ ПО
    |    ШкалаСкидокСрезПоследних.ОбъемЗакупок";
    
    Если ЭтоНовый() Тогда
        Запрос.УстановитьПараметр("МоментВремени", Дата);
    Иначе
        Запрос.УстановитьПараметр("МоментВремени", МоментВремени());    
    КонецЕсли;
    
    Отбор = Новый Структура();
    Отбор.Вставить("Контрагент", Контрагент);
    Обороты = РегистрыНакопления.Продажи.Обороты(
    ДобавитьМесяц(НачалоМесяца(Дата),-1), НачалоМесяца(Дата)-1,
    Отбор,,"СуммаПродаж");
    
    Если Обороты.Количество() <> 0 Тогда
        ОбъемЗакупок = Обороты[0].СуммаПродаж;
    Иначе
        ОбъемЗакупок = 0;
    КонецЕсли;
    Запрос.УстановитьПараметр("ОбъемЗакупок", ОбъемЗакупок);
    
    РезультатЗапроса = Запрос.Выполнить();
    если РезультатЗапроса.Пустой() Тогда
        Скидка = 0;
    Иначе
        Выборка = РезультатЗапроса.Выбрать();
        Выборка.Следующий();
        Скидка = Выборка.Скидка;
    КонецЕсли;
КонецПроцедуры

В этой процедуре все проверил отладчиком - все корректно. А вот в модуль формы как передать эту скидку не знаю. Подскажите пожалуйста. Вот код:
&НаКлиенте
Процедура КонтрагентПриИзменении(Элемент)
     ТестНаСервере();
     Стр = Элементы.Товары.ТекущиеДанные;
     Для Каждого Стр Из Объект.Товары Цикл
         Стр.Цена = Стр.Цена*(100-Скидка)/100;
     КонецЦикла;
КонецПроцедуры


&НаСервере
Процедура ТестНаСервере()
     ОбъектНаСервере = РеквизитФормыВЗначение("Объект");
     ОбъектНаСервере.ПолучитьПроцентСкидки();
     ЗначениеВРеквизитФормы(ОбъектНаСервере, "Объект");
КонецПроцедуры

Автор: logist 22.12.11, 13:56

&НаКлиенте
Процедура КонтрагентПриИзменении(Элемент)
     ТестНаСервере();
     Стр = Элементы.Товары.ТекущиеДанные; // Эта строка вообще не нужна!!!
     Для Каждого Стр Из Объект.Товары Цикл
         Стр.Цена = Стр.Цена*(100-Скидка)/100;
     КонецЦикла;
КонецПроцедуры


Ну и собственно, можно было просто создать функцию которая получит Время и Контрагента, а вернет Скидку. И уже потом пересчитать таблицу.

Автор: bodka 22.12.11, 14:11

Цитата(logist @ 22.12.11, 13:56) *
&НаКлиенте
Процедура КонтрагентПриИзменении(Элемент)
     ТестНаСервере();
     Стр = Элементы.Товары.ТекущиеДанные; // Эта строка вообще не нужна!!!
     Для Каждого Стр Из Объект.Товары Цикл
         Стр.Цена = Стр.Цена*(100-Скидка)/100;
     КонецЦикла;
КонецПроцедуры


Ну и собственно, можно было просто создать функцию которая получит Время и Контрагента, а вернет Скидку. И уже потом пересчитать таблицу.


А в моем коде никак нельзя передать процент скидки?

Автор: logist 22.12.11, 14:19

Цитата(bodka @ 22.12.11, 14:11) *
А в моем коде никак нельзя передать процент скидки?

Не знаю, я думал с другой логикой, даже не опираясь на ваш код.

Автор: bodka 22.12.11, 14:35

[Здесь было что то не по правилам]

Вот так работает:

&НаКлиенте
Процедура КонтрагентПриИзменении(Элемент)
     ТестНаСервере();
     //Стр = Элементы.Товары.ТекущиеДанные;
     Для Каждого Стр Из Объект.Товары Цикл
         Стр.Цена = Стр.Цена*(100-Объект.Скидка)/100;
         Стр.Сумма = Стр.Количество*Стр.Цена;
     КонецЦикла;
КонецПроцедуры

Автор: bodka 22.12.11, 15:52

Не могу сохранить первое значение Цены, то есть если выбрал одного Контрагента (рассчиталась скидка) и если меняю Контрагента, то расчет идет от цены со скидкой первого Контрагента. Как сохранить переменную Цена?

Автор: logist 22.12.11, 16:17

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

Автор: zzz14 23.12.11, 11:28

Можно так(модуль формы):

&НаКлиенте
Процедура КонтрагентПриИзменении(Элемент)
      
     НоваяСкидка = ПолучитьПроцентСкидки(Объект.Дата, Объект.Ссылка, Объект.Контрагент);

     Для Каждого Стр Из Объект.Товары Цикл
          ПрежняяЦена = Стр.Цена*(100/100-Скидка); //Получили прежнее значение цены
          Стр.Цена = ПрежняяЦена*(100-НоваяСкидка)/100; //Установили новое значение
     КонецЦикла;
    
     Скидка = НоваяСкидка;

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

&НаСервереБезКонтекста
Процедура ПолучитьПроцентСкидки(Дата, Ссылка, Контрагент)
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ ПЕРВЫЕ 1
    |    ШкалаСкидокСрезПоследних.Скидка
    |ИЗ
    |    РегистрСведений.ШкалаСкидок.СрезПоследних(&МоментВремени, ) КАК ШкалаСкидокСрезПоследних
    |ГДЕ
    |    ШкалаСкидокСрезПоследних.ОбъемЗакупок > &ОбъемЗакупок
    |
    |УПОРЯДОЧИТЬ ПО
    |    ШкалаСкидокСрезПоследних.ОбъемЗакупок";
    
    
    Запрос.УстановитьПараметр("МоментВремени", Новый МоментВремени(Дата, Ссылка));    
    
    Отбор = Новый Структура();
    Отбор.Вставить("Контрагент", Контрагент);
    Обороты = РегистрыНакопления.Продажи.Обороты(
    ДобавитьМесяц(НачалоМесяца(Дата),-1), НачалоМесяца(Дата)-1,
    Отбор,,"СуммаПродаж");
    
    Если Обороты.Количество() <> 0 Тогда
        ОбъемЗакупок = Обороты[0].СуммаПродаж;
    Иначе
        ОбъемЗакупок = 0;
    КонецЕсли;
    Запрос.УстановитьПараметр("ОбъемЗакупок", ОбъемЗакупок);
    
    РезультатЗапроса = Запрос.Выполнить();
    если РезультатЗапроса.Пустой() Тогда
        Возврат 0;
    Иначе
        Выборка = РезультатЗапроса.Выбрать();
        Выборка.Следующий();
        Возврат Выборка.Скидка;
    КонецЕсли;
КонецПроцедуры


Код не отлажен, но и без того все ясно.

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