# Как хранить медицинские записи с использованием FHIR R4

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

Source: https://developers.anpheros.com/ru/guides/store-medical-records-fhir

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

Если вы новичок в FHIR, сначала ознакомьтесь с [FHIR platform](https://developers.anpheros.com/ru/guides/fhir) для понимания концепций. Эта страница является практической частью.

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

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

Лекарства (`MedicationStatement`), аллергии (`AllergyIntolerance`), иммунизации и документы следуют тому же шаблону; [26 поддерживаемых типов ресурсов](https://developers.anpheros.com/ru/guides/fhir) перечислены в заявлении о возможностях по адресу `/fhir/R4/metadata`.

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

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

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

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

```bash
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`, с идентификатором и версией, назначенными сервером:

```json
{"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` принадлежит платформе и специфичен для вашего проекта: другой проект увидит того же человека под другим идентификатором.

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

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

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

```bash
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"`. Три детали важны для пригодной к использованию записи:

- **Коды, а не метки.** `85354-9` означает "панель артериального давления" в любой системе FHIR; свободный текст "BP" — нет. Ищите коды с помощью `GET /v1/terminology/loinc?q=blood pressure` ([FHIR code systems](https://developers.anpheros.com/ru/guides/fhir-code-systems)).
- **Единицы UCUM** (`mm[Hg]`, `kg`, `mg/dL`) в `valueQuantity.code`, чтобы значения можно было сравнивать и преобразовывать.
- **`Idempotency-Key`.** Повторная попытка после тайм-аута возвращает первый ответ вместо двойного сохранения показания.

Лабораторные результаты — это тот же ресурс с `category` `laboratory` и обычно `referenceRange`. Чтобы импортировать полные лабораторные отчеты, см. [Как импортировать лабораторные результаты в запись FHIR](https://developers.anpheros.com/ru/guides/import-lab-results-fhir).

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

```bash
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:` идентификаторы, которые сервер заменяет:

```bash
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: Поиск

```bash
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` с версией, которую вы прочитали, чтобы никогда не перезаписать чужие изменения:

```bash
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` и прочитаете снова. Предыдущая версия все еще там:

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

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

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

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

```bash
curl "$BASE/Provenance?target=Observation/$OBS" -H "Authorization: Bearer $KEY"
```

```json
{"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: запись как сводка

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

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

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

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

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

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

### Нужен ли мне FHIR-сервер для использования FHIR?
Вам нужно место, которое хранит и ищет ресурсы FHIR и контролирует, кто может их читать. Вы можете самостоятельно запустить FHIR-сервер с открытым исходным кодом или использовать управляемый, такой как Anpheros; [Сравнение Anpheros с другими FHIR-серверами](https://developers.anpheros.com/ru/guides/fhir-server-comparison) взвешивает варианты, а [FHIR против пользовательской медицинской базы данных](https://developers.anpheros.com/ru/guides/fhir-vs-custom-database) охватывает создание собственной схемы вместо этого.

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

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

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

- [Платформа FHIR](https://developers.anpheros.com/ru/guides/fhir): концепции, типы ресурсов и операции
- [Кодовые системы FHIR](https://developers.anpheros.com/ru/guides/fhir-code-systems): LOINC, ICD-10, ATC, UCUM
- [Как импортировать лабораторные результаты в запись FHIR](https://developers.anpheros.com/ru/guides/import-lab-results-fhir)
- [API медицинских данных](https://developers.anpheros.com/ru/guides/medical-data-api): более простой REST-интерфейс для тех же данных
- [Бесплатная база данных FHIR и песочница](https://developers.anpheros.com/ru/guides/free-fhir-database)
