Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
15 дек 2024, 02:41

Изменение вида цены и валюты

Автор Дмитрий357, 28 сен 2022, 16:03

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

Дмитрий357

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

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

Запрос.УстановитьПараметр("ВидЦены", ВидЦены);
Запрос.УстановитьПараметр("Валюта", Валюта);
Запрос.УстановитьПараметр("Номенклатура", Элементы.ОстаткиТоваров.ТекущиеДанные);
Объект.ОстаткиТоваров.Загрузить(Запрос.Выполнить().Выгрузить());

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

&НаКлиенте
Процедура ВалютаПриИзменении(Элемент)
ВалютаПриИзмененииНаСервере();
КонецПроцедуры

LexaK

Дмитрий357, выложите код который работает по кнопке: Заполнить.
 
если помогло нажмите: Спасибо!

antoneus

&НаСервере
Процедура ВалютаПриИзмененииНаСервере()

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

Дмитрий357

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

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

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

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


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

LexaK

Дмитрий357, почти все тоже самое что вам antoneus, написал.
(сила программиста не в том что он миллионы кодов/алгоритмов помнит, а в том уже рабочий код может применить к новой задаче)

ваш код по загрузке, даже проще, не надо выгружать и передавать в запрос таблицу с товарами.
и еще такой момент, за время работы могли измениться остатки (при многопользовательском режиме - легко)
как вариант, при изменении Валюты, Склада, ВидаЦены, проще было вызывать вашу обработку заполнения.
если помогло нажмите: Спасибо!

Теги:

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

Рейтинг@Mail.ru

Поиск