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

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


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


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


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


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

Не знаю, я думал с другой логикой, даже не опираясь на ваш код.
bodka
[Здесь было что то не по правилам]

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

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

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

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


Код не отлажен, но и без того все ясно.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.