- 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
Остальные атрибуты определяют префиксы элементов схемы. Префикс указывает, каким пространством имен определяется элемент:
xmlns
xmlns:xbrli
xmlns:link
xmlns:xlink
xmlns:sample
sample
.Все приведенные ниже документы имеют одинаковые атрибуты определения пространств имен в корневом элементе. Мы не будем описывать их отдельно для каждого нового типа элемента.
Спецификация 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" />
Разберем атрибуты концепта:
id
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
.
Если мы хотим представить полноценную таксономию или отчет, нам надо предоставить дополнительную информацию о концептах в виде баз ссылок. Начнем с двух из них – базы ярлыков и базы презентаций.
Связь с базами ссылок указывается в элементе 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
linkbase
.База ярлыков содержит три типа элементов:
Эти элементы размещаются внутри элемента 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
.Локаторы размещаются в элементы 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
Для определения ярлыков используется элемент 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
xlink:label
label
обеспечивает возможность обращаться к ярлыку внутри базы ссылок. Обратите внимание, что каждая из приведенных меток связана с одним и тем же концептом, и во всех из них используется одно и то же значение атрибута. Это позволяет использовать связь один-ко-многим от концепта к его ярлыкам. В нашем примере это три разных вида ярлыков для концепта ‘nr_employees_total’.xlink:role
xml: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:type
xlink:arcrole
xlink:from
label
локатора в качестве значения этого атрибута.xlink:to
label
ресурса. Поскольку мы использовали один и тот же 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:type
xlink:arcrole
xlink:from
xlink:to
order
priority
use
optional
, мы обозначаем, что концепт может быть частью сети презентаций. Общепринятой практикой является указание этого значения, хотя оно же используется по умолчанию в случае отсутствия атрибута.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:type
xlink:href
href
-атрибут. Он указывает расположение схемы таксономии на сайте ее создателя.У нас в примере есть два контекста – начало отчетного периода и конец отчетного периода:
<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
Ссылка, указанная в элементе
identifier
, ссылается на несуществующую статистическую организацию, которая публикует идентификаторы подотчетных организаций. Наша воображаемая компания имеет идентификатор ‘12-34567’. В реальном мире мы бы использовали, к примеру, тикер фондовой биржи или идентификатор организации в национальном налоговом органе.
Для всех числовых фактов должны быть указаны единицы измерения:
<unit id="u_person">
<measure>Person</measure>
</unit>
id
measure
Теперь мы наконец достигли финальной цели всего нашего упражнения – передачи фактов:
<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
decimals
decimals
(десятичные знаки) или 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
Нажмите здесь для печати.