Версия для печати темы (https://pro1c.org.ua/index.php?s=92fdd381efe0c084dc9c5afc67520235&showtopic=59259)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование обычных форм 1С 8.2 и не интерфейсной логики _ Пересчет по курсу в валютах

Автор: bizisoft 27.05.20, 16:16

Добрый день.
1С8,2 Альфа-Авто 4.1

Валюта управл. = USD
Валюта регл. = ГРН

Справочник валюты
USD
ГРН
ЕВРО
РУБ

Сейчас пересчет производится в цикле через вызов штатной функции.
Подскажите пожалуйста, как правильно выполнить пересчет значений по курсу в указанной(ых) валюте(ах) непосредственно в запросе.

Замечена такая закономерность, что пересчет между USD и ГРН производится "напрямую", а вот остальные валюты рассчитываются через ГРН.
Например чтобы получить цену в РУБ, цена в USD умножается на курс ГРН и делится на курс РУБ (2,55*28/0,5 = 142.8)

Делаю таким образом (в данном случае пересчитывается себестоимость)

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

ОБЪЕДИНИТЬ ВСЕ

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

ОБЪЕДИНИТЬ ВСЕ

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

ОБЪЕДИНИТЬ ВСЕ

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


Номенклатура                    СуммаДол        СуммаГрн        СуммаЕвр        СуммаРуб
Фильтр маслянный ( 26300-35505 )    76,174723            
Фильтр маслянный ( 26300-35505 )                2,720526        
Фильтр маслянный ( 26300-35505 )                            81,615775    
Фильтр маслянный ( 26300-35505 )                                        1,142621


При этом значения СуммаДол должна соответствовать 2,720526, а СуммаГрн - 76,174723 - ну тут наверное можно переподставить валюты в этих запросах.
СуммаЕвр - вроде нормально.

Но вот СуммаРуб - тут неверно считает, т.к. должно быть 181,368375.
В валютах у Руб курс выставлен 0,42 - это видимо связано с тем, что УпрВалюта = Доллар, а РеглВалюта = ГРН.
Думаю, что если бы Упр и Регл валюты были ГРН, то такой проблемы не возникло.

Подскажите пожалуйста, как можно этот момент обойти?

P.S. В данном примере все валюты я объединил в одном запросе, но на самом деле валюта будет одна. Она будет выбираться в ПолеВыбора и передаваться в запрос параметром.
Думаю с Евро и Грн не должно возникнуть проблем, но с Руб будут неверно считаться суммы.


Автор: TohaMonster 28.05.20, 15:30

Указанной конфигурации под рукой нет, но общие соображения такие:

1. Курс валют содержит отношение указанной валюты к валюте регламентированного учета.
Обратите внимание на Сервис - Настройка параметров учета - Валюты (или как-там оно называется в Альфа-Авто?). В типовых, которые у меня есть под рукой, подробно написано:

Подчеркиваю: "По отношению к этой валюте указывается курс других валют"

2. Если валюта упр учета у Вас USD, то СуммаУпрОстаток - это сумма в долларах. СуммаГрн = СуммаДол*КурсДол. Как у Вас и получилось в первом подзапросе из объединения

3. Исходя из п.1, курс валюты регламентированного учета (грн) всегда должен быть равен 1, то есть, во втором подзапросе "КурсыВалютСрезПоследних.Курс" всегда будет 1 и Вы просто получили СуммуУпрОстаток, то есть, сумму в долларах

4. Информации о курсе Рубля к Доллару и Евро к Доллару в системе просто нет (см. п.1). Поэтому, единственное, как мы может получить оценку стоимости в этих валютах - это привести стоимость к гривням, а затем разделить на курс требуемой валюты:

СуммаРуб = СуммаГрн/КурсРуб = (СуммаДол*КурсДол)/КурсРуб
СуммаЕвро = СуммаГрн/КурсЕвро = (СуммаДол*КурсДол)/КурсЕвро (да-да, сумма в Евро будет меньше, чем сумма в Дол, поскольку курс Евро больше, чем курс Дол, а у Вас получилось наоборот)

В некоторых валютах (обычно, для Рубля) кроме курса указывается еще и кратность, не равная 1. Поэтому, там, где написано КурсРуб, КурсЕвро итд, следует иметь в виду, что это КурсСУчетомКратности = КурсыВалютСрезПоследних.Курс/КурсыВалютСрезПоследних.Кратность

То есть, при пересчете обычно поступаем так:

1. Проверяем, что у нас за валюта упр. учета? Если она совпадает с валютой регл. учета, то КурсУпр = 1, если нет, то находим КурсУпр в курсах валют
(желательно забыть, что мы знаем, что это доллар и передавать &ВалютаУпр и &ВалютаРегл в параметрах, мы же делаем обработку на все случаи жизни, вдруг примените свою обработку на Базе, где упр учет ведется в Евро?)
2. Находим КурсПересчитываемойВалюты по отношению к ВалютеРегл по переданному параметру &ВалютаПересчета
3. Получаем то, что хотим: СуммаПересчитаннаяВВалюте = СуммаУпр*КурсУпр/КурсПересчитываемойВалюты

И, да, не забываем про кратность

Автор: bizisoft 29.05.20, 15:54

TohaMonster @ Сегодня, 16:30 * ,

Попробовал осмыслить ваш ответ, и вот что получилось:

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


КурсУпр - ПолеВвода в которой выбираю валюту соответствующую валюте управленческого учета (USD)
КурсРег - ПолеВвода в которой выбираю валюту соответствующую валюте регламентированного учета (Грн)
КурсВал - ПолеВвода в которой выбираю валюту для которой нужно выполнить расчет

Теперь результаты, которые были получены посредством данного запроса:
Товар        ВалУпр    ВалРегл    ВалРасч    СуммаРасч.    
26300-35505    USD        Грн        USD        2,72            
26300-35505    USD        Грн        Грн        76,17        
26300-35505    USD        Грн        Руб        181,37        
26300-35505    USD        Грн        Евро        2,54


Вот курсы валют согласно справочника
Вал    Курс/Кратность
USD        28/1
Грн        1/1
Руб        42/100
Евро        30/1

Теперь получилось добиться адекватного расчета для трех валют USD / UAH / RUB
А вот ЕВРО теперь выбивается из всех.
Попробую с ЕВРО поиграться с Кратностью.

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua