Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
26 ноя 2022, 22:18

Изменение цены и расчета стоимости при изменении вида цены и валюты

Автор Дмитрий357, 25 сен 2022, 04:50

0 Пользователей и 1 гость просматривают эту тему.

Дмитрий357

Здравствуйте! Помогите пжл решить такую задачу. Есть Обработка с табличной частью. В шапке Покупатель, Склад, Вид цены и валюта. В табличной части ОстаткиТоваров Номенклатура, Количество, Цена и Стоимость. Кнопка Заполнить, позволяющая заполнить табличную часть остатками товаров, кнопка Очистить, позволяющая очистить заполненную табличную часть. Можно сделать так, чтобы уже в заполненной табличной части при изменении пользователем Вида цены и/или Валюты менялось значение Цены и, соответственно, пересчитывалась Стоимость. Привожу код из модуля формы обработки
&НаСервере
Функция ПолучитьВыборку ();
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
| ТоварыНаСкладахОстатки.КоличествоОстаток КАК Количество,
| ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) / ЕСТЬNULL(КурсыВалютСрезПоследних.Курс, 1) КАК Цена,
| ТоварыНаСкладахОстатки.КоличествоОстаток * ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) / ЕСТЬNULL(КурсыВалютСрезПоследних.Курс, 1) КАК Стоимость
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(, Склад = &Склад) КАК ТоварыНаСкладахОстатки
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ВидЦены = &ВидЦены) КАК ЦеныНоменклатурыСрезПоследних
| ПО ТоварыНаСкладахОстатки.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних(, Валюта = &Валюта) КАК КурсыВалютСрезПоследних
| ПО (ИСТИНА)
|ГДЕ
| ТоварыНаСкладахОстатки.КоличествоОстаток > 0";

Запрос.УстановитьПараметр("Склад", Склад);
Запрос.УстановитьПараметр("ВидЦены", ВидЦены);
Запрос.УстановитьПараметр("Валюта", Валюта);

РезультатЗапроса = Запрос.Выполнить();

ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Возврат ВыборкаДетальныеЗаписи;
КонецФункции


&НаСервере
Процедура ЗаполнитьНаСервере()
ВыборкаДетальныеЗаписи=ПолучитьВыборку ();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
НовСтр = Объект.ОстаткиТоваров.Добавить();
ЗаполнитьЗначенияСвойств(НовСтр,ВыборкаДетальныеЗаписи);
КонецЦикла;
КонецПроцедуры


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

LexaK

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

Дмитрий357

LexaK, Да спасибо большое! Один маленький нюансик. Табличная часть заполняется при первом выборе валюты или вида цены, т.е. при открытии обработки и заполнении ее шапки. Таким образом отпадает значимость кнопки "Заполнить", что не очень хорошо. И еще если выбрать первый склад, произойдет заполнение остатками с него, а, затем сменить склад - также произойдет заполнение остатками с этого склада при нажатии кнопки "Заполнить". Далее начать менять валюту и/или вид цены, то остатки с первого склада пропадут, поскольку очистятся. А без очищения табличной части тоже нельзя. Замкнутый круг и это плохо. Вот как решить эти проблемы 

LexaK

Дмитрий357, добавьте обработчик в событие и ПриИзменении Склада
Кнопка Заполнить тоже нужна, например пользователь, что-то наизменял в самой ТЧ, удалил половину строк, количество, и т.д.
и решил отказать от своих изменений, ему надо просто нажать кнопку Заполнить.
если помогло нажмите: Спасибо!

Дмитрий357

LexaK, Не решило проблему два: остатки первого склада замещаются остатками второго склада при смене склада.

LexaK

Дмитрий357, не понятно что за проблема два?
вы их хотя бы нумеруйте
1....
2....
если помогло нажмите: Спасибо!

Дмитрий357

LexaK,остатки первого склада замещаются остатками второго склада при смене склада, если даже установим событие для склада "При изменении"

LexaK

Цитата: Дмитрий357 от 26 сен 2022, 13:40LexaK,остатки первого склада замещаются остатками второго склада при смене склада, если даже установим событие для склада "При изменении"
все правильно такой алгоритм,
после ввода/смены/расчета новых данных, обычно делают кнопку Добавить - которая как раз и складывает (куда то) подготовленные данные,
так как по разным складам у вас могут быть и разные виды цен и валюта.

(ну это уже организационные моменты, главное запрос у вас работает и заполнение ТЧ  производится)
если помогло нажмите: Спасибо!

Дмитрий357

LexaK, Сделал вот так, все работает. Не знаю насколько это оптимально, но другого решения пока нет. Вам все равно большая благодарность за отзывчивость и помощь. Вот код, добавил новые функцию и процедуру к имеющимся:
&НаСервере
Функция ПолучениеЦены (Номенклатура, ВидЦены, Валюта)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЦеныНоменклатурыСрезПоследних.Цена / ЕСТЬNULL(КурсыВалютСрезПоследних.Курс, 1) КАК ЦенаПолучаемая
|ИЗ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
| ,
| ВидЦены = &ВидЦены
| И Номенклатура = &Номенклатура) КАК ЦеныНоменклатурыСрезПоследних
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних(, Валюта = &Валюта) КАК КурсыВалютСрезПоследних
| ПО (ИСТИНА)";

Запрос.УстановитьПараметр("ВидЦены", ВидЦены);
Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
Запрос.УстановитьПараметр("Валюта", Валюта);

РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Цена = 0;
Иначе
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Цена=ВыборкаДетальныеЗаписи.ЦенаПолучаемая;
КонецЦикла;
КонецЕсли;
Возврат Цена;
КонецФункции

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

Теги:

Похожие темы (5)

Рейтинг@Mail.ru Rambler's Top100

Поиск