System Analysis and Design
IT Standards
August 2017 29

XBRL: просто о сложном − Глава 6. Погружение в XBRL − Часть 5. Новые измерения

Original author: Jos van der Heiden, Batavia XBRL BV
Translation

6.5. Новые измерения


В предыдущих разделах мы достигли значительных успехов в представлении отчетной формы из нашего примера в виде отчета XBRL, но полного соответствия так и не получили. Сегодня на одного из наших разработчиков снизошло озарение: А давайте попробуем применить XBRL Dimensions!


При взгляде на Главу 5 становится очевидно, что гендерные и возрастные группы могут быть представлены в виде измерений.


Базовая таксономия, создаваемая нами до сих пор, достигла версии sample-2006-01-05.xsd. Мы определим элементы доменов (domain member) и шаблоны (template) в отдельной таксономии sample-2006-01-05-dimension.xsd.


6.5.1. Базовые концепты


Как и следовало ожидать, мы можем упростить нашу таксономию. Базовый концепт, который нам необходим – nr_employees. Однако, мы будем представлять его в различных контекстах измерений, также нам надо указать в отчете общее количество сотрудников в контексте без измерений. Для этих целей мы определим концепты nr_employees_by_gender, nr_employees_by_age и nr_employees_total, указав для них nr_employees в качестве значения атрибута substitutionGroup.


<element
  id="sample_nr_employees"
  name="nr_employees"
  xbrli:periodType="instant"
  type="xbrli:nonNegativeIntegerItemType"
  substitutionGroup="xbrli:item"
  nillable="true" />
<element
  id="sample_nr_employees_by_gender"
  name="nr_employees_by_gender"
  xbrli:periodType="instant"
  type="xbrli:nonNegativeIntegerItemType"
  substitutionGroup="sample:nr_employees"
  nillable="true" />
<element
  id="sample_nr_employees_by_age"
  name="nr_employees_by_age"
  xbrli:periodType="instant"
  type="xbrli:nonNegativeIntegerItemType"
  substitutionGroup="sample:nr_employees"
  nillable="true" />
<element
  id="sample_nr_employees_total"
  name="nr_employees_total"
  xbrli:periodType="instant"
  type="xbrli:nonNegativeIntegerItemType"
  substitutionGroup="sample:nr_employees"
  nillable="true" />

Факты о количестве сотрудников будут представлены в разрезе нескольких измерений с использованием разных подстановок (substitutions) nr_employees для разделения измерений (и презентаций).


6.5.2. Таксономия шаблонов (template taxonomy)


Элементы доменов и таксономия шаблонов объединены в общую схему таксономии. Таксономия шаблонов импортирует несколько других схем:


<import
  namespace="http://www.xbrl.org/2003/instance"
  schemaLocation="http://www.xbrl.org/2003/xbrl-instance-2003-12-31.xsd" />
<import
  namespace="http://xbrl.org/2005/xbrldt"
  schemaLocation="http://www.xbrl.org/2005/xbrldt-2005.xsd" />
<import
  namespace="http://xbrl.org/2006/xbrldi"
  schemaLocation="http://www.xbrl.org/2006/xbrldi-2006.xsd" />
<import
  namespace="http://www.sample.com/2006-01-05"
  schemaLocation="http://www.sample.com/2006-01-05/sample-2006-01-05.xsd" />

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


6.5.3. Типизированное измерение


Как мы знаем, существуют два типа измерений – типизированные и явные. В этом разделе мы рассмотрим, как возрастные группы могут быть представлены в виде типизированного измерения.


Прежде всего, нам нужен элемент для определения типа для age_group. Мы будем использовать простой тип с перечислением допустимых значений:


<element
  id="sample_age_group_type"
  name="age_group_type">
  <simpleType>
    <restriction base="string">
      <enumeration value=".. - 20" />
      <enumeration value="21 - 40" />
      <enumeration value="41 - .." />
    </restriction>
  </simpleType>
</element>

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


<element
  id="sample_dim_age_group"    
  name="dim_age_group"
  substitutionGroup="xbrldt:dimensionItem"    
  type="xbrli:stringItemType"    
  abstract="true"    
  xbrli:periodType="instant"    
  xbrldt:typedDomainRef="#sample_age_group_type" />

Обратите внимание, что элемент абстрактный, что является обязательным требованием. Значением атрибута substitutionGroup указывается xbrldt:dimensionItem.


6.5.4. Явное измерение


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


<element
  id="sample_dim_gender"
  name="dim_gender"
  substitutionGroup="xbrldt:dimensionItem"
  type="xbrli:stringItemType"
  abstract="true"
  xbrli:periodType="instant" />
<element
  id="sample_gender"
  name="gender"
  xbrli:periodType="instant"
  type="xbrli:stringItemType"
  substitutionGroup="xbrli:item"
  nillable="true" />
<element
  id="sample_male"
  name="male"
  xbrli:periodType="instant"
  type="xbrli:stringItemType"
  substitutionGroup="xbrli:item"
  nillable="true" />
<element
  id="sample_female"
  name="female"
  xbrli:periodType="instant"
  type="xbrli:stringItemType"
  substitutionGroup="xbrli:item"
  nillable="true" />

Обратите внимание, что элемент с dimensionItem абстрактный, что является обязательным требованием. У концептов, предназначенных для элементов измерения, значением substitutionGroup указывается xbrli:item. Концепт gender выступает в качестве корня иерархии элементов измерения, остальные концепты являются элементами домена.


Элементы помещаются в иерархию взаимосвязями domain-member, для которых мы создаем базу ссылок определений (definition linkbase). Она использует отдельную роль для группировки взаимосвязей и включается в схему таксономии.


<link:roleType
  roleURI="http://www.sample.com/genderDimension" id="genderDimension">
  <link:definition>
    Gender dimension for demographics on employees
  </link:definition>
  <link:usedOn>link:definitionLink</link:usedOn>
</link:roleType>
<link:linkbaseRef
  xlink:type="simple"
  xlink:href="sample-2006-01-05-dimension-definition.xml"
  xlink:role="http://www.xbrl.org/2003/role/definitionLinkbaseRef"
  xlink:arcrole="http://www.w3.org/1999/xlink/properties/linkbase" />

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


<roleRef
  xlink:type="simple"
  xlink:href="sample-2006-01-05-dimension.xsd#genderDimension"
  roleURI="http://www.sample.com/genderDimension" />

<definitionLink
  xlink:type="extended"
  xlink:role="http://www.sample.com/genderDimension" >
  <loc
    xlink:type="locator"
    xlink:href="sample-2006-01-05-dimension.xsd#sample_dimension_gender"
    xlink:label="dimension_gender" />
  <loc
   xlink:type="locator"
    xlink:href="sample-2006-01-05-dimension.xsd#sample_gender"
    xlink:label="domain_gender" />
  <loc
    xlink:type="locator"
    xlink:href="sample-2006-01-05-dimension.xsd#sample_male"
    xlink:label="member_male" />
  <loc
    xlink:type="locator"
    xlink:href="sample-2006-01-05-dimension.xsd#sample_female"
    xlink:label="member_female" />
</definitionLink>

Измерение имеет взаимосвязь dimension-domain со своим доменом. Элементы домена определяются взаимосвязями domain-member между локаторами концептов в базе ссылок определений.


<definitionArc
  xlink:type="arc"
  xlink:arcrole="http://www.xbrl.org/int/dim/arcrole/dimension-domain"
  xlink:from="dimension_gender"
  xlink:to="domain_gender"
  order="1" priority="0" use="optional" />
<definitionArc
  xlink:type="arc"
  xlink:arcrole="http://www.xbrl.org/int/dim/arcrole/domain-member"
  xlink:from="domain_gender"
  xlink:to="member_male"
  order="1" priority="0" use="optional" />
<definitionArc
  xlink:type="arc"
  xlink:arcrole="http://www.xbrl.org/int/dim/arcrole/domain-member"
  xlink:from="domain_gender"
  xlink:to="member_female"
  order="2" priority="0" use="optional" />

6.5.5. Гиперкубы


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


Сначала мы определяем концепты гиперкубов в виде абстрактных элементов со значением hypercubeItem атрибута substitutionGroup.


<element
  id="sample_hc_gender"
  name="hc_gender"
  xbrli:periodType="instant"
  type="xbrli:stringItemType"
  substitutionGroup="xbrli:hypercubeItem"
  nillable="true"
  abstract="true" />
<element
  id="sample_hc_age_group"
  name="hc_age_group"
  xbrli:periodType="instant"
  type="xbrli:stringItemType"
  substitutionGroup="xbrli:hypercubeItem"
  nillable="true"
  abstract="true" />

Создаем связи между базовыми концептами, гиперкубами и измерениями.


<loc
  xlink:type="locator"
  xlink:href="sample-2006-01-05.xsd#sample_nr_employees_by_gender"
  xlink:label="primary_nr_employees_by_gender" />
<loc
  xlink:type="locator"
  xlink:href="sample-2006-01-05-dimension.xsd#sample_hc_gender"
  xlink:label="hypercube_gender" />

<definitionArc
  xlink:type="arc"
  xlink:arcrole="http://xbrl.org/int/dim/arcrole/all"
  xbrldt:contextElement="scenario"
  xlink:from="primary_nr_employees_by_gender"
  xlink:to="hypercube_gender"
  order="1" priority="0" use="optional" />
<definitionArc
  xlink:type="arc"
  xlink:arcrole="http://xbrl.org/int/dim/arcrole/hypercube-dimension"
  xlink:from="hypercube_gender"
  xlink:to="dimension_gender"
  order="1" priority="0" use="optional" />

Аналогично для возрастных групп:


<definitionLink
  xlink:type="extended"
  xlink:role="http://www.sample.com/ageGroupDimension" >

  <loc
    xlink:type="locator"
    xlink:href="sample-2006-01-05.xsd#sample_nr_employees_by_age"
    xlink:label="primary_nr_employees_by_age" />
  <loc
    xlink:type="locator"
    xlink:href="sample-2006-01-05-dimension.xsd#sample_hc_age_group"
    xlink:label="hypercube_age_group" />
  <loc
    xlink:type="locator"
    xlink:href="sample-2006-01-05-dimension.xsd#sample_dim_age_group"
    xlink:label="dimension_age_group" />

  <definitionArc
    xlink:type="arc"
    xlink:arcrole="http://xbrl.org/int/dim/arcrole/all"
    xbrldt:contextElement="scenario"
    xlink:from="primary_nr_employees_by_age"
    xlink:to="hypercube_age_group"
    order="1" priority="0" use="optional" />
  <definitionArc
    xlink:type="arc"
    xlink:arcrole="http://xbrl.org/int/dim/arcrole/hypercube-dimension"
    xlink:from="hypercube_age_group"
    xlink:to="dimension_age_group"
    order="1" priority="0" use="optional" />
</definitionLink>

Обратите внимание, что в ссылке должна использоваться роль, определенная в таксономии измерений – ageGroupDimension:


<link:roleType
  roleURI="http://www.sample.com/ageGroupDimension" id="ageGroupDimension">
  <link:definition>
    Age group dimension for demographics on employees
  </link:definition>
  <link:usedOn>link:definitionLink</link:usedOn>
</link:roleType>

6.5.6. Презентации


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


6.5.7. Отчет


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


<context id="c_start">
  <entity>
    <identifier scheme="http://www.statistics.org">12-34567</identifier>
  </entity>
  <period>
    <instant>2005-01-01</instant>
  </period>
</context>
<context id="c_end">
  <entity>
    <identifier scheme="http://www.statistics.org">12-34567</identifier>
  </entity>
  <period>
    <instant>2005-12-31</instant>
  </period>
</context>

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


<context id="c_start_age_up_to_20">
  <entity>
    <identifier scheme="http://www.statistics.org">12-34567</identifier>
  </entity>
  <period>
    <instant>2005-01-01</instant>
  </period>
  <scenario>
    <xbrldi:typedMember dimension="sd:dim_age_group">
      <sd:age_group_type>.. - 20</sd:age_group_type>
    </xbrldi:typedMember>
  </scenario>
</context>
<context id="c_end_age_up_to_20">
  <entity>
    <identifier scheme="http://www.statistics.org">12-34567</identifier>
  </entity>
  <period>
    <instant>2005-12-31</instant>
  </period>
  <scenario>
    <xbrldi:typedMember dimension="sd:dim_age_group">
      <sd:age_group_type>.. - 20</sd:age_group_type>
    </xbrldi:typedMember>
  </scenario>
</context>
<context id="c_start_age_21_to_40">
  <entity>
    <identifier scheme="http://www.statistics.org">12-34567</identifier>
  </entity>
  <period>
    <instant>2005-01-01</instant>
  </period>
  <scenario>
    <xbrldi:typedMember dimension="sd:dim_age_group">
      <sd:age_group_type>21 - 40</sd:age_group_type>
    </xbrldi:typedMember>
  </scenario>
</context>
<context id="c_end_age_21_to_40">
  <entity>
    <identifier scheme="http://www.statistics.org">12-34567</identifier>
  </entity>
  <period>
    <instant>2005-12-31</instant>
  </period>
  <scenario>
    <xbrldi:typedMember dimension="sd:dim_age_group">
      <sd:age_group_type>21 - 40</sd:age_group_type>
    </xbrldi:typedMember>
  </scenario>
</context>
<context id="c_start_age_41_and_up">
  <entity>
    <identifier scheme="http://www.statistics.org">12-34567</identifier>
  </entity>
  <period>
    <instant>2005-01-01</instant>
  </period>
  <scenario>
    <xbrldi:typedMember dimension="sd:dim_age_group">
      <sd:age_group_type>41 - ..</sd:age_group_type>
    </xbrldi:typedMember>
  </scenario>
</context>
<context id="c_end_age_41_and_up">
  <entity>
    <identifier scheme="http://www.statistics.org">12-34567</identifier>
  </entity>
  <period>
    <instant>2005-12-31</instant>
  </period>
  <scenario>
    <xbrldi:typedMember dimension="sd:dim_age_group">
      <sd:age_group_type>41 - ..</sd:age_group_type>
    </xbrldi:typedMember>
  </scenario>
</context>

Изменение указывается в атрибуте dimension элемента xbrldi:typedMember. Значение измерения определяется как элемент sd:age_group_type – типа, определенного для измерения.


Теперь определяем контексты для значений гендерного измерения.


<context id="c_start_gm">
  <entity>
    <identifier scheme="http://www.statistics.org">12-34567</identifier>
  </entity>
  <period>
    <instant>2005-01-01</instant>
  </period>
  <scenario>
    <xbrldi:explicitMember dimension="sd:dim_gender">sd:male</xbrldi:explicitMember>
  </scenario>
</context>
<context id="c_end_gm">
  <entity>
    <identifier scheme="http://www.statistics.org">12-34567</identifier>
  </entity>
  <period>
    <instant>2005-12-31</instant>
  </period>
  <scenario>
    <xbrldi:explicitMember dimension="sd:dim_gender">sd:male</xbrldi:explicitMember>
  </scenario>
</context>
<context id="c_start_gf">
  <entity>
    <identifier scheme="http://www.statistics.org">12-34567</identifier>
  </entity>
  <period>
    <instant>2005-01-01</instant>
  </period>
  <scenario>
    <xbrldi:explicitMember dimension="sd:dim_gender">sd:female</xbrldi:explicitMember>
  </scenario>
</context>
<context id="c_end_gf">
  <entity>
    <identifier scheme="http://www.statistics.org">12-34567</identifier>
  </entity>
  <period>
    <instant>2005-12-31</instant>
  </period>
  <scenario>
    <xbrldi:explicitMember dimension="sd:dim_gender">sd:female</xbrldi:explicitMember>
  </scenario>
</context>

Изменение указывается в атрибуте dimension элемента xbrldi:explicitMember. Значение измерения определяется ссылкой на элемент домена измерения.


Обратите внимание, что отчет ссылается на таксономию шаблонов, а не на базовую таксономию.


<link:schemaRef
  xlink:type="simple"
  xlink:href="http://www.sample.com/2006-01-05/sample-2006-01-05-dimension.xsd" />

Теперь мы можем передавать факты, каждый в своём контексте.


<!-- Итоговые значения в контекстах без измерений -->
<s:nr_employees_total
  contextRef="c_start"
  unitRef="u_person"
  decimals="0">35</s:nr_employees_total>
<s:nr_employees_total
  contextRef="c_end"
  unitRef="u_person"
  decimals="0">41</s:nr_employees_total>

<!-- Гендерная демография -->
<s:nr_employees_by_gender
  contextRef="c_start_gm"
  unitRef="u_person"
  decimals="0">23</s:nr_employees_by_gender>
<s:nr_employees_by_gender
  contextRef="c_end_gm"
  unitRef="u_person"
  decimals="0">27</s:nr_employees_by_gender>

<s:nr_employees_by_gender
  contextRef="c_start_gf"
  unitRef="u_person"
  decimals="0">12</s:nr_employees_by_gender>
<s:nr_employees_by_gender
  contextRef="c_end_gf"
  unitRef="u_person"
  decimals="0">15</s:nr_employees_by_gender>

<!-- Возрастная демография -->
<s:nr_employees_by_age
  contextRef="c_start_age_up_to_20"
  unitRef="u_person"
  decimals="0">5</s:nr_employees_by_age>
<s:nr_employees_by_age
  contextRef="c_end_age_up_to_20"
  unitRef="u_person"
  decimals="0">9</s:nr_employees_by_age>

<s:nr_employees_by_age
  contextRef="c_start_age_21_to_40"
  unitRef="u_person"
  decimals="0">23</s:nr_employees_by_age>
<s:nr_employees_by_age
  contextRef="c_end_age_21_to_40"
  unitRef="u_person"
  decimals="0">21</s:nr_employees_by_age>

<s:nr_employees_by_age
  contextRef="c_start_age_41_and_up"
  unitRef="u_person"
  decimals="0">7</s:nr_employees_by_age>
<s:nr_employees_by_age
  contextRef="c_end_age_41_and_up"
  unitRef="u_person"
  decimals="0">11</s:nr_employees_by_age>

6.5.8. Первый взгляд на новые измерения


Наше простое приложение для визуализации отчета не поддерживает измерения, поэтому отчет выглядит следующим образом:


image


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


image





+3
1.7k 10
Leave a comment
Top of the day