Приветствую Вас ГостьВоскресенье, 19.05.2024, 03:42

Каталог статей


Связи наборов данных

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

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

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

Настройка связи.

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

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

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

 

Если дочерний набор имеет параметр в запросе (например условие отбора по ссылке), то можно выбрать его в поле "Параметр". При выполнении отчета в параметр дочернего запроса, который указан в поле "Параметр", будет передаваться значение связи источника (поле "Источник связи").

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

Другие особенности:

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

Связь наборов данных по периодам.

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

Для реализации такого отчета в схеме компоновки данных создано два набора данных:

  • набор данных Остатки с остатками товаров по периодам,
  • набор данных Продажи с продажами товаров за период.

Исходные запросы наборов данных:

Для набора "Остатки":

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

Для набора "Продажи"

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

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

Для набора "Остатки":

ВЫБРАТЬ
    ОстаткиНоменклатурыОстаткиИОбороты.Период КАК НачалоПериода,
    КОНЕЦПЕРИОДА(ОстаткиНоменклатурыОстаткиИОбороты.Период, МЕСЯЦ) КАК КонецПериода,

    ОстаткиНоменклатурыОстаткиИОбороты.Номенклатура,
    ОстаткиНоменклатурыОстаткиИОбороты.КоличествоНачальныйОстаток КАК НачальныйОстаток,
    ОстаткиНоменклатурыОстаткиИОбороты.КоличествоКонечныйОстаток КАК КонечныйОстаток
ИЗ
    РегистрНакопления.ОстаткиНоменклатуры.ОстаткиИОбороты(, , Месяц, , ) КАК ОстаткиНоменклатурыОстаткиИОбороты

Для набора "Продажи":

ВЫБРАТЬ
    &НачалоПериодаПродаж КАК НачалоПериода,
    &КонецПериодаПродаж КАК КонецПериода,

    ПродажиОбороты.Номенклатура,
    ПродажиОбороты.КоличествоОборот КАК Количество  
ИЗ
    РегистрНакопления.Продажи.Обороты(&НачалоПериодаПродаж, &КонецПериодаПродаж, , ) КАК ПродажиОбороты

Теперь нужно обеспечить связь наборов данных Остатки и Продажи по номенклатуре и полям периодов. На закладке Связи наборов данных создаются три связи между наборами Остатки и Продажи.

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

 

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

Расчет итогов при связи нескольких наборов

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

Например надо связать 2 запроса:

1) Остатки в разрезе складов:

ВЫБРАТЬ
    ОстаткиНоменклатурыОстатки.Номенклатура,
    ОстаткиНоменклатурыОстатки.Склад,
    ОстаткиНоменклатурыОстатки.КоличествоОстаток
ИЗ
    РегистрНакопления.ОстаткиНоменклатуры.Остатки КАК ОстаткиНоменклатурыОстатки

Результат запроса:

2) Продажи по номенклатуре

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

Результат запроса:

Если просто объединить 2 запроса, то получим:

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

 

Если объединим их через связь наборов, то получим:

 

Во втором случае итоги не будут задвоены из за того, что Монитор есть на разных складах.

 

Категория: СКД | Добавил: leshic (22.11.2021)
Просмотров: 1527 | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *:
Вход на сайт
Поиск
Категории раздела
СКД [48]
Регистры [7]
Формы [41]
Администрирование [35]
Запросы [10]
Объекты конфигурации и типы данных [20]
Взаимодействие с другими базами, приложениями и источниками данных [16]
Программирование [29]
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0