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

Перерасчет цены в валюте

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

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

Дмитрий357

Здравствуйте! Имеется документ Поступление товаров с реквизитами: Поставщик, Договор, Заказ, Склад, Валюта, Итоговая стоимость; его табличная часть "Товары" с реквизитами: Номенклатура, Количество, Цена, Стоимость; его форма содержит все реквизиты документа и реквизиты его табличной части. При выборе номенклатуры подставляется цена - это реализовано в модуле формы:

&НаСервереБезКонтекста
Функция ТоварыНоменклатураПриИзмененииНаСервере(Номенклатура)
   Возврат Номенклатура.ЦенаЗакупочная*ЗначениеКурсаВалют.РассчитатьПоКурсу();
КонецФункции

&НаСервереБезКонтекста
Функция ПолучитьЗначенияКонстанты()
   Возврат Константы.РассчитыватьСтоимостьАвтоматически.Получить();
КонецФункции



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

&НаКлиенте
Процедура ТоварыЦенаПриИзменении(СтрокаТЧ)
   Рассчитывать=ПолучитьЗначенияКонстанты ();
   СтрокаТЧ=Элементы.Товары.ТекущиеДанные;
   Если Рассчитывать=Истина Тогда
      РасчетСтоимостиКлиентСервер.РассчитатьСтоимость(СтрокаТЧ);
   КонецЕсли;
КонецПроцедуры
Не могу сообразить как реализовать и какой программный код написать, чтобы при выборе позиции номенклатуры цена пересчитывалась согласно курсу выбранной валюты в шапке документа. Цены будем считать заданы в рублях и содержится в справочники Номенклатура. Имеются справочник Валюты, регистр Курсы валют, документ Установка Курсов Валют. Просьба оказать помощь

alexandr_ll

@Дмитрий357, Где функция ЗначениеКурсаВалют.РассчитатьПоКурсу()?

Дмитрий357

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

alexandr_ll


Дмитрий357


alexandr_ll

@Дмитрий357, В функцию следует передать параметры Валюта и дату документа. Запрос делать по переданным валюте и дате.

Дмитрий357

@alexandr_ll, не знаю какие передавать параметры. Если ставлю значение параметра Валюта Справочники.Валюты, возникает ошибка: нельзя сравнивать разной длины или разного типа, что-то вроде этого. Дата как параметр пишется что не определяется. На код функции РассчитатьПоКурсу можно не обращать внимания. Это моя, возможно, безграмотная попытка решить данную задачу. Возможно есть другой подход. Задача состоит в том, чтобы при выборе номенклатуры в табличной части документа Поступление товаров подставлялась цена, рассчитанная в зависимости от валюты, установленной в шапке документа ПоступлениеТоваров. Цены номенклатуры хранятся в справочнике номенклатура и естественно установлены в рублях.
Сейчас цена подставляется при выборе номенклатуры в рублях независимо от того, какая валюта установлена в шапке документа ПоступлениеТоваров. Это показано в первом сообщении, где написан код, размещенный в модуле формы документа ПоступлениеТоваров/

alexandr_ll

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

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

Дмитрий357

@alexandr_ll, Огромное спасибо!!! Все заработало!!! Еще а как можно сделать, чтобы если уже в проведенном документе ПоступлениеТоваров возникал отказ, если пользователь изменил валюту, а товары не внес заново с пересчитанной ценой. А то получается можно изменить валюту и перепровести документ, а цены останутся в значении первоначальной валюты

alexandr_ll

@Дмитрий357, На реквизит формы Валюта добавить событие "При изменении", в модуле описать процедуру пересчета цены в цикле.

Теги:

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

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

Поиск