# Как интегрировать медицинские системы с FHIR-бэкендом

> Учебное пособие: подключение электронной медицинской карты клиники к FHIR R4 записям пациентов — справочник врачей, сопоставление по номеру записи, визит как одна транзакция с врачом в качестве автора, лабораторные отчеты, данные других поставщиков и веб-хуки.

Source: https://developers.anpheros.com/ru/guides/integrate-clinic-systems-fhir

**Это учебное пособие подключает программное обеспечение клиники (EMR, систему управления практикой или инструмент бронирования) к записям пациентов HL7 FHIR R4 в Anpheros: клиника и ее врачи регистрируются в справочнике, пациенты сопоставляются по номеру записи клиники, визит записывается как одна транзакция с указанием врача в качестве автора, и клиника узнает о данных, добавляемых другими поставщиками.** Каждый запрос `curl` отправляется в бесплатную песочницу, а ответы являются собственными ответами платформы.

Интеграция выполняется на сервере клиники с использованием API-ключа проекта для пациентов, которых регистрирует клиника, и для людей, у которых уже есть запись Anpheros, — с одобренным ими OAuth-доступом.

## Что чему соответствует

| В клинической системе | В FHIR R4 |
|---|---|
| клиника, ее отделения | `Organization` |
| врач или медсестра | `Practitioner` |
| этот человек, работающий в этой клинике, со специализацией | `PractitionerRole` |
| карта пациента и ее номер | `Patient` с `identifier` в системе клиники |
| визит | `Encounter` |
| жизненно важные показатели, результаты, измеренные во время визита | `Observation`, связанные с `Encounter` |
| диагноз | `Condition` (ICD-10), с `verificationStatus` предварительным или подтвержденным |
| рецепт, текущее лечение | `MedicationStatement` (ATC) |
| письмо, выписной эпикриз, скан | `DocumentReference` с файлом |
| результаты лабораторных исследований | [коннектор лаборатории](https://developers.anpheros.com/ru/guides/lab-connector), в `Observation` |

## Шаг 1: регистрация клиники и ее врачей

Ресурсы каталога не содержат пациентов. Другие проекты в той же среде могут их читать, поэтому другие поставщики услуг пациента видят, кто что написал, но только ваш проект может их изменять.

```bash
export BASE=https://platform.anpheros.com/fhir/R4
export KEY=sk_test_…
H=(-H "Authorization: Bearer $KEY" -H "Content-Type: application/fhir+json")

curl -X POST $BASE/Organization "${H[@]}" -d '{"resourceType": "Organization", "active": true, "name": "Clinica Cardio Nord",
  "identifier": [{"system": "https://clinic.example/org", "value": "CCN"}]}'

curl -X POST $BASE/Practitioner "${H[@]}" -d '{"resourceType": "Practitioner", "active": true,
  "name": [{"family": "Popescu", "given": ["Ana"], "prefix": ["Dr."]}]}'

curl -X POST $BASE/PractitionerRole "${H[@]}" -d '{"resourceType": "PractitionerRole", "active": true,
  "practitioner": {"reference": "Practitioner/'$PRACTITIONER'"},
  "organization": {"reference": "Organization/'$ORG'"},
  "code": [{"text": "Cardiologist"}]}'
```

Сохраните возвращенные идентификаторы рядом с записями вашего персонала. Когда кто-то уходит, установите его `PractitionerRole` в `"active": false`; его прошлые записи сохранят его имя, и он больше не сможет действовать через вашу систему.

## Шаг 2: сопоставление пациентов

Для пациентов, которых регистрирует клиника, создайте `Patient` с номером записи клиники в качестве идентификатора:

```bash
curl -X POST $BASE/Patient "${H[@]}" -d '{"resourceType": "Patient",
  "identifier": [{"system": "https://clinic.example/mrn", "value": "MRN-20981"}],
  "name": [{"family": "Dinu", "given": ["Andrei"]}], "gender": "male", "birthDate": "1968-11-05"}'
```

С этого момента ищите пациента по этому номеру, никогда по имени и дате рождения:

```bash
curl "$BASE/Patient?identifier=https://clinic.example/mrn|MRN-20981" -H "Authorization: Bearer $KEY"
```

**Когда у человека уже есть запись в Anpheros**, из его собственного приложения или от другого поставщика, клиника не создает вторую. Она запрашивает у человека доступ с помощью OAuth, с планшета на стойке регистрации или по ссылке, отправленной до визита, используя **конфиденциальное** приложение (сервер клиники хранит секрет). Человек выбирает свою запись и срок, в течение которого клиника может получить к ней доступ. Шаги описаны в [Как реализовать согласие пациента с помощью SMART on FHIR](https://developers.anpheros.com/ru/guides/smart-on-fhir-backend); поле `patient` токена является id для хранения в вашем файле.

## Шаг 3: Запись визита как одной транзакции

Визит порождает несколько ресурсов, которые относятся друг к другу. Отправляйте их в `transaction`, чтобы они были сохранены все сразу или не сохранены вовсе, и укажите, кто работает: `X-Anpheros-Acting-As` указывает роль врача. Она становится автором в Provenance, записывается в журнал доступа и отображается пациенту по имени.

```bash
curl -X POST $BASE "${H[@]}" \
  -H "X-Anpheros-Acting-As: PractitionerRole/$ROLE" \
  -H "X-Anpheros-Author-Type: practitioner" \
  -H "X-Anpheros-Source-System: ccn-emr" -d '{
  "resourceType": "Bundle", "type": "transaction",
  "entry": [
    {"fullUrl": "urn:uuid:aa000000-0000-4000-8000-000000000001",
     "resource": {"resourceType": "Encounter", "status": "finished",
       "class": {"system": "http://terminology.hl7.org/CodeSystem/v3-ActCode", "code": "AMB", "display": "ambulatory"},
       "subject": {"reference": "Patient/'$PID'"},
       "serviceProvider": {"reference": "Organization/'$ORG'"},
       "participant": [{"individual": {"reference": "PractitionerRole/'$ROLE'"}}],
       "period": {"start": "2026-10-09T10:00:00Z", "end": "2026-10-09T10:30:00Z"}},
     "request": {"method": "POST", "url": "Encounter"}},
    {"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": "8867-4", "display": "Heart rate"}]},
       "subject": {"reference": "Patient/'$PID'"},
       "encounter": {"reference": "urn:uuid:aa000000-0000-4000-8000-000000000001"},
       "effectiveDateTime": "2026-10-09T10:10:00Z",
       "valueQuantity": {"value": 92, "unit": "/min", "system": "http://unitsofmeasure.org", "code": "/min"}},
     "request": {"method": "POST", "url": "Observation"}},
    {"resource": {"resourceType": "Condition",
       "subject": {"reference": "Patient/'$PID'"},
       "encounter": {"reference": "urn:uuid:aa000000-0000-4000-8000-000000000001"},
       "clinicalStatus": {"coding": [{"system": "http://terminology.hl7.org/CodeSystem/condition-clinical", "code": "active"}]},
       "verificationStatus": {"coding": [{"system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", "code": "provisional"}]},
       "code": {"coding": [{"system": "http://hl7.org/fhir/sid/icd-10", "code": "I48.0", "display": "Paroxysmal atrial fibrillation"}]}},
     "request": {"method": "POST", "url": "Condition"}}
  ]}'
```

`transaction-response` содержит `201 Created` для Encounter, Observation и Condition. Observation и Condition теперь указывают на реальный `Encounter/0ca25459-…`. Provenance каждого ресурса указывает роль врача, клинику и исходную систему:

```json
"agent": [{"who": {"reference": "PractitionerRole/e6d8c227-…",
                   "identifier": {"system": "https://anpheros.com/fhir/CodeSystem/author-type", "value": "practitioner"}},
           "onBehalfOf": {"reference": "Organization/c3a56a4b-…", "display": "Clinica Cardio Nord"}}],
"entity": [{"role": "source", "what": {"identifier": {"system": "ccn-emr"}}}]
```

Диагноз `provisional` до его подтверждения. Обновите его до `confirmed` позже, и история сохранит оба значения. Значение каждого поля объясняется в разделе [Provenance медицинских данных](https://developers.anpheros.com/ru/guides/medical-data-provenance).

## Шаг 4: лабораторные результаты и документы

Результаты из собственной лаборатории клиники или принесенные пациентом отчеты обрабатываются через лабораторный коннектор одним запросом на отчет:

```bash
curl -X POST "https://platform.anpheros.com/v1/patients/$PID/labs/import" -H "Authorization: Bearer $KEY" \
     -H "Content-Type: x-application/hl7-v2+er7" -H "X-Anpheros-Source-System: ccn-lab" --data-binary @oru.hl7
```

Письма и выписные эпикризы являются документами: создайте `DocumentReference` через `/v1/patients/{id}/documents` и загрузите PDF. Оригинальный файл никогда не изменяется, а извлеченные из него значения ссылаются на него. См. [Как импортировать лабораторные результаты в запись FHIR](https://developers.anpheros.com/ru/guides/import-lab-results-fhir) и [API медицинских данных](https://developers.anpheros.com/ru/guides/medical-data-api).

## Шаг 5: читайте, что написали другие провайдеры, и придерживайтесь своей роли

С согласия пациента клиника читает всю запись в пределах своих областей видимости, включая то, что добавили другие клиники, лаборатории и сам пациент. Она может изменять только то, что написала сама. Обновление или удаление ресурса другой организации приведет к ошибке `403`, и оригинал останется без изменений. Чтобы исправить что-то, написанное другим провайдером, создайте свой собственный ресурс (например, новый `Condition` с вашей оценкой), и запись будет содержать оба, каждый со своим автором.

Перед визитом `GET $BASE/Patient/$PID/$summary` предоставляет Международную сводку данных пациента (International Patient Summary) из записи: проблемы, лекарства, аллергии и последние жизненные показатели из каждого источника.

## Шаг 6: получение уведомлений о новых данных

Зарегистрируйте вебхук один раз для проекта клиники:

```bash
curl -X POST https://platform.anpheros.com/v1/webhooks -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
     -d '{"url": "https://ccn.example/anpheros/hook", "events": ["resource.created", "resource.updated", "consent.revoked"]}'
```

Когда другой проект записывает данные в запись, к которой ваша клиника имеет доступ, событие уведомляет об этом с помощью `data.external: true` и источника, чтобы ваша ЭМК могла отобразить сообщение "новые результаты из другой лаборатории" без необходимости опроса. Событие `consent.revoked` означает, что пациент отозвал доступ клиники: прекратите синхронизацию этой записи. Подписи, повторные попытки и полезные данные описаны в разделе [Вебхуки](https://developers.anpheros.com/ru/guides/webhooks).

## Что видит пациент

Пациент видит в своей записи визит, частоту сердечных сокращений и предварительный диагноз, каждый из которых помечен как добавленный доктором Аной Попеску из Clinica Cardio Nord. В своих подключениях приложение клиники перечисляет каждый доступ по имени, когда действовал практикующий врач. Такая прозрачность побуждает пациентов предоставлять доступ следующей клинике.

## Чек-лист для запуска в эксплуатацию

- [ ] Организации, Практикующие врачи и Роли практикующих врачей зарегистрированы; ушедшие сотрудники установлены как неактивные
- [ ] Пациенты сопоставляются по идентификатору клиники, никогда по имени
- [ ] Существующие записи достигаются через согласие OAuth, не дублируются
- [ ] Каждый запрос от клинического персонала несет `X-Anpheros-Acting-As`
- [ ] Визиты записываются как транзакции; диагнозы с правильным статусом верификации
- [ ] Исходная система установлена при каждой записи; лабораторные отчеты через коннектор
- [ ] Конечная точка Webhook проверяет подписи; `consent.revoked` обработано
- [ ] Производственный проект с подписанным DPA (ключи `sk_live_…`); см. [Цены](https://developers.anpheros.com/ru/guides/pricing)

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

### Есть ли у Anpheros готовый коннектор для моей ЭМС?
Нет. Готовых коннекторов к конкретным ЭМС или лабораторным системам нет; интеграция строится на основе FHIR R4 и REST API, обычно в виде небольшого сервиса рядом с ЭМС. Сообщения HL7 v2 из лабораторий принимаются как есть.

### Может ли врач работать в двух клиниках?
Да. Один `Practitioner` может иметь `PractitionerRole` в каждой организации. Роль, указанная в `X-Anpheros-Acting-As`, определяет, для какой клиники записывается каждое действие.

### Что происходит, когда пациент отзывает доступ клиники?
Запросы клиники для этой записи возвращают `401`, и отправляется вебхук `consent.revoked`. То, что клиника записала, остается в записи пациента с указанием источника; клиника просто больше не может ее читать или изменять.

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

- [Интеграции в сфере здравоохранения](https://developers.anpheros.com/ru/guides/healthcare-integrations): обзор всех шаблонов интеграции
- [Объяснение происхождения медицинских данных](https://developers.anpheros.com/ru/guides/medical-data-provenance)
- [Как реализовать согласие пациента с помощью SMART on FHIR](https://developers.anpheros.com/ru/guides/smart-on-fhir-backend)
- [Как импортировать результаты лабораторных исследований в запись FHIR](https://developers.anpheros.com/ru/guides/import-lab-results-fhir)
- [Интероперабельность медицинских данных](https://developers.anpheros.com/ru/guides/interoperability)
