Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
29 мар 2024, 00:30

Четверг. Вопрос 8

Автор mixqn, 14 мар 2013, 00:42

0 Пользователей и 1 гость просматривают эту тему.

grupenfurer

Для получения значения курса на каждую дату периода необходимо получить срез последних на каждую дату. Для СКД используется соединение двух наборов данных - запросов. Подробное описание с примерами: http://wiki.mista.ru/doku.php?id=1c:v8:srez_poslednix_na_kazhduju_datu_v_zaprose

Срез последних на каждую дату в запросе [WikiMista]

Существует несколько способов получить нужные данные.

Непосредственно в запросе

Способ подходит практически для любой ситуации, и поэтому наиболее универсален. Единственный, пожалуй, минус этого способа - если в отчете пользователю не требуется курс, то запрос быдет выбирать избыточные данные.

Вызов СрезПоследних() можно использовать только с передачей в него заранее готового значения даты, на которую требуется получить значения. Поэтому сабж делается через стыковку нескольких запросов - основной, к нему стыкуется запрос по регистру сведений с условием по дате и поиском записи с маскимальной датой (периодом).

ВЫБРАТЬ
Таб1.СсылкаДок,
Таб1.ДатаДок,
Таб1.ВалютаДок,
Таб2.Курс
ИЗ
(ВЫБРАТЬ
ЗаказПокупателя.Ссылка КАК СсылкаДок,
ЗаказПокупателя.Дата КАК ДатаДок,
ЗаказПокупателя.ВалютаДокумента КАК ВалютаДок,
МАКСИМУМ(Валюты.Период) КАК ПериодДок
ИЗ
Документ.ЗаказПокупателя КАК ЗаказПокупателя
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК Валюты
ПО Валюты.Период <= ЗаказПокупателя.Дата И
Валюты.Валюта = ЗаказПокупателя.ВалютаДокумента
СГРУППИРОВАТЬ ПО
ЗаказПокупателя.Ссылка) КАК Таб1
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК Таб2
ПО Таб1.ПериодДок = Таб2.Период И Таб1.ВалютаДок = Таб2.Валюта

В 8.1. вместо обращения к курсам валют удобнее и надежнее использовать временную таблицу с нужными датами, потому что не во всех организациях ведут курсы валют ежедневно. ;-)

Для общего развития: Что есть срез последних в платформе?

ВЫБРАТЬ
Рег.Период,
Рег.Измерение,
Рег.Ресурс
ИЗ
РегистрСведений.ПериодическийРегистр.СрезПоследних(&Дата) КАК Рег

В зависимости от периодичности регистра (по времени, по позизии регистратора) ВТ разворачивается в следующий запрос:

1. По времени (год, месяц, … секунда)

ВЫБРАТЬ
Таблица3.Ресурс,
Таблица3.Измерение,
Таблица3.Период
ИЗ
(ВЫБРАТЬ
Таблица1.Измерение КАК Измерение,
МАКСИМУМ(Таблица1.Период) КАК Период
ИЗ
РегистрСведений.ПериодическийРегистр КАК Таблица1
ГДЕ
Таблица1.Период <= &Дата
СГРУППИРОВАТЬ ПО
Таблица1.Измерение) КАК Таблица2
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ПериодическийРегистр КАК Таблица3
ПО Таблица2.Измерение= Таблица3.Измерение
И Таблица2.Период = Таблица3.Период

2. По позиции регистратора В данном случае нужно еще раз обернуть выборку

ВЫБРАТЬ
Таблица5.Ресурс,
Таблица5.Измерение,
Таблица5.Период,
Таблица5.Регистратор
ИЗ
(ВЫБРАТЬ
МАКСИМУМ(Таблица3.Регистратор) КАК Регистратор,
Таблица3.Измерение
ИЗ
(ВЫБРАТЬ
Таблица1.Измерение КАК Измерение,
МАКСИМУМ(Таблица1.Период) КАК Период
ИЗ
РегистрСведений.ПериодическийРегистр КАК Таблица1
ГДЕ
Таблица1.Период <= &Дата
СГРУППИРОВАТЬ ПО
Таблица1.Измерение) КАК Таблица2
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ПериодическийРегистр КАК Таблица3
ПО Таблица2.Измерение= Таблица3.Измерение
И Таблица2.Период = Таблица3.Период
СГРУППИРОВАТЬ ПО
Таблица3.Измерение) КАК Таблица4
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ПериодическийРегистр КАК Таблица5
ПО Таблица4.Измерение = Таблица5.Измерение
И Таблица4.Регистратор = Таблица5.Регистратор
И Таблица4.Период= Таблица5.Период // Если документ делает два и более движения в разных
периодах!

Все это можно увидеть посмотрев технологический журнал с включенным режимом протоколирования запросов.

Система компоновки данных

Данный способ подходит для отчетов. Из очевидных плюсов - если курс (или другие данные) не нужны для построения отчета, то СКД не будет их получать. Однако быстродействие такого отчета может оказаться и несколько ниже, чем в первом способе.

Для примера сделаем отчет - список заказов покупателей.

Для этого создадим набор данных «Документы» - запрос:

ВЫБРАТЬ
ЗаказПокупателя.Ссылка КАК ЗаказПокупателя,
ЗаказПокупателя.Дата КАК Дата,
ЗаказПокупателя.ВалютаДокумента КАК ВалютаДокумента,
ЗаказПокупателя.СуммаДокумента КАК СуммаДокумента
{ВЫБРАТЬ
ЗаказПокупателя.*,
Дата,
ВалютаДокумента.*,
СуммаДокумента}
ИЗ
Документ.ЗаказПокупателя КАК ЗаказПокупателя
{ГДЕ
ЗаказПокупателя.Ссылка.* КАК ЗаказПокупателя,
ЗаказПокупателя.СуммаДокумента}

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

defender_aka_linn.users.photofile.ru_photo_defender_aka_linn_150041386_154871726.jpg

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

ВЫБРАТЬ
&Дата КАК Дата,
КурсыВалютСрезПоследних.Валюта КАК Валюта,
КурсыВалютСрезПоследних.Курс КАК Курс,
КурсыВалютСрезПоследних.Кратность КАК Кратность
{ВЫБРАТЬ
Дата,
Валюта.*,
Курс,
Кратность}
ИЗ
РегистрСведений.КурсыВалют.СрезПоследних(&Дата, Валюта = &Валюта) КАК
КурсыВалютСрезПоследних
{ГДЕ
КурсыВалютСрезПоследних.Курс,
КурсыВалютСрезПоследних.Кратность}

В этом запросе имеются 2 параметра: «Дата» и «Валюта». Эти параметры будут установлены СКД при соединении наборов. Кроме того, параметр «Дата» указан в выбранных полях - это нужно для соединения таблиц. В этом запросе необходимо отключить галочку «Автозаполнение». Для ненужный полей «Дата» и «Валюта» также устанавливаем флажки ограничений, чтобы они не появлялись в доступных полях. defender_aka_linn.users.photofile.ru_photo_defender_aka_linn_150041386_154871728.jpg

Перейдем к соединению наборов. На странице «Связи наборов данных» добавим 2 связи: 1. Источник связи - набор «Документы», приемник - набор «Курсы валют». Выражение источник - «Дата», выражение приемник - «Дата», Параметр - «Дата» 2. Источник связи - набор «Документы», приемник - набор «Курсы валют». Выражение источник - «ВалютаДокумента», выражение приемник - «Валюта», Параметр - «Валюта»

defender_aka_linn.users.photofile.ru_photo_defender_aka_linn_150041386_154871729.jpg

Главное здесь - параметры связи. При соединении наборов данных, если указан параметр, СКД передает в подчиненный набор (в нашем случае - запрос «Курсы валют») параметры, указанные в соединении. Значениями параметров будут значения соответствующих полей набора-источника.

Перейдем к вычисляемым полям. Добавим вычисляемое поле «СуммаВВалютеУпрУчета». Выражение поля - «СуммаДокумента * Курс / Кратность».

defender_aka_linn.users.photofile.ru_photo_defender_aka_linn_150041386_154871876.jpg

Также укажем поля «СуммаДокумента» и «СуммаВВалютеУпрУчета» как ресурсы

defender_aka_linn.users.photofile.ru_photo_defender_aka_linn_150041386_154871877.jpg

Настроим отчет. Добавим одну группировку «Детальные записи», в выбранных полях укажем «ЗаказПолкупателя», «Курс» и «Кратность». Добавим ресурсы «СуммаДокумента» и «СуммаВВалютеУпрУчета»

defender_aka_linn.users.photofile.ru_photo_defender_aka_linn_150041386_154871878.jpg

Можно формировать отчет

defender_aka_linn.users.photofile.ru_photo_defender_aka_linn_150041386_154871880.jpg


Санчес

Цитата: mixqn от 14 мар 2013, 00:42Задан некий период. Необходимо в СКД сформировать таблицу со всеми датами из этого периода и значением курса на каждую из дат. Какой механизм необходимо для этого использовать? Какое количество запросов будет в источниках данных СКД?
Для получения такого отчета требуется использовать механизм соединения наборов данных с передачей параметра в "ведомый" набор данных.
В источниках данных будет 2 набора данных, один из которых - запрос, формирующий таблицу дат в выбранном периоде, а второй - запрос, получающий срез курсов валют.
Пример отчета во вложении.

Serge_ASB

два запроса: на выборку дат и на выборку курсов по каждой из дат

Evga

Два запроса, в первом выбираем даты либо через прикладное решение, например, РС РегламентированныйПроизводственныйКалендарь, либо отдельным запросом.
Во втором запросе выбираем курсы, срез последних на дату значение и дата. И затем на закладке Связи наборов данных связываем по дате две запроса. Колонка ВыражениеИсточник = "Дата" и ВыражениеПриемник = "Дата" и Параметр = "Дата". "Дата" - это название параметра и название поля в обоих запросах. Точнее лучше назвать их Период, так как срез последних все равно сформирует параметр Период.
Затем в Ресурсах выбираем Курс и ставим рассчитывать по "Дата".

Smile

1. Из регистра сведений ПРоизводственный календарь получаем все даты периода. - первый запрос
2. Получает курсы валют из соответсвующего регистра - второй запрос.
Устанавливаем передачу параметров между запросами.

Escander

Цитата: mixqn от 14 мар 2013, 00:42Какой механизм необходимо для этого использовать?

связь наборов данных

Цитата: mixqn от 14 мар 2013, 00:42Какое количество запросов будет в источниках данных СКД?

2 запроса.

headmade

В СКД необходимо сделать связь ДВУХ наборов данных (т.е. будет 2 запроса):
В первом формируем список дат, на которые необходимо получить остатки. Эти даты будут передаваться в параметры виртуальных таблиц второго набора данных.
Во втором наборе поучаем данные о курсе валют.
Для связи наборов данных необходимо правильно указать параметры. В этом случае СКД будет передавать в приемник связи параметры, указанные в соединении. В качестве значений, переданных параметров будут выступать значения соответствующих полей источника связи.

kilelena

Один запрос (выводить в таблицу: строки - период, колонки - валюты. прикрепила внешний отчет для БП(2.0.40.10) )
ВЫБРАТЬ
   НАЧАЛОПЕРИОДА(КурсыВалют.Период, ДЕНЬ) КАК Период,
   КурсыВалют.Валюта,
   КурсыВалют.Курс
ИЗ
   РегистрСведений.КурсыВалют КАК КурсыВалют
ГДЕ
   КурсыВалют.Период >= &НачалоПериода
   И КурсыВалют.Период < &КонецПериода

lobster13

Запрос будет один, нужно просто создать группировку по периоду и выбрать тип дополнения день.

no_limits

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

Теги:
Рейтинг@Mail.ru

Поиск