FHIR

Профили и расширения FHIR: как руководство по внедрению ограничивает ресурс и как проверить его соответствие

Профиль FHIR (StructureDefinition) сужает базовый ресурс: обязательные элементы, must-support, фиксированные коды, нарезка, привязки, инварианты. Расширение добавляет недостающее. Публикация профилей, meta.profile, валидация с примерами.

автор Опубликовано 6 мин чтения

Краткий ответ: базовые ресурсы FHIR намеренно сделаны гибкими: почти все необязательно, а большинство кодов — лишь примеры, чтобы один стандарт подходил для любой страны. Профиль — это StructureDefinition, который уточняет ресурс для конкретного использования: в данном контексте, у пациента должен быть идентификатор этого типа, Observation.code должен быть кодом LOINC из этого списка, этот элемент должен поддерживаться, а тот может отсутствовать. Расширение добавляет элемент, которого нет в базовом ресурсе, идентифицируемый по URL и определяемый своим собственным StructureDefinition. Руководства по внедрению (US Core, IPS, национальные руководства) — это наборы профилей, расширений, наборов значений и примеров. Ресурс указывает, каким профилям он соответствует, в meta.profile, а валидатор проверяет это.

Что может изменить профиль

Профиль FHIR может изменять ресурс только путем его сужения: ужесточения кардинальности, пометки элементов как обязательных для поддержки, фиксации значений или шаблонов, привязки элементов к наборам значений с указанием силы, разделения списков на именованные части, ограничения типов выбора, добавления инвариантов FHIRPath и ограничения целевых ссылок. Профиль не может добавлять элементы, переименовывать что-либо или ослаблять базовую спецификацию.

Ограничение Что делает Пример
Кардинальность Делает необязательные элементы обязательными или запрещает их Patient.identifier 1..*; Patient.photo 0..0
Must support Получатели должны иметь возможность хранить и отображать элемент, если он отправлен US Core помечает birthDate как must-support
Фиксированное значение или шаблон Блокирует элемент на одно значение Observation.category фиксировано на vital-signs
Привязка Направляет элемент на набор значений с определенной силой Observation.code привязан к списку жизненно важных показателей, обязателен
Слайсинг Разделяет список на именованные части со своими правилами Артериальное давление: компонент разделен на систолическое и диастолическое
Ограничение типа Ограничивает выбор value[x] ограничен valueQuantity
Инвариант Правило FHIRPath, которое должно выполняться "effective[x] должен присутствовать" или "value или dataAbsentReason"
Цель ссылки Ограничивает, на что может указывать ссылка subject только Patient, и только пациенты, соответствующие этому профилю

Профиль может только сужать. Он не может добавлять элементы (для этого существуют расширения), переименовывать что-либо или ослаблять базовые правила.

Сила привязки

FHIR определяет четыре уровня силы привязки. required (обязательно): код должен исходить из набора значений. extensible (расширяемый): используйте набор значений, если концепция подходит; в противном случае разрешен другой код. preferred (предпочтительный): рекомендуется, но не обязательно. example (пример): только для иллюстрации, что используется в большинстве базовых ресурсов. Неправильное толкование extensible как required является частой причиной ложных ошибок валидации.

Читаемый фрагмент профиля

Профиль FHIR — это StructureDefinition, в котором дифференциальный список содержит только ограничения, отличающиеся от базового ресурса, в то время как снимок (snapshot) содержит каждый элемент. Читаемый фрагмент ниже ограничивает Observation для домашнего измерения артериального давления: код фиксирован на LOINC 85354-9, а компонент разделен ровно на одну систолическую и одну диастолическую часть.

Дифференциал профиля перечисляет только то, что изменилось по сравнению с базовым; снимок перечисляет все. Этот дифференциал гласит, что наблюдение артериального давления должно содержать LOINC 85354-9 и ровно два компонента:

{
  "resourceType": "StructureDefinition",
  "url": "https://example.org/fhir/StructureDefinition/bp-home",
  "name": "HomeBloodPressure",
  "status": "active",
  "kind": "resource",
  "abstract": false,
  "type": "Observation",
  "baseDefinition": "http://hl7.org/fhir/StructureDefinition/Observation",
  "derivation": "constraint",
  "differential": {"element": [
    {"id": "Observation.code", "path": "Observation.code",
     "patternCodeableConcept": {"coding": [{"system": "http://loinc.org", "code": "85354-9"}]}},
    {"id": "Observation.component", "path": "Observation.component", "min": 2, "max": "2",
     "slicing": {"discriminator": [{"type": "pattern", "path": "code"}], "rules": "closed"}},
    {"id": "Observation.component:systolic", "path": "Observation.component", "sliceName": "systolic", "min": 1, "max": "1"},
    {"id": "Observation.component:systolic.code", "path": "Observation.component.code",
     "patternCodeableConcept": {"coding": [{"system": "http://loinc.org", "code": "8480-6"}]}},
    {"id": "Observation.component:diastolic", "path": "Observation.component", "sliceName": "diastolic", "min": 1, "max": "1"},
    {"id": "Observation.component:diastolic.code", "path": "Observation.component.code",
     "patternCodeableConcept": {"coding": [{"system": "http://loinc.org", "code": "8462-4"}]}}
  ]}
}

Профили редко пишутся вручную; авторы используют FHIR Shorthand (FSH) с SUSHI или инструменты, такие как Forge и Simplifier, и публикуют с помощью IG Publisher от HL7. Руководства распространяются в виде пакетов (hl7.fhir.us.core#6.1.0, hl7.fhir.uv.ips#1.1.0), которые загружают валидаторы и серверы.

Расширения

Расширение — это элемент ключ-значение, размещенный в extension (или modifierExtension, когда он изменяет смысл ресурса и не должен игнорироваться). Его url — это канонический URL его StructureDefinition; его значение — это типизированный value[x] или вложенные расширения. Место рождения — это расширение, определенное HL7 для Patient:

{
  "resourceType": "Patient",
  "id": "example",
  "extension": [{
    "url": "http://hl7.org/fhir/StructureDefinition/patient-birthPlace",
    "valueAddress": {"city": "Lyon", "country": "FR"}
  }],
  "name": [{"family": "Doe", "given": ["Jane"]}]
}

Правила хорошей практики: ищите существующее расширение (в реестре HL7 и национальных руководствах) перед его определением; присвойте ему URL в домене, который вы контролируете; определите его в StructureDefinition, чтобы другие могли его проверить; никогда не используйте расширение для того, что уже покрывается базовым элементом.

meta.profile и валидация

meta.profile — это список канонических URL, которым, как утверждает ресурс FHIR, он соответствует, но утверждение не является доказательством. Валидатор проверяет ресурс на соответствие базовой спецификации и каждому заявленному профилю, или профилю, который вы укажете. Референсный валидатор HL7 работает локально с пакетами, а FHIR-серверы предоставляют операцию $validate, которая принимает параметр профиля.

meta.profile перечисляет канонические URL, которым ресурс заявляет о соответствии. Заявление — это не доказательство: валидатор проверяет ресурс по базовой спецификации и по каждому заявленному профилю (или по профилю, который вы попросите использовать). Референсный валидатор HL7 (validator_cli.jar) работает локально и загружает пакеты; серверы предлагают POST /Observation/$validate?profile=…; IG Publisher проверяет все примеры в руководстве. Ресурс может соответствовать нескольким профилям одновременно (национальный профиль Patient и IPS Patient), если они не противоречат друг другу.

Два практических правила: сервер, который объявляет профиль в своем CapabilityStatement, должен отклонять ресурсы, которые ему не соответствуют; клиент, который получает ресурсы, не должен отклонять неизвестные расширения или дополнительные элементы, которые профиль не запретил, поскольку базовая спецификация их допускает.

В Anpheros

Anpheros Platform — это сервер FHIR R4, который использует LOINC для наблюдений, ATC для лекарств и SNOMED CT, где это применимо, и предлагает бесплатный валидатор, который проверяет структуру ресурса на соответствие FHIR R4. Когда клиника отправляет ресурсы с meta.profile, установленным на национальный профиль или профиль IPS, утверждение сохраняется, чтобы последующая система могла проверить его.

Бесплатный валидатор находится на сайте для разработчиков. Сами руководства см. в разделе Объяснение руководств по внедрению FHIR.

Связанные страницы

Источники

Частые вопросы

Может ли профиль добавить новый элемент в ресурс?

Нет. Профили только ограничивают. Новые данные помещаются в расширение, которое профиль затем может требовать или запрещать, как и любой другой элемент.

Что на самом деле означает must-support?

Руководство по внедрению определяет это; как правило, отправитель заполняет элемент, когда у него есть данные, а получатель сохраняет и может отображать их. Это не делает элемент обязательным.

Если у ресурса нет meta.profile, является ли он недействительным?

Нет. meta.profile — это заявление, а не требование. Сервер или руководство могут требовать его; базовая спецификация — нет. Валидаторы могут быть запрошены для проверки по профилю, который ресурс не объявляет.

Как узнать, какой профиль использовать в моей стране?

Каждое национальное сообщество FHIR публикует основное руководство (US Core, UK Core, nl-core, немецкие Basisprofile и т. д.); на странице руководств по внедрению объясняется, как их найти. Межгосударственные сводки используют IPS.

Anpheros Platform

Попробуйте бесплатно в песочнице

Первый запрос FHIR за 5 минут. API HL7 FHIR R4 с встроенным согласием пациента: попробуйте в песочнице, затем подключите свое приложение или систему клиники.

Бесплатно · 30 синтетических пациентов · без карты

Это руководство носит информационный характер и не заменяет консультацию врача. Решения о своём здоровье принимайте вместе с врачом. В экстренной ситуации звоните по местному номеру экстренной помощи (112 в Европе).
Автор
Команда Anpheros

Anpheros создает медицинскую карту, которую пациент контролирует и может делиться с любой клиникой, на платформе HL7 FHIR R4, базирующейся в ЕС. Эти руководства помогут вам понять и организовать свое здоровье; они не заменяют вашего врача.

О Anpheros →