# Як зберігати медичні записи за допомогою FHIR R4

> Посібник: створіть Пацієнта, Спостереження (Observation) артеріального тиску та Стан (Condition), використовуйте транзакцію, виконайте пошук, оновлення з історією та читання походження — кожен запит із curl та реальна відповідь у безкоштовному пісочниці.

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

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

Якщо ви новачок у FHIR, спочатку прочитайте [FHIR platform](https://developers.anpheros.com/uk/guides/fhir) для ознайомлення з концепціями. Ця сторінка є практичною частиною.

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

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

Медикаменти (`MedicationStatement`), алергії (`AllergyIntolerance`), імунізації та документи слідують тому ж шаблону; [26 підтримуваних типів ресурсів](https://developers.anpheros.com/uk/guides/fhir) перелічені у заяві про можливості (capability statement) за адресою `/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/uk/guides/fhir-code-systems)).
- **Одиниці UCUM** (`mm[Hg]`, `kg`, `mg/dL`) у `valueQuantity.code`, щоб значення можна було порівнювати та конвертувати.
- **`Idempotency-Key`.** Повторна спроба після тайм-ауту повертає першу відповідь замість подвійного збереження показника.

Лабораторні результати — це той самий ресурс із `category` `laboratory` та зазвичай `referenceRange`. Щоб імпортувати повні лабораторні звіти, див. [Як імпортувати лабораторні результати до запису FHIR](https://developers.anpheros.com/uk/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/uk/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/uk/guides/medical-data-api) та [SDKs](https://developers.anpheros.com/uk/guides/sdks).

## Часті запитання

### Який найкращий спосіб зберігати медичні записи?
Як закодовані, версіоновані ресурси із записом про те, хто їх створив. HL7 FHIR R4 надає вам структуру (Patient, Observation, Condition та інші), стандартні системи кодування, такі як LOINC та ICD-10, і історію; FHIR бекенд додає пошук, згоду та походження зверху.

### Чи потрібен мені FHIR сервер для використання FHIR?
Вам потрібне місце, яке зберігає та шукає FHIR ресурси та контролює, хто може їх читати. Ви можете самостійно запустити FHIR сервер з відкритим кодом або використовувати керований, як-от Anpheros; [Як Anpheros порівнюється з іншими FHIR серверами](https://developers.anpheros.com/uk/guides/fhir-server-comparison) зважує варіанти, а [FHIR проти власної бази даних медичних записів](https://developers.anpheros.com/uk/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/uk/guides/fhir): концепції, типи ресурсів та операції
- [Системи кодів FHIR](https://developers.anpheros.com/uk/guides/fhir-code-systems): LOINC, ICD-10, ATC, UCUM
- [Як імпортувати лабораторні результати до запису FHIR](https://developers.anpheros.com/uk/guides/import-lab-results-fhir)
- [API медичних даних](https://developers.anpheros.com/uk/guides/medical-data-api): простіший REST-інтерфейс для тих самих даних
- [Безкоштовна база даних FHIR та пісочниця](https://developers.anpheros.com/uk/guides/free-fhir-database)
