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. Первый взгляд на новые измерения
Наше простое приложение для визуализации отчета не поддерживает измерения, поэтому отчет выглядит следующим образом:
После некоторых ручных корректировок – удаления неиспользуемых столбцов, упорядочивания остальных столбцов и добавления заголовков таблиц – мы можем взглянуть на несколько лучшую версию отчета, которую вы могли бы ожидать от приложения с поддержкой измерений:
