Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Получить процент скидки при смене контрагента          
bodka Подменю пользователя
сообщение 22.12.11, 13:38
Сообщение #1

Говорящий
***
Группа: Пользователи
Сообщений: 76
Спасибо сказали: 36 раз
Рейтинг: 0

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

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


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

logist Подменю пользователя
сообщение 22.12.11, 13:56
Сообщение #2

Про1С-ник
Иконка группы
Квалифицированный бухгалтерГений телепатии и социального моделированияЗа заслуги на форуме в 2010 годуМодератору Про1С (за заслуги в 2011 году)
Группа: Местный
Сообщений: 9564
Из: Kharkiv, UA
Спасибо сказали: 2536 раз
Рейтинг: 0

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


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


Signature
Личные бесплатные консультации не даю, для этого есть форум!

bodka Подменю пользователя
сообщение 22.12.11, 14:11
Сообщение #3

Говорящий
***
Группа: Пользователи
Сообщений: 76
Спасибо сказали: 36 раз
Рейтинг: 0

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


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


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

logist Подменю пользователя
сообщение 22.12.11, 14:19
Сообщение #4

Про1С-ник
Иконка группы
Квалифицированный бухгалтерГений телепатии и социального моделированияЗа заслуги на форуме в 2010 годуМодератору Про1С (за заслуги в 2011 году)
Группа: Местный
Сообщений: 9564
Из: Kharkiv, UA
Спасибо сказали: 2536 раз
Рейтинг: 0

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

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


Signature
Личные бесплатные консультации не даю, для этого есть форум!

bodka Подменю пользователя
сообщение 22.12.11, 14:35
Сообщение #5

Говорящий
***
Группа: Пользователи
Сообщений: 76
Спасибо сказали: 36 раз
Рейтинг: 0

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

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


Сообщение отредактировал MATEVI - 22.12.11, 14:33

bodka Подменю пользователя
сообщение 22.12.11, 15:52
Сообщение #6

Говорящий
***
Группа: Пользователи
Сообщений: 76
Спасибо сказали: 36 раз
Рейтинг: 0

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

logist Подменю пользователя
сообщение 22.12.11, 16:17
Сообщение #7

Про1С-ник
Иконка группы
Квалифицированный бухгалтерГений телепатии и социального моделированияЗа заслуги на форуме в 2010 годуМодератору Про1С (за заслуги в 2011 году)
Группа: Местный
Сообщений: 9564
Из: Kharkiv, UA
Спасибо сказали: 2536 раз
Рейтинг: 0

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


Signature
Личные бесплатные консультации не даю, для этого есть форум!

Спасибо сказали: bodka,

zzz14 Подменю пользователя
сообщение 23.12.11, 11:28
Сообщение #8

Молчаливый
*
Группа: Пользователи
Сообщений: 1
Спасибо сказали: 0 раз
Рейтинг: 0

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

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

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

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


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

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 28.03.24, 18:37
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!