Работа с пропущенными (несуществующими) данными
Иногда данные оказываются недоступными (несуществующими) для исходных элементов: либо потому, что компания не сообщила их, либо из-за того, что формуле требуются исходные данные предыдущего периода, которых нет (такое, например, неизбежно случается, если требуются данные для периода, предшествующего самому раннему из тех, для которых есть данные). Специалистам по финансовым данным необходимо решить, как их формулы должны обращаться с отсутствующими данными. Например, логика операций с отсутствующими данными должна однозначно определять результат следующих выражений: 10 + null; null + null; 10 div null; null div 10; if (null ne 10) then (null + 20) else (30); if (25 gt null) ..; if(null = null).., и т.д...
В оставшейся части статьи автор использует бизнес-логику вычисления формул, принятую в его организации. Бизнес-логика других организаций может отличаться, но техническая обработка должна быть такой же.
Практический опыт показывает, что формулы должны иметь определенный тип (см. ниже), и для каждого типа существует ограниченное количество допустимых выражений. Эти ограничения необходимы, если должна применяться логика обработки отсутствующих данных. Измененная схема -
schema_complex.xml (листинг 7) - имеет элементы следующих четырех типов:
- Тип исходных данных (Input type). Данные присваиваются элементам этого типа в документе в формате XBRL.
- Простой тип вычислений (Simple calculation type). Слово "простой" означает, что в этом типе отсутствуют операторы сравнения, а ответом формулы должно быть число.
- Отношение (Ratio). Имеет форму числителя (numerator) и
знаменателя (denominator), причем
числитель и знаменатель рассматриваются как под-формулы, имеющие простой тип или тип ввода.
- Условный (Conditional). Имеет форму если (значение теста истинно), то вычислять результат по операции formula_if_true, иначе - по операции formula_if_false [if (test is true) then return result from formula_if_true else return from formula_if_false]. Тест имеет следующую форму:
(test_left_hand test_operator test_right_hand). Под-формулы test_left_hand, test_right_hand, formula_if_true и formula_if_false имеют простой тип или тип ввода.
Каждый элемент вычисляемого типа также имеет атрибут
null_eval_rule, который указывает, как вычислять формулу или под-формулу простого типа в условном типе или типе "отношение".