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

1. user1587645 25.09.22 04:54 Сейчас в теме
Здравствуйте! Помогите пжл решить такую задачу. Есть Обработка с табличной частью. В шапке Покупатель, Склад, Вид цены и валюта. В табличной части ОстаткиТоваров Номенклатура, Количество, Цена и Стоимость. Кнопка Заполнить, позволяющая заполнить табличную часть остатками товаров, кнопка Очистить, позволяющая очистить заполненную табличную часть. Можно сделать так, чтобы уже в заполненной табличной части при изменении пользователем Вида цены и/или Валюты менялось значение Цены и, соответственно, пересчитывалась Стоимость. Привожу код из модуля формы обработки:

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


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


&НаКлиенте
Процедура ОстаткиТоваровКоличествоЦенаПриИзменении(СтрокаОстаткиТоваров)
    СтрокаОстаткиТоваров = Элементы.ОстаткиТоваров.ТекущиеДанные;
    СтрокаОстаткиТоваров.Стоимость = СтрокаОстаткиТоваров.Количество*СтрокаОстаткиТоваров.Цена;
КонецПроцедуры
Показать
По теме из базы знаний
Найденные решения
7. RustamZz 27.09.22 13:40 Сейчас в теме
(6) Нет. Неправильно. Нужно существующую ТЧ выгрузить в ТЗ и в запросе соединяться с ней, заменяя колонку цены.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. user1587645 27.09.22 05:18 Сейчас в теме
Сделал вот так, все работает. Не знаю насколько это оптимально, но другого решения пока нет. У кого есть комментарии, пишите пожалуйста. Вот код, добавил новые функцию и процедуру к имеющимся:
&НаСервере
Функция ПолучениеЦены (Номенклатура, ВидЦены, Валюта)
    Запрос = Новый Запрос;
    Запрос.Текст = 
    "ВЫБРАТЬ
    |    ЦеныНоменклатурыСрезПоследних.Цена / ЕСТЬNULL(КурсыВалютСрезПоследних.Курс, 1) КАК ЦенаПолучаемая
    |ИЗ
    |    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
    |            ,
    |            ВидЦены = &ВидЦены
    |                И Номенклатура = &Номенклатура) КАК ЦеныНоменклатурыСрезПоследних
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних(, Валюта = &Валюта) КАК КурсыВалютСрезПоследних
    |        ПО (ИСТИНА)";
    
    Запрос.УстановитьПараметр("ВидЦены", ВидЦены);
    Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
    Запрос.УстановитьПараметр("Валюта", Валюта);
        
    РезультатЗапроса = Запрос.Выполнить();
    Если РезультатЗапроса.Пустой() Тогда
        Цена = 0;
    Иначе    
        ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
        Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
            Цена=ВыборкаДетальныеЗаписи.ЦенаПолучаемая;
        КонецЦикла;
    КонецЕсли;
    Возврат Цена; 
КонецФункции 

&НаКлиенте
Процедура ВалютаВидЦеныПриИзменении(Элемент)
    Для каждого СтрокаОстаткиТоваров Из Объект.ОстаткиТоваров Цикл
        СтрокаОстаткиТоваров.Цена = ПолучениеЦены (СтрокаОстаткиТоваров.Номенклатура, ВидЦены, Валюта);
        СтрокаОстаткиТоваров.Стоимость = СтрокаОстаткиТоваров.Количество*СтрокаОстаткиТоваров.Цена;
    КонецЦикла; 
КонецПроцедуры
Показать
3. RustamZz 27.09.22 07:24 Сейчас в теме
(2) 2 балла на экзамене на специалиста: за запрос в цикле и за вызов сервер в цикле.
4. user1587645 27.09.22 09:03 Сейчас в теме
(3) А как тогда лучше сделать, чтобы все работало также как и сейчас?
5. RustamZz 27.09.22 10:38 Сейчас в теме
(4) Перенести выполнение ВалютаВидЦеныПриИзменении на сервер.
Я стараюсь писать запросы так, что бы заполнение ТЧ происходило таким кодом:
Объект.ОстаткиТоваров.Загрузить(Запрос.Выполнить().Выгрузить());
6. user1587645 27.09.22 13:34 Сейчас в теме
(5) Что-то я поплыл. Вот так переделал. А дальше что-то не знаю как
&НаСервере
Процедура ВалютаПриИзмененииНаСервере()
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) / ЕСТЬNULL(КурсыВалютСрезПоследних.Курс, 1) КАК ЦенаПолучаемая
	|ИЗ
	|	РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
	|			,
	|			ВидЦены = &ВидЦены
	|				И Номенклатура = &Номенклатура) КАК ЦеныНоменклатурыСрезПоследних
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних(, Валюта = &Валюта) КАК КурсыВалютСрезПоследних
	|		ПО (ИСТИНА)";
	
	Запрос.УстановитьПараметр("ВидЦены", ВидЦены);
	Запрос.УстановитьПараметр("Номенклатура", Элементы.ОстаткиТоваров.ТекущаяСтрока);
	Запрос.УстановитьПараметр("Валюта", Валюта);

	РезультатЗапроса = Запрос.Выполнить();
	Объект.ОстаткиТоваров.Загрузить(Запрос.Выполнить().Выгрузить());
КонецПроцедуры

&НаКлиенте
Процедура ВалютаПриИзменении(Элемент)
	ВалютаПриИзмененииНаСервере();
КонецПроцедуры
Показать
7. RustamZz 27.09.22 13:40 Сейчас в теме
(6) Нет. Неправильно. Нужно существующую ТЧ выгрузить в ТЗ и в запросе соединяться с ней, заменяя колонку цены.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот