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

20.07.16

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

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

Файлы

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

Наименование Скачано Купить файл
ДанныеРигстраВВалюте.sel
.sel 6,49Kb
2 2 500 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

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

Параметры: 

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

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

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

 

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

Вступайте в нашу телеграмм-группу Инфостарт

См. также

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

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

16500 руб.

02.09.2020    253820    1400    421    

1152

WEB-интеграция Запросы Программист 1С 8.3 Абонемент ($m)

Post1C - это внешняя обработка, которая превращает 1С в полноценный инструмент для тестирования REST API. Всё управление сосредоточено в одном окне: настройка запроса, выполнение, просмотр ответа и генерация кода - без переключения между формами. Аналог Postman, но работающий в привычной среде 1С.

1 стартмани

02.04.2026    1633    56    priem_nv    18    

59

Инструментарий разработчика Запросы Программист 1С:Предприятие 8 1С:Зарплата и кадры государственного учреждения 3 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

QueryConsole1C — расширение, включающее консоль запросов с поддержкой исполняемых представлений — аналогов виртуальных таблиц, основанных на методах программного интерфейса ЗУП. Оно позволяет выполнять запросы с учётом встроенной бизнес-логики, отлаживать алгоритмы получения данных и автоматически генерировать код на встроенном языке 1С.

1 стартмани

16.05.2025    10661    142    zup_dev    30    

82

Инструментарий разработчика Запросы Программист 1С:Предприятие 8 1С:ERP Управление предприятием 2 Абонемент ($m)

В данной публикации рассказывается о решении, которое позволяет находить сразу все ошибки в тексте запроса за раз, а не только самую первую.

2 стартмани

05.03.2025    6293    21    XilDen    12    

29

Обновление 1С Запросы Программист 1С:Предприятие 8 1С:ERP Управление предприятием 2 Абонемент ($m)

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

3 стартмани

06.02.2025    5535    36    XilDen    26    

42

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

В статье приведена удобная возможность отладки исполняемого запроса динамического списка.

03.12.2024    12569    artemusII    11    

27

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

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

18.10.2024    22506    sergey279    18    

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

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