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