6. Погружение в XBRL
В предыдущих главах мы потрогали пальцем воду, выясняя, что представляет из себя XBRL, и что с его помощью можно сделать. С этим багажом знаний мы готовы к полному погружению в настоящий XBRL в нашей заключительной главе. Мы рассмотрим основные шаги по созданию таксономии и отчета и покажем, как XBRL выглядит в реальной жизни.
В этой главе мы покажем процесс формирования таксономии и связанного с ней отчета на уже знакомом вам примере про демографию компании. Как и в реальной жизни, мы не сможем сделать все правильно с первой же попытки, поэтому процесс их формирования у нас будет разбит на несколько разных версий. Разработка большинства реальных таксономий занимает от нескольких недель до нескольких месяцев (и даже лет).
Примечание: Мы не будем создавать базы ссылок определений (definition linkbase) и базы ссылок на реcурсы (reference linkbase). В реальной жизни вы могли бы создать по крайней мере одну из них, чтобы более подробно описать свои концепты, но для целей данной главы они не нужны. После того, как вы освоите базы ссылок ярлыков (label linkbase) и презентаций (presentation linkbase), с пониманием баз ссылок определений и ресурсов не должно возникнуть никаких проблем.
6.1. Приступаем
Начнем с простой таксономии для нашего примера.
6.1.1. Схема таксономии
Прежде всего нам нужен документ, содержащий схему таксономии.
Хорошей практикой является использование в имени документа даты создания таксономии, чтобы легко различать созданные в разное время версии таксономии.
Давайте считать, что мы начинаем наш маленький проект в первый день года, сразу после боя курантов, тогда назовем документ с таксономией следующим образом – ‘sample-2017-01-01.xsd’. Будем обсуждать наш документ небольшими частями, создавая таксономию шаг за шагом.
6.1.1.1. Корень схемы
Как и в любой XML-схеме, мы начинаем с корневого элемента schema
:
<schema
targetNamespace="http://www.sample.com/2017-01-01"
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:xbrli="http://www.xbrl.org/2003/instance"
xmlns:link="http://www.xbrl.org/2003/linkbase"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sample="http://www.sample.com/2017-01-01">
...
</schema>
Обратите внимание на атрибуты внутри корневого элемента:
targetNameSpace
Определяет пространство имен (namespace) элементов схемы. Поддерживающее схему программное обеспечение, которое будет используется для обработки таксономии или связанного с ней отчета, должно использовать это пространство имен для обращения к схеме или ее частям.
Остальные атрибуты определяют префиксы элементов схемы. Префикс указывает, каким пространством имен определяется элемент:
xmlns
Пространство имен XML Schema – является значением по умолчанию для всех элементов без префикса;xmlns:xbrli
Пространство имен отчета XBRL (instance);xmlns:link
Пространство имен XBRL Link;xmlns:xlink
Пространство имен XML Schema XLink;xmlns:sample
Наконец, любые определенные нами элементы, которые находятся в целевом пространстве имен, будут иметь префиксsample
.
Все приведенные ниже документы имеют одинаковые атрибуты определения пространств имен в корневом элементе. Мы не будем описывать их отдельно для каждого нового типа элемента.
Спецификация XBRL включает в себя ряд схем:
- XBRL Instance
Содержит определения (типы, атрибуты, элементы), необходимые для объявления фактов и концептов;- XBRL Linkbase
Содержит определения, необходимые для объявления ссылок от одной части таксономии (или базы ссылок) к другой;- XBRL XLink
Используется для объявления самих баз ссылок, это пространство имен понадобится вам при создании собственного расширения спецификации XBRL;- W3C XLink
Пространство имен для XML Link; обратите внимание, что схема для этой части спецификации находится на сайте xbrl.org, поскольку W3C не предоставляет эту схему, а для спецификации XBRL она необходима.
6.1.1.2. Импорт схемы отчета
Наш следующий шаг – импортировать схему отчета XBRL, чтобы мы могли использовать конструкции из нее в своих определениях элементов.
<import
namespace="http://www.xbrl.org/2003/instance"
schemaLocation="http://www.xbrl.org/2003/xbrl-instance-2003-12-31.xsd" />
Элементimport
должен точно определить схему, идентифицированную пространством имен. Документ схемы, на который указывает URI в атрибутеschemaLocation
, должен реально существовать.
Схема отчета XBRL импортирует схему XBRL Linkbase, а она, в свою очередь, импортирует схемы XBRL XLink и W3C XLink. Это означает, что нам не нужно самостоятельно импортировать эти схемы.
Пространство имен W3C XML Schema стандартизировано и автоматически распознается поддерживающим нашу схему программным обеспечением.
6.1.1.3. Концепты
Концепты в нашей таксономии определяются как элементы схемы. Из нашего примера мы ранее получили следующие концепты:
Имя | Тип |
---|---|
nr_employees_total | non-negative integer item |
nr_employees_male | non-negative integer item |
nr_employees_female | non-negative integer item |
nr_employees_age_up_to_20 | non-negative integer item |
nr_employees_age_21_to_40 | non-negative integer item |
nr_employees_age_41_and_up | non-negative integer item |
Концепт, отражающий общее количество сотрудников, определяется следующим образом:
<element
id="sample_nr_employees_total"
name="nr_employees_total"
xbrli:periodType="instant"
type="xbrli:nonNegativeIntegerItemType"
substitutionGroup="xbrli:item"
nillable="true" />
Разберем атрибуты концепта:
id
Этот идентификатор используется для обозначения концепта в других документах, таких как базы ссылок. Он должен быть уникальным в пределах схемы. Для id концепта мы использовали префикс ‘sample_’, чтобы сделать его глобально уникальным.name
Указанное в этом атрибуте наименование идентифицирует концепт внутри таксономии и отчета. Оно должно быть уникальным в пределах таксономии.xbrli:periodType
Каждый концепт должен иметь связанный с ним тип периода. В нашем примере количество сотрудников указывается на начало и на конец периода, то есть на дату. Для таких концептов используется значениеinstant
.type
Количество сотрудников является целым числом; сотрудник, работающий неполный день, также считается как единица, а не дробь. Поскольку отрицательного количества сотрудников быть не может, мы используем типnonNegativeIntegerItemType
, определенный в схеме отчета XBRL.substitutionGroup
Это простой концепт, не являющийся кортежем, поэтому здесь указываем значениеitem
, определенное в схеме отчета XBRL.nillable
Рекомендуется всегда указывать концепты какnillable
, это позволяет передавать по ним пустые факты.
Остальные концепты определяются аналогично, но каждый со своими значениями атрибутов id
и name
.
Нам также понадобится абстрактный концепт, который будет служить корнем иерархии представления нашего отчета. Ему (произвольно) присвоим тип xbrli:stringItemType
. Для передачи фактов абстрактные концепты не используются, поэтому можно указать любой тип для удовлетворения требований спецификации XBRL по его наличию.
<element
id="sample_presentation_root"
name="presentation_root"
xbrli:periodType="instant"
type="xbrli:stringItemType"
substitutionGroup="xbrli:item"
abstract="true"
nillable="true" />
Абстрактный концепт должен иметь атрибут abstract
со значением true
.
6.1.1.4. Связи с базами ссылок
Если мы хотим представить полноценную таксономию или отчет, нам надо предоставить дополнительную информацию о концептах в виде баз ссылок. Начнем с двух из них – базы ярлыков и базы презентаций.
Связь с базами ссылок указывается в элементе appinfo
, который размещается внутри элемента annotation
:
<annotation>
<appinfo>
<link:linkbaseRef
xlink:type="simple"
xlink:href="sample-2017-01-01-label.xml"
xlink:role="http://www.xbrl.org/2003/role/labelLinkbaseRef"
xlink:arcrole="http://www.w3.org/1999/xlink/properties/linkbase" />
<link:linkbaseRef
xlink:type="simple"
xlink:href="sample-2017-01-01-presentation.xml"
xlink:role="http://www.xbrl.org/2003/role/presentationLinkbaseRef"
xlink:arcrole="http://www.w3.org/1999/xlink/properties/linkbase" />
</appinfo>
</annotation>
У связи с базой ссылок есть следующие атрибуты:
xlink:type
Здесь всегда указываетсяsimple
.xlink:href
В этом атрибуте указывается сама ссылка на базу. В нашем примере мы ссылаемся на базы ярлыков и презентаций, о которых поговорим позже.xlink:role
Атрибут ‘роль’ определяет тип базы ссылок. Мы используем значенияlabelLinkbaseRef
иpresentationLinkbaseRef
, определенные схемой XBRL Linking.xlink:arcrole
Ролью дуги к базе ссылок всегда указывается определенное в XLink значениеlinkbase
.
6.1.2. База ссылок ярлыков
База ярлыков содержит три типа элементов:
- локаторы для определения концептов таксономии, которым присваивается ярлык;
- ресурсы, которые содержат сами ярлыки;
- дуги ярлыков, связывающие концепт (через его локатор) с ярлыком.
Эти элементы размещаются внутри элемента labelLink
:
<?xml version="1.0" encoding="UTF-8"?>
<linkbase
xmlns="http://www.xbrl.org/2003/linkbase"
xmlns:xbrli="http://www.xbrl.org/2003/instance"
xsi:schemaLocation="http://www.xbrl.org/2003/instance
http://www.xbrl.org/2003/xbrl-instance-2003-12-31.xsd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:sample="http://www.sample.com/2017-01-01">
<labelLink xlink:type="extended" xlink:role="http://www.xbrl.org/2003/role/link">
...
</labelLink>
</linkbase>
У элемента labelLink
есть следующие атрибуты:
xlink:type
Здесь всегда указываетсяextended
.xlink:role
Для ссылок по умолчанию используется рольlink
.
6.1.2.1. Локтаторы (locator)
Локаторы размещаются в элементы loc
. Они указывают на концепты связанной с ними таксономии.
<loc
xlink:type="locator"
xlink:href="sample-2017-01-01.xsd#sample_nr_employees_total"
xlink:label="concept_nr_employees_total" />
xlink:type
Типом элементаloc
всегда указываетсяlocator
, означающий, что он используется как локатор (концептов).xlink:href
Указывает на фактическое местоположение концепта. Обратите внимание, что тут мы используем егоid
.xlink:label
Локатору присваивается ярлык для обращения к нему внутри базы ссылок. В качестве значения ярлыка мы будем использовать id концепта с префиксом ‘concept_’.
6.1.2.2. Ярлыки
Для определения ярлыков используется элемент label
.
<label
xlink:type="resource"
xlink:label="label_nr_employees_total"
xlink:role="http://www.xbrl.org/2003/role/label"
xml:lang="en">Total number employees</label>
<label
xlink:type="resource"
xlink:label="label_nr_employees_total"
xlink:role="http://www.xbrl.org/2003/role/terseLabel"
xml:lang="en">Total</label>
<label
xlink:type="resource"
xlink:label="label_nr_employees_total"
xlink:role="http://www.xbrl.org/2003/role/verboseLabel"
xml:lang="en">Total number of employees</label>
xlink:type
Типом всегда является значение ‘resource’, указывающее, что ярлык является локальным ресурсом базы ссылок.xlink:label
Как и в случае с локаторами, значение атрибутаlabel
обеспечивает возможность обращаться к ярлыку внутри базы ссылок. Обратите внимание, что каждая из приведенных меток связана с одним и тем же концептом, и во всех из них используется одно и то же значение атрибута. Это позволяет использовать связь один-ко-многим от концепта к его ярлыкам. В нашем примере это три разных вида ярлыков для концепта ‘nr_employees_total’.xlink:role
Роль определяет вид используемого ярлыка. Спецификация XBRL предоставляет большое количество предопределенных ролей. В примере мы используем три вида – нормальный, краткий и развернутый ярлыки. Приложение для работы с таксономией или отчетом XBRL позволяет выбрать наиболее подходящий вид ярлыков. Базы ссылок презентаций также могут указывать предпочтительный вид ярлыка.xml:lang
В этом атрибуте указывается язык метки. В примере мы используем только английский язык, но в базу ссылок можно включать ярлыки на любых языках.
6.1.2.3. Дуги ярлыков
Наконец, после определения локаторов к концептам и ресурсов ярлыков, мы можем связать их с помощью дуг ярлыков.
<labelArc
xlink:type="arc"
xlink:arcrole="http://www.xbrl.org/2003/arcrole/concept-label"
xlink:from="concept_nr_employees_total"
xlink:to="label_nr_employees_total" />
xlink:type
Типом всегда указываем ‘arc’, дуга (кто бы мог подумать).xlink:arcrole
Роль дуги определяет вид связи. Для ярлыков указывается ‘concept-label’, дуга между концептом и ярлыком.xlink:from
Указывает на одну из сторон дуги, в нашем случае на концепт. Мы используемlabel
локатора в качестве значения этого атрибута.xlink:to
Указывает на вторую сторону дуги, на ресурсы ярлыка, также с использованиемlabel
ресурса.
Поскольку мы использовали один и тот же label
для трех разных ярлыков, наша дуга образует связь один-ко-многим между концептом и его ярлыками.
6.1.3. База ссылок презентаций
Презентации содержат два типа элементов:
- Локаторы концептов таксономии, используемых в иерархии представления;
- Дуги представлений, связывающие концепты между собой через их локаторы.
Все они располагаются внутри элемента presentationLink
:
<?xml version="1.0" encoding="utf-8"?>
<linkbase
xmlns="http://www.xbrl.org/2003/linkbase"
xmlns:link="http://www.xbrl.org/2003/linkbase"
xmlns:xbrli="http://www.xbrl.org/2003/instance"
xsi:schemaLocation="http://www.xbrl.org/2003/instance
http://www.xbrl.org/2003/xbrl-instance-2003-12-31.xsd"
xmlns:xhtml="http://www.w3.org/1999/xhtml"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
<presentationLink
xlink:type="extended"
xlink:role="http://www.xbrl.org/2003/role/link" >
...
</presentationLink>
</linkbase>
6.1.3.1. Локаторы
Здесь все аналогично базе ссылок ярлыков, не будем повторяться.
6.1.3.2. Дуги презентаций
Дуги презентаций связывают концепты в parent-child иерархию (дерево):
<presentationArc
xlink:type="arc"
xlink:arcrole="http://www.xbrl.org/2003/arcrole/parent-child"
xlink:from="concept_presentation_root"
xlink:to="concept_nr_employees_total"
order="1" priority="0" use="optional"
preferredLabel="http://www.xbrl.org/2003/role/label" />
<presentationArc
xlink:type="arc"
xlink:arcrole="http://www.xbrl.org/2003/arcrole/parent-child"
xlink:from="concept_presentation_root"
xlink:to="concept_nr_employees_male"
order="2" priority="0" use="optional"
preferredLabel="http://www.xbrl.org/2003/role/terseLabel" />
<presentationArc
xlink:type="arc"
xlink:arcrole="http://www.xbrl.org/2003/arcrole/parent-child"
xlink:from="concept_presentation_root"
xlink:to="concept_nr_employees_female"
order="3" priority="0" use="optional"
preferredLabel="http://www.xbrl.org/2003/role/terseLabel" />
...
xlink:type
Как и ранее, ‘arc’.xlink:arcrole
Роль дуги презентации – ‘parent-child’, она указывает на то, что база ссылок презентаций представляет собой иерархическую структуру.xlink:from
Указывает на родительский концепт иерархии через его локатор. В нашем примере не было подходящего концепта, поэтому для корня иерархии мы используем абстрактный концепт ‘presentation_root’.xlink:to
Указывает на дочерний концепт иерархии через его локатор. В нашем примере все концепты располагаются под корневым концептом ‘presentation_root’.order
Этот атрибут задает порядок следования дочерних элементов, расположенных под общим родительским элементом.priority
Используется для переопределения баз ссылок. В нашем примере мы этого не делаем (пока что).use
Указывая значениеoptional
, мы обозначаем, что концепт может быть частью сети презентаций. Общепринятой практикой является указание этого значения, хотя оно же используется по умолчанию в случае отсутствия атрибута.preferredLabel
Ранее мы создали несколько видов ярлыков в нашей базе ссылок ярлыков. Здесь мы видим, как в базе ссылок презентаций указывается предпочтительный вид ярлыка для дочернего (to) концепта дуги.
Примечание: Поскольку атрибут preferredLabel
может указываться только для дочерних концептов, корневой элемент иерархии презентации предпочтительного вида ярлыка иметь не может.
6.1.4. Отчет XBRL
Создав таксономию, мы можем использовать ее для создания отчета.
Документ с отчетом XBRL содержит следующие виды элементов:
- Ссылки на схему таксономии;
- Контексты для фактов;
- Единицы измерения для числовых фактов;
- Сами значения фактов.
Все эти элементы размещаются внутри элемента xbrl
:
<?xml version="1.0" encoding="utf-8"?>
<xbrl
xmlns="http://www.xbrl.org/2003/instance"
xmlns:link="http://www.xbrl.org/2003/linkbase"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:iso4217="http://www.xbrl.org/2003/iso4217"
xmlns:s="http://www.sample.com/2017-01-01">
...
</xbrl>
6.1.4.1. Ссылка на схему таксономии
Ссылка на схему указывается в элементе schemaRef
:
<link:schemaRef
xlink:type="simple"
xlink:href="http://www.sample.com/2017-01-01/sample-2017-01-01.xsd" />
xlink:type
Указываем тип связи ‘simple’.xlink:href
Ссылка задается какhref
-атрибут. Он указывает расположение схемы таксономии на сайте ее создателя.
6.1.4.2. Контекст
У нас в примере есть два контекста – начало отчетного периода и конец отчетного периода:
<context id="c_start">
<entity>
<identifier scheme="http://www.statistics.org">12-34567</identifier>
</entity>
<period>
<instant>2016-01-01</instant>
</period>
</context>
<context id="c_end">
<entity>
<identifier scheme="http://www.statistics.org">12-34567</identifier>
</entity>
<period>
<instant>2016-12-31</instant>
</period>
</context>
id
Используется для связи факта с контекстом. Это значение должно быть уникально в пределах отчета.entity
Здесь указывается организация, по данным которой составляется отчет.
identifier
Этот элемент использует схему (scheme
) для определения того, по какой организации составляется отчет. В нашем примере мы используем несуществующую схему на вымышленном сайте.
period
Здесь указывается период или дата контекста.
instant
В нашем примере у нас два instant-контекста, для дат начала и окончания отчетного периода соответственно.
Ссылка, указанная в элементе identifier
, ссылается на несуществующую статистическую организацию, которая публикует идентификаторы подотчетных организаций. Наша воображаемая компания имеет идентификатор ‘12-34567’. В реальном мире мы бы использовали, к примеру, тикер фондовой биржи или идентификатор организации в национальном налоговом органе.
6.1.4.3. Единицы измерения
Для всех числовых фактов должны быть указаны единицы измерения:
<unit id="u_person">
<measure>Person</measure>
</unit>
id
Используется для связи факта с единицей измерения. Это значение должно быть уникально в пределах отчета.measure
Идентифицирует единицу измерения. В нашем примере мы определили собственную единицу измерения – ‘Person’.
6.1.4.4. Факты
Теперь мы наконец достигли финальной цели всего нашего упражнения – передачи фактов:
<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_male
contextRef="c_start"
unitRef="u_person"
decimals="0">23</s:nr_employees_male>
<s:nr_employees_male
contextRef="c_end"
unitRef="u_person"
decimals="0">27</s:nr_employees_male>
<s:nr_employees_female
contextRef="c_start"
unitRef="u_person"
decimals="0">12</s:nr_employees_female>
<s:nr_employees_female
contextRef="c_end"
unitRef="u_person"
decimals="0">15</s:nr_employees_female>
<!-- Возрастные группы -->
<s:nr_employees_age_up_to_20
contextRef="c_start"
unitRef="u_person"
decimals="0">5</s:nr_employees_age_up_to_20>
<s:nr_employees_age_up_to_20
contextRef="c_end"
unitRef="u_person"
decimals="0">9</s:nr_employees_age_up_to_20>
<s:nr_employees_age_21_to_40
contextRef="c_start"
unitRef="u_person"
decimals="0">23</s:nr_employees_age_21_to_40>
<s:nr_employees_age_21_to_40
contextRef="c_end"
unitRef="u_person"
decimals="0">21</s:nr_employees_age_21_to_40>
<s:nr_employees_age_41_and_up
contextRef="c_start"
unitRef="u_person"
decimals="0">7</s:nr_employees_age_41_and_up>
<s:nr_employees_age_41_and_up
contextRef="c_end"
unitRef="u_person"
decimals="0">11</s:nr_employees_age_41_and_up>
Каждый факт – это отдельный связанный с концептом элемент. Значение элемента является значением факта.
contextRef
Каждый факт ссылается на свой контекст черезid
контекста. Наш пример содержит факты для каждого концепта в каждом из контекстов.unitRef
Поскольку для всех числовых фактов должны быть указаны единицы измерения, в нашем примере заполняем здесь ‘u_person’.decimals
Для числовых фактов должен быть задан один из атрибутов –decimals
(десятичные знаки) илиprecision
(точность). В нашем примере все факты целочисленные, поэтому указываемdecimals
со значением ‘0’.
6.1.5. С гордостью представляем вам – наш отчет XBRL
После всей проделанной работы нам хотелось бы увидеть, как формируется наш отчет в привязке к таксономии и, в частности, к базам ссылок презентаций и ярлыков.
Для этого воспользуемся простым инструментом, который создает веб-страничку для нашего отчета с отображением фактов в табличном виде. Он располагает контексты в столбцах таблицы, а ярлыки концептов из базы ссылок ярлыков – слева от нее. Иерархия концептов, определенная в базе ссылок презентаций, задает порядок следования и отступы для фактов.
Полученный нами результат выглядит примерно следующим образом:
В общем, мы неплохо потрудились!