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

20.07.16

Разработка - Запросы

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
ДанныеРигстраВВалюте.sel
.sel 6,49Kb
2
2 Скачать (1 SM) Купить за 1 850 руб.

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

Параметры: 

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

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

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

 

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

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

12000 руб.

02.09.2020    171898    962    403    

924

Запросы Программист Бесплатно (free)

Увидел cheatsheet по SQL и захотелось нарисовать подобное, но про запросы.

18.10.2024    11745    sergey279    18    

65

Запросы Программист Платформа 1С v8.3 Запросы 1C:Бухгалтерия Бесплатно (free)

Столкнулся с интересной ситуацией, которую хотел бы разобрать, ввиду её неочевидности. Речь пойдёт про использование функции запроса АВТОНОМЕРЗАПИСИ() и проблемы, которые могут возникнуть.

11.10.2024    6696    XilDen    36    

83

Запросы Программист Запросы Бесплатно (free)

Отлаживая взаимодействие с базой данных, мы регулярно сталкиваемся с зависающими или подозрительно долго выполняющимися обращениями, негативно влияющими на производительность. О том, как в PostgreSQL выявить подозрительные запросы, основываясь на доступной о них информации, расскажем в статье.

16.08.2024    9374    user1840182    5    

28

Математика и алгоритмы Запросы Программист Платформа 1С v8.3 Запросы Бесплатно (free)

Рассмотрим быстрый алгоритм поиска дублей с использованием hash функции по набору полей шапки и табличных частей.

08.07.2024    2808    ivanov660    9    

22

Запросы СКД Программист Стажер Система компоновки данных Россия Бесплатно (free)

Часто при разработке отчетов в СКД возникает ситуация, когда не совсем понятно, почему отчет выводит не те данные, которые нужны, либо не выводит вовсе. Возникает потребность увидеть конечный запрос, который формирует СКД. Как это сделать, рассмотрим в этой статье.

15.05.2024    10687    implecs_team    6    

48

Запросы Программист Стажер Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Часто поступают задачи по произвольному распределению общих сумм. После распределения иногда пропадают копейки. Суть решения добавить АвтоНомерЗаписи() в ВТ распределения, и далее используя функции МАКСИМУМ или МИНИМУМ можем положить разницу копеек в первую или последнюю строку знаменателя распределения.

11.04.2024    3679    andrey_sag    10    

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

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