AnpherosAnpheros PlatformDevelopers

Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card

Как хранить медицинские записи с помощью FHIR R4

Руководство: создайте пациента, наблюдение артериального давления и состояние, используйте транзакцию, выполните поиск, обновление с историей и чтение происхождения данных — каждый запрос с curl и реальным ответом в бесплатной песочнице.

В этом учебном пособии небольшая медицинская запись хранится в виде ресурсов HL7 FHIR R4: Patient, Observation артериального давления и диагноз в виде Condition, а затем пациент и измерение вместе в одной транзакции. Выполняется поиск этих записей, обновление диагноза без потери предыдущей версии и чтение информации о том, кто что записал. Каждый запрос представляет собой обычный curl к бесплатной песочнице Anpheros, и каждый показанный ответ — это то, что возвращает API.

Если вы новичок в FHIR, сначала ознакомьтесь с FHIR platform для понимания концепций. Эта страница является практической частью.

Три ресурса, с которых начинаются большинство записей

Ресурс Что содержит Кодируется с помощью
Patient информация о субъекте записи: имя, дата рождения, пол, идентификаторы из других систем ваши системы идентификации
Observation все, что измеряется или сообщается: жизненно важные показатели, результаты лабораторных исследований, вес, оценка симптомов LOINC, единицы UCUM
Condition диагноз или проблема со здоровьем с указанием ее статуса во времени ICD-10 (SNOMED CT при наличии лицензии)

Лекарства (MedicationStatement), аллергии (AllergyIntolerance), иммунизации и документы следуют тому же шаблону; 26 поддерживаемых типов ресурсов перечислены в заявлении о возможностях по адресу /fhir/R4/metadata.

Перед началом работы

Получите ключ песочницы (sk_test_…) на platform.anpheros.com/dashboard с помощью опции Get a sandbox key. Никакие данные, которые вы создадите там, не являются реальными данными пациентов и не видны другим проектам.

export BASE=https://platform.anpheros.com/fhir/R4
export KEY=sk_test_…

Шаг 1: Создание пациента

curl -X POST "$BASE/Patient" -H "Authorization: Bearer $KEY" -H "Content-Type: application/fhir+json" -d '{
  "resourceType": "Patient",
  "identifier": [{"system": "https://clinic.example/mrn", "value": "MRN-10442"}],
  "name": [{"family": "Marin", "given": ["Ioana"]}],
  "gender": "female",
  "birthDate": "1979-04-12"
}'

201 Created, с идентификатором и версией, назначенными сервером:

{"resourceType": "Patient",
 "identifier": [{"system": "https://clinic.example/mrn", "value": "MRN-10442"}],
 "name": [{"family": "Marin", "given": ["Ioana"]}], "gender": "female", "birthDate": "1979-04-12",
 "id": "d09e3942-ed86-4458-b099-fa674ab21b84",
 "meta": {"versionId": "1", "lastUpdated": "2026-10-12T20:16:51.043Z"}}

Сохраняйте свои собственные идентификаторы в identifier с помощью system, который вы контролируете (здесь — номер записи клиники), чтобы вы всегда могли снова найти пациента с помощью GET $BASE/Patient?identifier=https://clinic.example/mrn|MRN-10442. FHIR id принадлежит платформе и специфичен для вашего проекта: другой проект увидит того же человека под другим идентификатором.

export PID=d09e3942-ed86-4458-b099-fa674ab21b84

Шаг 2: Сохранение измерения как Observation

Артериальное давление — это одно наблюдение с двумя компонентами: систолическим и диастолическим, каждый со своим кодом LOINC. Укажите, кто произвел измерение: здесь — домашнее устройство.

curl -X POST "$BASE/Observation" -H "Authorization: Bearer $KEY" -H "Content-Type: application/fhir+json" \
     -H "X-Anpheros-Author-Type: device" -H "Idempotency-Key: bp-2026-10-10-0830" -d '{
  "resourceType": "Observation",
  "status": "final",
  "category": [{"coding": [{"system": "http://terminology.hl7.org/CodeSystem/observation-category", "code": "vital-signs"}]}],
  "code": {"coding": [{"system": "http://loinc.org", "code": "85354-9", "display": "Blood pressure panel"}]},
  "subject": {"reference": "Patient/'$PID'"},
  "effectiveDateTime": "2026-10-10T08:30:00Z",
  "component": [
    {"code": {"coding": [{"system": "http://loinc.org", "code": "8480-6"}]},
     "valueQuantity": {"value": 138, "unit": "mmHg", "system": "http://unitsofmeasure.org", "code": "mm[Hg]"}},
    {"code": {"coding": [{"system": "http://loinc.org", "code": "8462-4"}]},
     "valueQuantity": {"value": 88, "unit": "mmHg", "system": "http://unitsofmeasure.org", "code": "mm[Hg]"}}
  ]
}'

Ответом является сохраненный ресурс с id и meta.versionId: "1". Три детали важны для пригодной к использованию записи:

Лабораторные результаты — это тот же ресурс с category laboratory и обычно referenceRange. Чтобы импортировать полные лабораторные отчеты, см. Как импортировать лабораторные результаты в запись FHIR.

Шаг 3: запись диагноза как Condition

curl -X POST "$BASE/Condition" -H "Authorization: Bearer $KEY" -H "Content-Type: application/fhir+json" \
     -H "X-Anpheros-Author-Type: practitioner" -d '{
  "resourceType": "Condition",
  "subject": {"reference": "Patient/'$PID'"},
  "clinicalStatus": {"coding": [{"system": "http://terminology.hl7.org/CodeSystem/condition-clinical", "code": "active"}]},
  "verificationStatus": {"coding": [{"system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", "code": "confirmed"}]},
  "code": {"coding": [{"system": "http://hl7.org/fhir/sid/icd-10", "code": "I10", "display": "Essential (primary) hypertension"}]},
  "onsetDateTime": "2026-03-02"
}'

clinicalStatus (active, resolved, in remission) и verificationStatus (confirmed, provisional) намеренно разделены: предполагаемый диагноз — это не то же самое, что подтвержденный, а разрешенная проблема все еще является частью истории.

Шаг 4: создание связанных ресурсов в одной транзакции

Когда пациент и его первое измерение поступают вместе, например, из медицинской системы, отправьте их в виде transaction Bundle. Либо все сохраняется, либо ничего. Ссылки между новыми ресурсами используют временные urn:uuid: идентификаторы, которые сервер заменяет:

curl -X POST "$BASE" -H "Authorization: Bearer $KEY" -H "Content-Type: application/fhir+json" -d '{
  "resourceType": "Bundle", "type": "transaction",
  "entry": [
    {"fullUrl": "urn:uuid:9f1c0d1e-0000-4000-8000-000000000001",
     "resource": {"resourceType": "Patient", "name": [{"family": "Stan", "given": ["Mihai"]}], "gender": "male", "birthDate": "1990-02-01"},
     "request": {"method": "POST", "url": "Patient"}},
    {"resource": {"resourceType": "Observation", "status": "final",
       "category": [{"coding": [{"system": "http://terminology.hl7.org/CodeSystem/observation-category", "code": "vital-signs"}]}],
       "code": {"coding": [{"system": "http://loinc.org", "code": "29463-7", "display": "Body weight"}]},
       "subject": {"reference": "urn:uuid:9f1c0d1e-0000-4000-8000-000000000001"},
       "effectiveDateTime": "2026-10-10",
       "valueQuantity": {"value": 82.4, "unit": "kg", "system": "http://unitsofmeasure.org", "code": "kg"}},
     "request": {"method": "POST", "url": "Observation"}}
  ]
}'

transaction-response содержит одну запись на ресурс, с "status": "201 Created", его location и сохраненным ресурсом. subject ресурса Observation теперь ссылается на реальный Patient/fad3665a-….

Шаг 5: Поиск

curl "$BASE/Observation?patient=$PID&code=http://loinc.org|85354-9&date=ge2026-10-01&_sort=-date" \
     -H "Authorization: Bearer $KEY"

Вы получаете searchset Bundle с total и соответствующими ресурсами, в порядке убывания даты создания. Другие часто используемые поисковые запросы: Condition?patient=$PID&clinical-status=active, Observation?patient=$PID&category=laboratory и Patient/$PID/$everything для всей записи.

Шаг 6: обновление без потери истории

Гипертония разрешилась. Измените статус и добавьте дату окончания, используя If-Match с версией, которую вы прочитали, чтобы никогда не перезаписать чужие изменения:

curl -X PUT "$BASE/Condition/$CID" -H "Authorization: Bearer $KEY" -H "Content-Type: application/fhir+json" \
     -H 'If-Match: W/"1"' -d '{ …the same Condition…, "clinicalStatus": {"coding": [{"system": "http://terminology.hl7.org/CodeSystem/condition-clinical", "code": "resolved"}]}, "abatementDateTime": "2026-10-11" }'

200 OK с ETag: W/"2". Если другая запись оказалась там первой, вы получите 412 и прочитаете снова. Предыдущая версия все еще там:

curl "$BASE/Condition/$CID/_history" -H "Authorization: Bearer $KEY"

возвращает обе версии: versionId 2 (resolved) и 1 (active). GET $BASE/Condition/$CID/_history/1 читает старую. Ничто в записи не перезаписывается молча.

Шаг 7: просмотр авторства записей

Каждая запись о записи создает ресурс Provenance. Для показаний артериального давления:

curl "$BASE/Provenance?target=Observation/$OBS" -H "Authorization: Bearer $KEY"
{"resourceType": "Provenance",
 "target": [{"reference": "Observation/d83d9075-…/_history/1"}],
 "recorded": "2026-10-12T20:16:51.056000Z",
 "activity": {"coding": [{"system": "http://terminology.hl7.org/CodeSystem/v3-DataOperation", "code": "CREATE"}]},
 "agent": [{"type": {"coding": [{"system": "http://terminology.hl7.org/CodeSystem/provenance-participant-type", "code": "author"}]},
            "who": {"identifier": {"system": "https://anpheros.com/fhir/CodeSystem/author-type", "value": "device"}, "display": "proj_…"},
            "onBehalfOf": {"identifier": {"system": "https://anpheros.com/fhir/sid/organization", "value": "org_…"}, "display": "…"}}]}

Тип автора, который вы отправили (device), записывается вместе с проектом и организацией. Отправьте X-Anpheros-Author-Ref: Practitioner/<id>, чтобы указать имя клинициста, стоящего за записью.

Шаг 8: запись как сводка

curl "$BASE/Patient/$PID/\$summary" -H "Authorization: Bearer $KEY"

возвращает Международную сводку пациента (International Patient Summary): document Bundle, который начинается с Composition и содержит разделы, такие как Проблемы, Лекарства, Аллергии и Жизненно важные показатели, построенные из вышеуказанных ресурсов. Это формат для передачи другой системе или для печати для врача (FHIR platform).

Предпочитаете JSON без FHIR?

Те же данные доступны через более простой REST-интерфейс, /v1, с теми же идентификаторами: POST /v1/patients/{id}/observations принимает {"code": "85354-9", "category": "vital-signs", "effective_at": "…", "components": […]} и сохраняет ту же запись FHIR Observation. Используйте тот вариант, который лучше подходит для вашего кода. См. Medical data API и SDK.

Часто задаваемые вопросы

Каков наилучший способ хранения медицинских записей?

В виде закодированных, версионированных ресурсов с записью о том, кто их создал. HL7 FHIR R4 предоставляет структуру (Patient, Observation, Condition и другие), стандартные системы кодирования, такие как LOINC и ICD-10, и историю; бэкенд FHIR добавляет поиск, согласие и происхождение поверх этого.

Нужен ли мне FHIR-сервер для использования FHIR?

Вам нужно место, которое хранит и ищет ресурсы FHIR и контролирует, кто может их читать. Вы можете самостоятельно запустить FHIR-сервер с открытым исходным кодом или использовать управляемый, такой как Anpheros; Сравнение Anpheros с другими FHIR-серверами взвешивает варианты, а FHIR против пользовательской медицинской базы данных охватывает создание собственной схемы вместо этого.

Как хранить артериальное давление в FHIR?

Как один Observation с кодом LOINC 85354-9 и две component записи: систолическое 8480-6 и диастолическое 8462-4, каждая с valueQuantity в mm[Hg].

Могу ли я изменить сохраненный ресурс?

Да, с PUT и If-Match. Каждое изменение создает новую версию; предыдущие версии остаются читаемыми через _history, а Provenance записывает, кто внес каждое изменение. Удаления являются мягкими и сохраняют историю.

Связанные материалы

Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card

Product updates by email

New features, guides and the end of the beta. One email a month at most.

Send me occasional Anpheros Platform updates by email (new features, API changes, guides). I'll confirm by email and can unsubscribe in one click from any email. Privacy