gifts2017

Получение оборотов регистра в выбранной валюте

Опубликовал Виталий Онянов (Tavalik) в раздел Программирование - Практика программирования

Недавно столкнулся с проблемой получения оборотов по регистру в выбранной валюте. С удивлением обнаружил, что эта задача не столь тривиальна. Простое "левое соединение" с Регистром сведений "КурсыВалют" не подходит, т. к. возможна ситуация, когда курсы валют не заполнены и надо найти последнее значение курса для каждого дня из периода. Вот мое решение:

В данном примере выводятся обороты по регистру накопления "Продажи" за выбранный период в выбранной валюте. Решение довольно громоздкое и я не настаиваю на том, что оно самое лучшее. С удовольствием посмотрю на другие решения данной задачи.

Параметры: 

  • &НачалоПериод и &КонецПериода - Переод отчета
  • &ВалютаРегистра - валюта, в которой хранятся данные регистра, по умолчанию - валюта управленческого учета
  • &ВалютаОтчета - валюта, в которой необхоодимо получить данные, задается на форме отчета пользователем.

Итоговый запрос состоит из 3 вложенных запросов:

  1. Получаем данные из регистра на каждый день из выбранного периода (красный цвет).
  2. Получаем максимальную дату из регистра сведений "Курсы валют" для каждого дня выбранного периода (синий цвет).
  3. Получаем курс для каждого дня из выбранного периода, зная максимальную дату курса и считаем итоговые значения (зеленый цвет).

 

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

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
ДанныеРигстраВВалюте.sel
.sel 6,49Kb
19.07.16
1
.sel 6,49Kb 1 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. VanDerKeen qwe (VanDerKeen) 09.09.13 13:14
1. "2. Получаем максимальную дату из регистра сведений "Курсы валют" для каждого дня выбранного периода (синий цвет)."
Для этого пункта вложенный запрос в примере не дописан, либо обрезан при размещении.

2. "ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсВалютыОтчета
ПО КурсВалютыОтчета.Период = ДанныеРегистраПериоды.Период"
Тут, наверное, должна быть связь по ДанныеРегистраПериоды.ПериодВалютыОтчета
Прикрепленные файлы:
2. Виталий Онянов (Tavalik) 10.09.13 09:48
(1) Ага, спасибо, пропал кусок кода. Исправил.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа