Изменение цены и расчета стоимости при изменении вида цены и валюты
Здравствуйте! Помогите пжл решить такую задачу. Есть Обработка с табличной частью. В шапке Покупатель, Склад, Вид цены и валюта. В табличной части ОстаткиТоваров Номенклатура, Количество, Цена и Стоимость. Кнопка Заполнить, позволяющая заполнить табличную часть остатками товаров, кнопка Очистить, позволяющая очистить заполненную табличную часть. Можно сделать так, чтобы уже в заполненной табличной части при изменении пользователем Вида цены и/или Валюты менялось значение Цены и, соответственно, пересчитывалась Стоимость. Привожу код из модуля формы обработки:
&НаСервере
Функция ПолучитьВыборку ();
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
| ТоварыНаСкладахОстатки.КоличествоОстаток КАК Количество,
| ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) / ЕСТЬNULL(КурсыВалютСрезПоследних.Курс, 1) КАК Цена,
| ТоварыНаСкладахОстатки.КоличествоОстаток * ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) / ЕСТЬNULL(КурсыВалютСрезПоследних.Курс, 1) КАК Стоимость
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(, Склад = &Склад) КАК ТоварыНаСкладахОстатки
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ВидЦены = &ВидЦены) КАК ЦеныНоменклатурыСрезПоследних
| ПО ТоварыНаСкладахОстатки.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних(, Валюта = &Валюта) КАК КурсыВалютСрезПоследних
| ПО (ИСТИНА)
|ГДЕ
| ТоварыНаСкладахОстатки.КоличествоОстаток > 0";
Запрос.УстановитьПараметр("Склад", Склад);
Запрос.УстановитьПараметр("ВидЦены", ВидЦены);
Запрос.УстановитьПараметр("Валюта", Валюта);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Возврат ВыборкаДетальныеЗаписи;
КонецФункции
&НаСервере
Процедура ЗаполнитьНаСервере()
ВыборкаДетальныеЗаписи=ПолучитьВыборку ();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
НовСтр = Объект.ОстаткиТоваров.Добавить();
ЗаполнитьЗначенияСвойств(НовСтр,ВыборкаДетальныеЗаписи);
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ОстаткиТоваровКоличествоЦенаПриИзменении(СтрокаОстаткиТоваров)
СтрокаОстаткиТоваров = Элементы.ОстаткиТоваров.ТекущиеДанные;
СтрокаОстаткиТоваров.Стоимость = СтрокаОстаткиТоваров.Количество*СтрокаОстаткиТоваров.Цена;
КонецПроцедуры
ПоказатьПо теме из базы знаний
- 1С:Расчет квартплаты и бухгалтерия ЖКХ
- 1С УТ 11. Доработка типовых отчетов – пересчет показателей в произвольную валюту. Задачи 2.1 – 2.2 сборника «1С: Специалист»
- Ценообразование. Установка, проверка и исправление цен. Контроль минимальной цены. 1С 7.7
- Обновление для КА 1.1, ЗУП 2.5, БУХ 2.0: НДС, ЕФС-1, Расчет страховых взносов, Мобилизация, Статистика, Электронные трудовые книжки, 2-НДФЛ, Регламентированная отчетность, Кадровый учет, Прослеживаемость импортных товаров
- Описание расчета вычисляемых цен номенклатуры, формируемых в документах Установка цен номенклатуры и Прайс-лист, произвольным запросом к данным ИБ "Себестоимость с доп. расходами" в УТ 11, КА 2, ERP 2, заложенного стандартным механизмом 1С
Найденные решения
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Сделал вот так, все работает. Не знаю насколько это оптимально, но другого решения пока нет. У кого есть комментарии, пишите пожалуйста. Вот код, добавил новые функцию и процедуру к имеющимся:
&НаСервере
Функция ПолучениеЦены (Номенклатура, ВидЦены, Валюта)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЦеныНоменклатурыСрезПоследних.Цена / ЕСТЬNULL(КурсыВалютСрезПоследних.Курс, 1) КАК ЦенаПолучаемая
|ИЗ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
| ,
| ВидЦены = &ВидЦены
| И Номенклатура = &Номенклатура) КАК ЦеныНоменклатурыСрезПоследних
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних(, Валюта = &Валюта) КАК КурсыВалютСрезПоследних
| ПО (ИСТИНА)";
Запрос.УстановитьПараметр("ВидЦены", ВидЦены);
Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
Запрос.УстановитьПараметр("Валюта", Валюта);
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Цена = 0;
Иначе
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Цена=ВыборкаДетальныеЗаписи.ЦенаПолучаемая;
КонецЦикла;
КонецЕсли;
Возврат Цена;
КонецФункции
&НаКлиенте
Процедура ВалютаВидЦеныПриИзменении(Элемент)
Для каждого СтрокаОстаткиТоваров Из Объект.ОстаткиТоваров Цикл
СтрокаОстаткиТоваров.Цена = ПолучениеЦены (СтрокаОстаткиТоваров.Номенклатура, ВидЦены, Валюта);
СтрокаОстаткиТоваров.Стоимость = СтрокаОстаткиТоваров.Количество*СтрокаОстаткиТоваров.Цена;
КонецЦикла;
КонецПроцедуры
Показать
(5) Что-то я поплыл. Вот так переделал. А дальше что-то не знаю как
&НаСервере
Процедура ВалютаПриИзмененииНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) / ЕСТЬNULL(КурсыВалютСрезПоследних.Курс, 1) КАК ЦенаПолучаемая
|ИЗ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
| ,
| ВидЦены = &ВидЦены
| И Номенклатура = &Номенклатура) КАК ЦеныНоменклатурыСрезПоследних
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних(, Валюта = &Валюта) КАК КурсыВалютСрезПоследних
| ПО (ИСТИНА)";
Запрос.УстановитьПараметр("ВидЦены", ВидЦены);
Запрос.УстановитьПараметр("Номенклатура", Элементы.ОстаткиТоваров.ТекущаяСтрока);
Запрос.УстановитьПараметр("Валюта", Валюта);
РезультатЗапроса = Запрос.Выполнить();
Объект.ОстаткиТоваров.Загрузить(Запрос.Выполнить().Выгрузить());
КонецПроцедуры
&НаКлиенте
Процедура ВалютаПриИзменении(Элемент)
ВалютаПриИзмененииНаСервере();
КонецПроцедуры
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот