- PVSM.RU - https://www.pvsm.ru -
В предыдущих главах мы потрогали пальцем воду, выясняя, что представляет из себя XBRL, и что с его помощью можно сделать. С этим багажом знаний мы готовы к полному погружению в настоящий XBRL в нашей заключительной главе. Мы рассмотрим основные шаги по созданию таксономии и отчета и покажем, как XBRL выглядит в реальной жизни.
В этой главе мы покажем процесс формирования таксономии и связанного с ней отчета на уже знакомом вам примере про демографию компании. Как и в реальной жизни, мы не сможем сделать все правильно с первой же попытки, поэтому процесс их формирования у нас будет разбит на несколько разных версий. Разработка большинства реальных таксономий занимает от нескольких недель до нескольких месяцев (и даже лет).
Примечание: Мы не будем создавать базы ссылок определений (definition linkbase) и базы ссылок на реcурсы (reference linkbase). В реальной жизни вы могли бы создать по крайней мере одну из них, чтобы более подробно описать свои концепты, но для целей данной главы они не нужны. После того, как вы освоите базы ссылок ярлыков (label linkbase) и презентаций (presentation linkbase), с пониманием баз ссылок определений и ресурсов не должно возникнуть никаких проблем.
Начнем с простой таксономии для нашего примера.
Прежде всего нам нужен документ, содержащий схему таксономии.
Хорошей практикой является использование в имени документа даты создания таксономии, чтобы легко различать созданные в разное время версии таксономии.
Давайте считать, что мы начинаем наш маленький проект в первый день года, сразу после боя курантов, тогда назовем документ с таксономией следующим образом – ‘sample-2017-01-01.xsd’. Будем обсуждать наш документ небольшими частями, создавая таксономию шаг за шагом.
Как и в любой 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Остальные атрибуты определяют префиксы элементов схемы. Префикс указывает, каким пространством имен определяется элемент:
xmlnsxmlns:xbrlixmlns:linkxmlns:xlinkxmlns:samplesample.Все приведенные ниже документы имеют одинаковые атрибуты определения пространств имен в корневом элементе. Мы не будем описывать их отдельно для каждого нового типа элемента.
Спецификация XBRL включает в себя ряд схем:
- XBRL Instance
Содержит определения (типы, атрибуты, элементы), необходимые для объявления фактов и концептов;- XBRL Linkbase
Содержит определения, необходимые для объявления ссылок от одной части таксономии (или базы ссылок) к другой;- XBRL XLink
Используется для объявления самих баз ссылок, это пространство имен понадобится вам при создании собственного расширения спецификации XBRL;- W3C XLink
Пространство имен для XML Link; обратите внимание, что схема для этой части спецификации находится на сайте xbrl.org, поскольку W3C не предоставляет эту схему, а для спецификации XBRL она необходима.
Наш следующий шаг – импортировать схему отчета 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 стандартизировано и автоматически распознается поддерживающим нашу схему программным обеспечением.
Концепты в нашей таксономии определяются как элементы схемы. Из нашего примера мы ранее получили следующие концепты:
| Имя | Тип |
|---|---|
| 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" />
Разберем атрибуты концепта:
idnamexbrli:periodTypeinstant.typenonNegativeIntegerItemType, определенный в схеме отчета XBRL.substitutionGroupitem, определенное в схеме отчета XBRL.nillablenillable, это позволяет передавать по ним пустые факты.Остальные концепты определяются аналогично, но каждый со своими значениями атрибутов 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.
Если мы хотим представить полноценную таксономию или отчет, нам надо предоставить дополнительную информацию о концептах в виде баз ссылок. Начнем с двух из них – базы ярлыков и базы презентаций.
Связь с базами ссылок указывается в элементе 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:typesimple.xlink:hrefxlink:rolelabelLinkbaseRef и presentationLinkbaseRef, определенные схемой XBRL Linking.xlink:arcrolelinkbase.База ярлыков содержит три типа элементов:
Эти элементы размещаются внутри элемента 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:typeextended.xlink:rolelink.Локаторы размещаются в элементы loc. Они указывают на концепты связанной с ними таксономии.
<loc
xlink:type="locator"
xlink:href="sample-2017-01-01.xsd#sample_nr_employees_total"
xlink:label="concept_nr_employees_total" />
xlink:typeloc всегда указывается locator, означающий, что он используется как локатор (концептов).xlink:hrefid.xlink:labelДля определения ярлыков используется элемент 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:typexlink:labellabel обеспечивает возможность обращаться к ярлыку внутри базы ссылок. Обратите внимание, что каждая из приведенных меток связана с одним и тем же концептом, и во всех из них используется одно и то же значение атрибута. Это позволяет использовать связь один-ко-многим от концепта к его ярлыкам. В нашем примере это три разных вида ярлыков для концепта ‘nr_employees_total’.xlink:rolexml:langНаконец, после определения локаторов к концептам и ресурсов ярлыков, мы можем связать их с помощью дуг ярлыков.
<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:typexlink:arcrolexlink:fromlabel локатора в качестве значения этого атрибута.xlink:tolabel ресурса. Поскольку мы использовали один и тот же label для трех разных ярлыков, наша дуга образует связь один-ко-многим между концептом и его ярлыками.
Презентации содержат два типа элементов:
Все они располагаются внутри элемента 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>
Здесь все аналогично базе ссылок ярлыков, не будем повторяться.
Дуги презентаций связывают концепты в parent-child иерархию (дерево [1]):
<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:typexlink:arcrolexlink:fromxlink:toorderpriorityuseoptional, мы обозначаем, что концепт может быть частью сети презентаций. Общепринятой практикой является указание этого значения, хотя оно же используется по умолчанию в случае отсутствия атрибута.preferredLabelПримечание: Поскольку атрибут preferredLabel может указываться только для дочерних концептов, корневой элемент иерархии презентации предпочтительного вида ярлыка иметь не может.
Создав таксономию, мы можем использовать ее для создания отчета.
Документ с отчетом 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>
Ссылка на схему указывается в элементе schemaRef:
<link:schemaRef
xlink:type="simple"
xlink:href="http://www.sample.com/2017-01-01/sample-2017-01-01.xsd" />
xlink:typexlink:hrefhref-атрибут. Он указывает расположение схемы таксономии на сайте ее создателя.У нас в примере есть два контекста – начало отчетного периода и конец отчетного периода:
<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>
identityidentifierscheme) для определения того, по какой организации составляется отчет. В нашем примере мы используем несуществующую схему на вымышленном сайте.periodinstantСсылка, указанная в элементе
identifier, ссылается на несуществующую статистическую организацию, которая публикует идентификаторы подотчетных организаций. Наша воображаемая компания имеет идентификатор ‘12-34567’. В реальном мире мы бы использовали, к примеру, тикер фондовой биржи или идентификатор организации в национальном налоговом органе.
Для всех числовых фактов должны быть указаны единицы измерения:
<unit id="u_person">
<measure>Person</measure>
</unit>
idmeasureТеперь мы наконец достигли финальной цели всего нашего упражнения – передачи фактов:
<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>
Каждый факт – это отдельный связанный с концептом элемент. Значение элемента является значением факта.
contextRefid контекста. Наш пример содержит факты для каждого концепта в каждом из контекстов.unitRefdecimalsdecimals (десятичные знаки) или precision (точность). В нашем примере все факты целочисленные, поэтому указываем decimals со значением ‘0’.После всей проделанной работы нам хотелось бы увидеть, как формируется наш отчет в привязке к таксономии и, в частности, к базам ссылок презентаций и ярлыков.
Для этого воспользуемся простым инструментом, который создает веб-страничку для нашего отчета с отображением фактов в табличном виде. Он располагает контексты в столбцах таблицы, а ярлыки концептов из базы ссылок ярлыков – слева от нее. Иерархия концептов, определенная в базе ссылок презентаций, задает порядок следования и отступы для фактов.
Полученный нами результат выглядит примерно следующим образом:
В общем, мы неплохо потрудились!
Автор: Роман Удальцов
Источник [2]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/standarty/261716
Ссылки в тексте:
[1] дерево: https://ru.wikipedia.org/wiki/%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_(%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%B0_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85)
[2] Источник: https://habrahabr.ru/post/334356/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best
Нажмите здесь для печати.