Добрый день.
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
Указанной конфигурации под рукой нет, но общие соображения такие:
1. Курс валют содержит отношение указанной валюты к валюте регламентированного учета.
Обратите внимание на Сервис - Настройка параметров учета - Валюты (или как-там оно называется в Альфа-Авто?). В типовых, которые у меня есть под рукой, подробно написано:
Подчеркиваю: "По отношению к этой валюте указывается курс других валют"
2. Если валюта упр учета у Вас USD, то СуммаУпрОстаток - это сумма в долларах. СуммаГрн = СуммаДол*КурсДол. Как у Вас и получилось в первом подзапросе из объединения
3. Исходя из п.1, курс валюты регламентированного учета (грн) всегда должен быть равен 1, то есть, во втором подзапросе "КурсыВалютСрезПоследних.Курс" всегда будет 1 и Вы просто получили СуммуУпрОстаток, то есть, сумму в долларах
4. Информации о курсе Рубля к Доллару и Евро к Доллару в системе просто нет (см. п.1). Поэтому, единственное, как мы может получить оценку стоимости в этих валютах - это привести стоимость к гривням, а затем разделить на курс требуемой валюты:
СуммаРуб = СуммаГрн/КурсРуб = (СуммаДол*КурсДол)/КурсРуб
СуммаЕвро = СуммаГрн/КурсЕвро = (СуммаДол*КурсДол)/КурсЕвро (да-да, сумма в Евро будет меньше, чем сумма в Дол, поскольку курс Евро больше, чем курс Дол, а у Вас получилось наоборот)
В некоторых валютах (обычно, для Рубля) кроме курса указывается еще и кратность, не равная 1. Поэтому, там, где написано КурсРуб, КурсЕвро итд, следует иметь в виду, что это КурсСУчетомКратности = КурсыВалютСрезПоследних.Курс/КурсыВалютСрезПоследних.Кратность
То есть, при пересчете обычно поступаем так:
1. Проверяем, что у нас за валюта упр. учета? Если она совпадает с валютой регл. учета, то КурсУпр = 1, если нет, то находим КурсУпр в курсах валют
(желательно забыть, что мы знаем, что это доллар и передавать &ВалютаУпр и &ВалютаРегл в параметрах, мы же делаем обработку на все случаи жизни, вдруг примените свою обработку на Базе, где упр учет ведется в Евро?)
2. Находим КурсПересчитываемойВалюты по отношению к ВалютеРегл по переданному параметру &ВалютаПересчета
3. Получаем то, что хотим: СуммаПересчитаннаяВВалюте = СуммаУпр*КурсУпр/КурсПересчитываемойВалюты
И, да, не забываем про кратность
TohaMonster @ Сегодня, 16:30
,
Попробовал осмыслить ваш ответ, и вот что получилось:
ВЫБРАТЬ
ПартииТоваровКомпанииОстатки.Номенклатура,
ПартииТоваровКомпанииОстатки.СуммаУпрОстаток * (КурсУпр.Курс / КурсУпр.Кратность) / (КурсВал.Курс / КурсВал.Кратность) / ПартииТоваровКомпанииОстатки.КоличествоОстаток КАК СуммаРасч,
ПартииТоваровКомпанииОстатки.КоличествоОстаток
ИЗ
РегистрНакопления.ПартииТоваровКомпании.Остатки КАК ПартииТоваровКомпанииОстатки
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних(&Период, ) КАК КурсУпр
ПО (КурсУпр.Валюта = &ВалютаУпр)
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних(&Период, ) КАК КурсРег
ПО (КурсРег.Валюта = &ВалютаРег)
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних(&Период, ) КАК КурсВал
ПО (КурсВал.Валюта = &Валюта)
ГДЕ
ПартииТоваровКомпанииОстатки.Номенклатура = &Номенклатура
Товар ВалУпр ВалРегл ВалРасч СуммаРасч.
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
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua