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

20.07.16

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

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

Скачать исходный код

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

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

Параметры: 

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

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

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

 

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

См. также

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

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

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    125081    683    389    

732

Пропорциональное распределение в запросе с использованием АвтоНомерЗаписи()

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

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

11.04.2024    2267    andrey_sag    10    

28

Для чего используют конструкцию запроса "ГДЕ ЛОЖЬ" в СКД на примере конфигурации 1С:ERP

Запросы СКД Платформа 1С v8.3 Запросы Система компоновки данных 1С:ERP Управление предприятием 2 Бесплатно (free)

В типовых конфигурациях разработчики компании 1С иногда используют в отчетах, построенных на СКД, такую конструкцию, как "ГДЕ ЛОЖЬ". Такая конструкция говорит о том, что данные в запросе не будут получены совсем. Для чего же нужен тогда запрос?

13.02.2024    6017    KawaNoNeko    23    

25

Набор-объект для СКД по тексту или запросу

Запросы СКД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Есть список полей в виде текста, или запрос - закидываем в набор СКД.

1 стартмани

31.01.2024    2155    2    Yashazz    0    

31

Запрос 1С copilot

Инструментарий разработчика Запросы Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Пишем на человеческом языке, что нам надо, и получаем текст запроса на языке 1С. Используются большие языковые модели (LLM GPT) от OpenAI или Яндекс на выбор.

5 стартмани

15.01.2024    6652    31    mkalimulin    27    

52

PrintWizard: поддержка представлений ЗУП в конструкторе

Инструментарий разработчика Запросы Платформа 1С v8.3 Бесплатно (free)

Одной из интересных задач, стоящих в процессе разработки, была поддержка механизма представлений в ЗУП. Но не просто возможность исполнения запросов с ними. Основная проблема была в том, чтобы с ними было удобно работать, а именно: создавать, модифицировать и отлаживать. Кратко о том, что в итоге получилось...

14.12.2023    1888    vandalsvq    7    

29

Объектная модель запроса "Схема запроса" 2

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

Далеко уже не новый тип данных "Схема запроса". Статья о том, как использовать его "попроще". Примеры создания текста запроса с нуля и изменение имеющегося запроса.

06.12.2023    5631    user1923546    26    

46

Начните уже использовать хранилище запросов

HighLoad оптимизация Запросы

Очень немногие из тех, кто занимается поддержкой MS SQL, работают с хранилищем запросов. А ведь хранилище запросов – это очень удобный, мощный и, главное, бесплатный инструмент, позволяющий быстро найти и локализовать проблему производительности и потребления ресурсов запросами. В статье расскажем о том, как использовать хранилище запросов в MS SQL и какие плюсы и минусы у него есть.

11.10.2023    16611    skovpin_sa    14    

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

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