В схеме компоновки данных можно использовать несколько наборов данных. При этом на них можно устанавливать отношения (связи), которые в общем случае являются аналогом операции ЛЕВОЕ СОЕДИНЕНИЕ языка запросов.
Но связь наборов данных в СКД имеет больше функциональных возможностей, чем просто операции отношения. В частности, очень большие возможности получения соотнесенных данных открывает связь наборов данных с использованием параметра.
Как раз возможность использования параметра в описании связи наборов данных демонстрирует эта беседа.
Пример 1. Отчет Получение последних по дате N курсов всех валют
Используется конфигурация Управление торговлей.
Для решения подобной задачи часто используют так называемый коррелированный запрос. Пример 1 показывает, как в схеме компоновки данных можно обойтись без коррелированного запроса, используя связь двух наборов данных с применением параметра.
Запрос
ВЫБРАТЬ
Курсы.Валюта КАК Валюта,
Курсы.Период КАК Период,
Курсы.Курс
ИЗ
РегистрСведений.КурсыВалют КАК Курсы
ГДЕ
Курсы.Период В
(ВЫБРАТЬ ПЕРВЫЕ 20
Курсы2.Период
ИЗ
РегистрСведений.КурсыВалют КАК Курсы2
ГДЕ
Курсы2.Валюта = Курсы.Валюта
УПОРЯДОЧИТЬ ПО
Курсы2.Период УБЫВ)
УПОРЯДОЧИТЬ ПО
Курсы.Валюта.Наименование,
Период УБЫВ
ИТОГИ ПО
Валюта
в конструкторе создадим 2 набора данных
с 2 простыми запросами
В результате получили тоже самое что и в запросе.
Пример 2. Отчет Расчет выручки по датам в разных валютах
Используется конфигурация Управление торговлей.
Задача на первый взгляд простая есть виртуальная таблица Обороты выручки в рублях по дням, есть справочник Валюты, есть периодический регистр сведений КурсыВалют; нужно, разделив сумму выручки за день в рублях на курс каждой валюты на этот день, получить дневную сумму выручки в этой валюте...
Но трудность в том, что в регистре сведений КурсыВалют есть курсы не на каждую дату, а в этом случае нужно брать курс на ближайшую снизу дату - т. н. срез последних.
Виртуальная таблица СрезПоследних периодического регистра сведений может за один сеанс обращения к ней получить ближайшие к заданной дате курсы всех валют. Но в параметре виртуальной таблицы можно передать лишь одну дату, а нам нужны ближайшие курсы на множество дат - на столько, сколько дат содержит таблица оборотов выручки.
Если валюта только одна, то задача решается запросом относительно просто - используется тэта-соединение и для множества дат получается ближайший курс на каждую дату. Но, если валют несколько (в общем случае - все валюты из справочника Валюты), то запрос может сильно усложниться.
Используя в СКД связь двух наборов данных через параметр, удается решить эту задачу весьма просто и эффектно.
Пример также демонстрирует прием разработки схемы компоновки данных, который можно условно назвать искусственный реквизит - когда физически независимое доступное поле схемы компоновки данных объявляется как доступное через точку от другого поля.
Шаг 1
Запрос, получающий курсы одной валюты на множество дат. Затруднительность решения задачи одним запросом при наличии множества валют.
ВЫБРАТЬ
ВыручкаИСебестоимостьПродажОбороты.Период КАК ДатаВыручки,
ВыручкаИСебестоимостьПродажОбороты.СуммаВыручкиОборот КАК СуммаВыручки
ПОМЕСТИТЬ ВыручкаПоДням
ИЗ
РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты(, , День, ) КАК ВыручкаИСебестоимостьПродажОбороты
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВыручкаПоДням.ДатаВыручки КАК ДатаВыручки,
МАКСИМУМ(КурсыВалют.Период) КАК ДатаКурса
ПОМЕСТИТЬ БлижайшаяСнизуДатаКурса
ИЗ
РегистрСведений.КурсыВалют КАК КурсыВалют
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВыручкаПоДням КАК ВыручкаПоДням
ПО КурсыВалют.Период <= ВыручкаПоДням.ДатаВыручки
ГДЕ
КурсыВалют.Валюта = &парамВалюта
СГРУППИРОВАТЬ ПО
ВыручкаПоДням.ДатаВыручки
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
КурсыВалют.Период КАК Период,
КурсыВалют.Валюта,
КурсыВалют.Курс,
КурсыВалют.Кратность
ПОМЕСТИТЬ Курсы
ИЗ
РегистрСведений.КурсыВалют КАК КурсыВалют
ГДЕ
КурсыВалют.Валюта = &парамВалюта
ИНДЕКСИРОВАТЬ ПО
Период
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВыручкаПоДням.ДатаВыручки КАК ДатаВыручки,
ВыручкаПоДням.СуммаВыручки,
БлижайшаяСнизуДатаКурса.ДатаКурса,
Курсы.Курс,
Курсы.Кратность,
ВыручкаПоДням.СуммаВыручки / Курсы.Курс * Курсы.Кратность КАК СуммаВВалюте
ИЗ
ВыручкаПоДням КАК ВыручкаПоДням
ВНУТРЕННЕЕ СОЕДИНЕНИЕ БлижайшаяСнизуДатаКурса КАК БлижайшаяСнизуДатаКурса
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Курсы КАК Курсы
ПО БлижайшаяСнизуДатаКурса.ДатаКурса = Курсы.Период
ПО ВыручкаПоДням.ДатаВыручки = БлижайшаяСнизуДатаКурса.ДатаВыручки
УПОРЯДОЧИТЬ ПО
ДатаВыручки
Шаг 2
Разработка двух наборов данных в СКД запросы, параметры запросов.
Задание связи наборов данных. Искусственное поле связи набора-приемника - параметр связи.
Для каждой записи источника связи т.е. первого набора будет выполняться следующее, поле датавыручки будет передаваться во второй набор в параметр парамДатаВыручки, будет выполняться связывание записей этих 2 наборов, а перд этим будет поучаться виртуальная таблица на эту дату
Шаг 3
Проставляем правильные параметры
Добавляем в ресурсы СуммуВыручки
Настраиваем выводимые поля
После небольших улучшений мы получаем что то похожее на
Пример 3. Группировка в отчете по наивысшему уровню иерархии
Используется демоконфигурация Управляемое приложение.
Есть задача. Имеется иерархический объект (справочник, план видов характеристик, план счетов) с произвольно глубоким уровнем вложенности групповых элементов. Требуется в отчете показать элементы всех уровней по принадлежности к самому высшему уровню иерархии объекта. Например, справочник Номенклатура имеет группу высшего уровня Электротовары и еще несколько групп. В группе Электротовары есть группы второго уровня, далее группы третьего уровня , и т. п., неограниченно. В каждой группе могут быть как элементы, так и дочерние группы.
Нужно показать в отчете все товары, являющиеся потомками группы Электротовары в любом поколении, как подчиненные группе Электротовары.
Такая задача может возникнуть, к примеру, в бухучете (приведение всех субсчетов к счету-группе высшего уровня), либо в кадровом учете (вывод списка сотрудников в подчинении подразделениям самого верхнего уровня).
Шаг 1
Отберем группы верхнего уровня. Основным критерем котрого будет то что верхние уровни не имеюют родителя, условия которое налдожем на запрос :
ВЫБРАТЬ
Товары.Ссылка КАК Группа
ИЗ
Справочник.Товары КАК Товары
ГДЕ
Товары.ЭтоГруппа
И Товары.Родитель = ЗНАЧЕНИЕ(Справочник.Товары.ПустаяСсылка)
Создадим второй набор данных
ВЫБРАТЬ
&ПарамСсылка как Группа,
Товары.Ссылка КАК Ссылка
ИЗ
Справочник.Товары КАК Товары
ГДЕ
Товары.Ссылка В ИЕРАРХИИ(&ПарамСсылка)
И НЕ Товары.ЭтоГруппа
Шаг 2
Но связь наборов данных в СКД имеет больше функциональных возможностей, чем просто операции отношения. В частности, очень большие возможности получения соотнесенных данных открывает связь наборов данных с использованием параметра.
Как раз возможность использования параметра в описании связи наборов данных демонстрирует эта беседа.
Пример 1. Отчет Получение последних по дате N курсов всех валют
Используется конфигурация Управление торговлей.
Для решения подобной задачи часто используют так называемый коррелированный запрос. Пример 1 показывает, как в схеме компоновки данных можно обойтись без коррелированного запроса, используя связь двух наборов данных с применением параметра.
Запрос
ВЫБРАТЬ
Курсы.Валюта КАК Валюта,
Курсы.Период КАК Период,
Курсы.Курс
ИЗ
РегистрСведений.КурсыВалют КАК Курсы
ГДЕ
Курсы.Период В
(ВЫБРАТЬ ПЕРВЫЕ 20
Курсы2.Период
ИЗ
РегистрСведений.КурсыВалют КАК Курсы2
ГДЕ
Курсы2.Валюта = Курсы.Валюта
УПОРЯДОЧИТЬ ПО
Курсы2.Период УБЫВ)
УПОРЯДОЧИТЬ ПО
Курсы.Валюта.Наименование,
Период УБЫВ
ИТОГИ ПО
Валюта
в конструкторе создадим 2 набора данных
с 2 простыми запросами
ВЫБРАТЬ
Валюты.Ссылка КАК Ссылка
ИЗ
Справочник.Валюты КАК Валюты
и
ВЫБРАТЬ ПЕРВЫЕ 20
КурсыВалют.Период КАК Период,
КурсыВалют.Валюта КАК Валюта,
КурсыВалют.Курс КАК Курс,
КурсыВалют.Кратность КАК Кратность
ИЗ
РегистрСведений.КурсыВалют КАК КурсыВалют
ГДЕ
КурсыВалют.Валюта = &парамВалюта
УПОРЯДОЧИТЬ ПО
Период УБЫВ
на вкладке связи наборов данных установим связь между этими двумя наборами
Пример 2. Отчет Расчет выручки по датам в разных валютах
Используется конфигурация Управление торговлей.
Задача на первый взгляд простая есть виртуальная таблица Обороты выручки в рублях по дням, есть справочник Валюты, есть периодический регистр сведений КурсыВалют; нужно, разделив сумму выручки за день в рублях на курс каждой валюты на этот день, получить дневную сумму выручки в этой валюте...
Но трудность в том, что в регистре сведений КурсыВалют есть курсы не на каждую дату, а в этом случае нужно брать курс на ближайшую снизу дату - т. н. срез последних.
Виртуальная таблица СрезПоследних периодического регистра сведений может за один сеанс обращения к ней получить ближайшие к заданной дате курсы всех валют. Но в параметре виртуальной таблицы можно передать лишь одну дату, а нам нужны ближайшие курсы на множество дат - на столько, сколько дат содержит таблица оборотов выручки.
Если валюта только одна, то задача решается запросом относительно просто - используется тэта-соединение и для множества дат получается ближайший курс на каждую дату. Но, если валют несколько (в общем случае - все валюты из справочника Валюты), то запрос может сильно усложниться.
Используя в СКД связь двух наборов данных через параметр, удается решить эту задачу весьма просто и эффектно.
Пример также демонстрирует прием разработки схемы компоновки данных, который можно условно назвать искусственный реквизит - когда физически независимое доступное поле схемы компоновки данных объявляется как доступное через точку от другого поля.
Шаг 1
Запрос, получающий курсы одной валюты на множество дат. Затруднительность решения задачи одним запросом при наличии множества валют.
ВЫБРАТЬ
ВыручкаИСебестоимостьПродажОбороты.Период КАК ДатаВыручки,
ВыручкаИСебестоимостьПродажОбороты.СуммаВыручкиОборот КАК СуммаВыручки
ПОМЕСТИТЬ ВыручкаПоДням
ИЗ
РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты(, , День, ) КАК ВыручкаИСебестоимостьПродажОбороты
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВыручкаПоДням.ДатаВыручки КАК ДатаВыручки,
МАКСИМУМ(КурсыВалют.Период) КАК ДатаКурса
ПОМЕСТИТЬ БлижайшаяСнизуДатаКурса
ИЗ
РегистрСведений.КурсыВалют КАК КурсыВалют
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВыручкаПоДням КАК ВыручкаПоДням
ПО КурсыВалют.Период <= ВыручкаПоДням.ДатаВыручки
ГДЕ
КурсыВалют.Валюта = &парамВалюта
СГРУППИРОВАТЬ ПО
ВыручкаПоДням.ДатаВыручки
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
КурсыВалют.Период КАК Период,
КурсыВалют.Валюта,
КурсыВалют.Курс,
КурсыВалют.Кратность
ПОМЕСТИТЬ Курсы
ИЗ
РегистрСведений.КурсыВалют КАК КурсыВалют
ГДЕ
КурсыВалют.Валюта = &парамВалюта
ИНДЕКСИРОВАТЬ ПО
Период
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВыручкаПоДням.ДатаВыручки КАК ДатаВыручки,
ВыручкаПоДням.СуммаВыручки,
БлижайшаяСнизуДатаКурса.ДатаКурса,
Курсы.Курс,
Курсы.Кратность,
ВыручкаПоДням.СуммаВыручки / Курсы.Курс * Курсы.Кратность КАК СуммаВВалюте
ИЗ
ВыручкаПоДням КАК ВыручкаПоДням
ВНУТРЕННЕЕ СОЕДИНЕНИЕ БлижайшаяСнизуДатаКурса КАК БлижайшаяСнизуДатаКурса
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Курсы КАК Курсы
ПО БлижайшаяСнизуДатаКурса.ДатаКурса = Курсы.Период
ПО ВыручкаПоДням.ДатаВыручки = БлижайшаяСнизуДатаКурса.ДатаВыручки
УПОРЯДОЧИТЬ ПО
ДатаВыручки
Разработка двух наборов данных в СКД запросы, параметры запросов.
Задание связи наборов данных. Искусственное поле связи набора-приемника - параметр связи.
Для каждой записи источника связи т.е. первого набора будет выполняться следующее, поле датавыручки будет передаваться во второй набор в параметр парамДатаВыручки, будет выполняться связывание записей этих 2 наборов, а перд этим будет поучаться виртуальная таблица на эту дату
Шаг 3
Проставляем правильные параметры
Добавляем в ресурсы СуммуВыручки
Настраиваем выводимые поля
После небольших улучшений мы получаем что то похожее на
Уберем поле сумма выручки , а саму сумму подтянем к дате, сделаем разыменование поля
меняем и ресурс
еще немного подкрутим настройки и получаем
Пример 3. Группировка в отчете по наивысшему уровню иерархии
Используется демоконфигурация Управляемое приложение.
Есть задача. Имеется иерархический объект (справочник, план видов характеристик, план счетов) с произвольно глубоким уровнем вложенности групповых элементов. Требуется в отчете показать элементы всех уровней по принадлежности к самому высшему уровню иерархии объекта. Например, справочник Номенклатура имеет группу высшего уровня Электротовары и еще несколько групп. В группе Электротовары есть группы второго уровня, далее группы третьего уровня , и т. п., неограниченно. В каждой группе могут быть как элементы, так и дочерние группы.
Нужно показать в отчете все товары, являющиеся потомками группы Электротовары в любом поколении, как подчиненные группе Электротовары.
Такая задача может возникнуть, к примеру, в бухучете (приведение всех субсчетов к счету-группе высшего уровня), либо в кадровом учете (вывод списка сотрудников в подчинении подразделениям самого верхнего уровня).
Шаг 1
Отберем группы верхнего уровня. Основным критерем котрого будет то что верхние уровни не имеюют родителя, условия которое налдожем на запрос :
ВЫБРАТЬ
Товары.Ссылка КАК Группа
ИЗ
Справочник.Товары КАК Товары
ГДЕ
Товары.ЭтоГруппа
И Товары.Родитель = ЗНАЧЕНИЕ(Справочник.Товары.ПустаяСсылка)
Создадим второй набор данных
ВЫБРАТЬ
&ПарамСсылка как Группа,
Товары.Ссылка КАК Ссылка
ИЗ
Справочник.Товары КАК Товары
ГДЕ
Товары.Ссылка В ИЕРАРХИИ(&ПарамСсылка)
И НЕ Товары.ЭтоГруппа
Комментариев нет:
Отправить комментарий