Краткий ответ: базовые ресурсы 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.
Связанные страницы
- FHIR implementation guides explained
- CodeableConcept и Coding в FHIR
- FHIR Observation explained
- FHIR Patient resource explained
- Terminology servers explained
- FHIR validator (сайт для разработчиков)
Источники
- HL7 FHIR R4: Profiling FHIR
- HL7 FHIR R4: Extensibility
- HL7 FHIR R4: StructureDefinition
- HL7 FHIR R4: Terminology bindings
- HL7 FHIR Shorthand
- HL7 FHIR validator
- HL7 FHIR R4: patient-birthPlace extension
Частые вопросы
Может ли профиль добавить новый элемент в ресурс?
Нет. Профили только ограничивают. Новые данные помещаются в расширение, которое профиль затем может требовать или запрещать, как и любой другой элемент.
Что на самом деле означает must-support?
Руководство по внедрению определяет это; как правило, отправитель заполняет элемент, когда у него есть данные, а получатель сохраняет и может отображать их. Это не делает элемент обязательным.
Если у ресурса нет meta.profile, является ли он недействительным?
Нет. meta.profile — это заявление, а не требование. Сервер или руководство могут требовать его; базовая спецификация — нет. Валидаторы могут быть запрошены для проверки по профилю, который ресурс не объявляет.
Как узнать, какой профиль использовать в моей стране?
Каждое национальное сообщество FHIR публикует основное руководство (US Core, UK Core, nl-core, немецкие Basisprofile и т. д.); на странице руководств по внедрению объясняется, как их найти. Межгосударственные сводки используют IPS.
Попробуйте бесплатно в песочнице
Первый запрос FHIR за 5 минут. API HL7 FHIR R4 с встроенным согласием пациента: попробуйте в песочнице, затем подключите свое приложение или систему клиники.
Бесплатно · 30 синтетических пациентов · без карты

