вторник, 9 июля 2019 г.

Связь наборов данных через параметр в СКД

В схеме компоновки данных можно использовать несколько наборов данных. При этом на них можно устанавливать отношения (связи), которые в общем случае являются аналогом  операции ЛЕВОЕ СОЕДИНЕНИЕ языка запросов.


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

Как раз возможность использования параметра в описании связи наборов данных демонстрирует эта беседа.


Пример 1. Отчет Получение последних по дате N курсов всех валют

Используется конфигурация Управление торговлей.

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

Запрос

ВЫБРАТЬ
Курсы.Валюта КАК Валюта,
Курсы.Период КАК Период,
Курсы.Курс
ИЗ
РегистрСведений.КурсыВалют КАК Курсы
ГДЕ
Курсы.Период В
(ВЫБРАТЬ ПЕРВЫЕ 20
Курсы2.Период
ИЗ
РегистрСведений.КурсыВалют КАК Курсы2
ГДЕ
Курсы2.Валюта = Курсы.Валюта
УПОРЯДОЧИТЬ ПО
Курсы2.Период УБЫВ)
УПОРЯДОЧИТЬ ПО
Курсы.Валюта.Наименование,
Период УБЫВ
ИТОГИ ПО
Валюта

в конструкторе создадим 2 набора данных



с 2 простыми запросами

      
ВЫБРАТЬ
Валюты.Ссылка КАК Ссылка
ИЗ
Справочник.Валюты КАК Валюты

и 

ВЫБРАТЬ ПЕРВЫЕ 20
КурсыВалют.Период КАК Период,
КурсыВалют.Валюта КАК Валюта,
КурсыВалют.Курс КАК Курс,
КурсыВалют.Кратность КАК Кратность
ИЗ
РегистрСведений.КурсыВалют КАК КурсыВалют
ГДЕ
КурсыВалют.Валюта = &парамВалюта

УПОРЯДОЧИТЬ ПО
Период УБЫВ


на вкладке связи наборов данных установим связь между этими двумя наборами


В результате получили тоже самое что и в запросе.


Пример 2. Отчет Расчет выручки по датам в разных валютах

Используется конфигурация Управление торговлей.

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

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



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

Если валюта только одна, то задача решается запросом относительно просто - используется тэта-соединение и для множества дат получается ближайший курс на каждую дату. Но, если валют несколько (в общем случае - все валюты из справочника Валюты), то запрос может сильно усложниться.
Используя в СКД связь двух наборов данных через параметр, удается решить эту задачу весьма просто и эффектно.

Пример также демонстрирует прием разработки схемы компоновки данных, который можно условно назвать искусственный реквизит - когда физически независимое доступное поле схемы компоновки данных объявляется как доступное через точку от другого поля.

Шаг 1

Запрос, получающий курсы одной валюты на множество дат. Затруднительность решения задачи одним запросом при наличии множества валют.

ВЫБРАТЬ
ВыручкаИСебестоимостьПродажОбороты.Период КАК ДатаВыручки,
ВыручкаИСебестоимостьПродажОбороты.СуммаВыручкиОборот КАК СуммаВыручки
ПОМЕСТИТЬ ВыручкаПоДням
ИЗ
РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты(, , День, ) КАК ВыручкаИСебестоимостьПродажОбороты
;

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

СГРУППИРОВАТЬ ПО
ВыручкаПоДням.ДатаВыручки
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
КурсыВалют.Период КАК Период,
КурсыВалют.Валюта,
КурсыВалют.Курс,
КурсыВалют.Кратность
ПОМЕСТИТЬ Курсы
ИЗ
РегистрСведений.КурсыВалют КАК КурсыВалют
ГДЕ
КурсыВалют.Валюта = &парамВалюта

ИНДЕКСИРОВАТЬ ПО
Период
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВыручкаПоДням.ДатаВыручки КАК ДатаВыручки,
ВыручкаПоДням.СуммаВыручки,
БлижайшаяСнизуДатаКурса.ДатаКурса,
Курсы.Курс,
Курсы.Кратность,
ВыручкаПоДням.СуммаВыручки / Курсы.Курс * Курсы.Кратность КАК СуммаВВалюте
ИЗ
ВыручкаПоДням КАК ВыручкаПоДням
ВНУТРЕННЕЕ СОЕДИНЕНИЕ БлижайшаяСнизуДатаКурса КАК БлижайшаяСнизуДатаКурса
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Курсы КАК Курсы
ПО БлижайшаяСнизуДатаКурса.ДатаКурса = Курсы.Период
ПО ВыручкаПоДням.ДатаВыручки = БлижайшаяСнизуДатаКурса.ДатаВыручки

УПОРЯДОЧИТЬ ПО
ДатаВыручки


Шаг 2

Разработка двух наборов данных в СКД запросы, параметры запросов.






Задание связи наборов данных. Искусственное поле связи набора-приемника - параметр связи.


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

Шаг 3
Проставляем правильные параметры


Добавляем в ресурсы СуммуВыручки


Настраиваем выводимые поля



После небольших улучшений мы получаем что то похожее на


Уберем поле сумма выручки , а саму сумму подтянем к дате, сделаем разыменование поля 


меняем и ресурс


еще немного подкрутим настройки и получаем 




Пример 3. Группировка в отчете по наивысшему уровню иерархии

Используется демоконфигурация Управляемое приложение.

Есть задача. Имеется иерархический объект (справочник, план видов характеристик, план счетов) с произвольно глубоким уровнем вложенности групповых элементов. Требуется в отчете показать элементы всех уровней по принадлежности к самому высшему уровню иерархии объекта. Например, справочник Номенклатура имеет группу высшего уровня Электротовары и еще несколько групп. В группе Электротовары есть группы второго уровня, далее группы третьего уровня , и т. п., неограниченно. В каждой группе могут быть как элементы, так и дочерние группы.


Нужно показать в отчете все товары, являющиеся потомками группы Электротовары в любом поколении, как подчиненные группе Электротовары.


Такая задача может возникнуть, к примеру, в бухучете (приведение всех субсчетов к счету-группе высшего уровня), либо в кадровом учете (вывод списка сотрудников в подчинении подразделениям самого верхнего уровня).


Шаг 1
Отберем группы верхнего уровня. Основным критерем котрого будет то что верхние уровни не имеюют родителя, условия которое налдожем на запрос :

ВЫБРАТЬ
Товары.Ссылка КАК Группа
ИЗ
Справочник.Товары КАК Товары
ГДЕ
Товары.ЭтоГруппа
И Товары.Родитель = ЗНАЧЕНИЕ(Справочник.Товары.ПустаяСсылка)


Создадим второй набор данных

ВЫБРАТЬ
    &ПарамСсылка как Группа,
Товары.Ссылка КАК Ссылка
ИЗ
Справочник.Товары КАК Товары
ГДЕ
Товары.Ссылка В ИЕРАРХИИ(&ПарамСсылка)
И НЕ Товары.ЭтоГруппа


Шаг 2
Создаем связь наборов данных


На каждое значение ссылки на группу с источника связи который будет передаваться в параметр, будет выполнятся запрос приемника

КАК ЭТО РАБОТАЕТ???

для понимания посмотрим на схему как отрабатывает эта схема 




Комментариев нет:

Отправить комментарий

Печать чека ККМ из драйвера ККМ

Суть проблемы: Пробиваем чек из 1С: Бухгалтерии. Чек пробит не  правильно. Теперь нужно сделать чек коррекции. Но в программе это сделать н...