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