Healthcare IT

FHIR - Standard który rewolucjonizuje wymianę danych medycznych

Tomasz Pisarewski
13.01.2026
12 min

FHIR - Standard który rewolucjonizuje wymianę danych medycznych

Wprowadzenie

Jeśli pracujesz w branży healthcare IT lub planujesz budować aplikacje medyczne, prędzej czy później spotkasz się ze standardem FHIR (Fast Healthcare Interoperability Resources). To nie jest kolejny nudny standard - to rewolucja w sposobie, w jaki systemy medyczne wymieniają dane.

W tym artykule wyjaśnię:

  • Czym jest FHIR i skąd się wziął
  • Dlaczego wygrał z poprzednimi standardami
  • Jak wygląda praca z FHIR w praktyce
  • Gdzie FHIR jest już obowiązkowy (uwaga: Polska nadchodzi!)

Historia: Od chaosu do standardu

Przed FHIR: Wieża Babel w medycynie

Wyobraź sobie szpital, gdzie:

  • System rejestracji pacjentów nie rozmawia z laboratorium
  • Wyniki badań przychodzą faxem (tak, w 2024!)
  • Przeniesienie dokumentacji między szpitalami trwa tygodnie
  • Każda integracja to osobny projekt za setki tysięcy złotych

To nie jest science fiction - to rzeczywistość większości placówek medycznych na świecie.

HL7 v2 - Pierwszy poważny próba (1987)

HL7 (Health Level Seven) v2 powstał w 1987 roku jako próba standaryzacji. Problem?

  • Format oparty na separatorach (pipe |)
  • Tysiące opcjonalnych pól
  • Każdy producent implementował "po swojemu"
  • Brak walidacji - garbage in, garbage out

Przykład wiadomości HL7 v2:

MSH|^~\&|HIS|SZPITAL|LAB|LABORATORIUM|202401141200||ADT^A01|MSG001|P|2.5
PID|1||123456^^^SZPITAL^MR||Kowalski^Jan||19800515|M

Czytalne? Nie bardzo.

HL7 v3 / CDA - Akademicka porażka (2005)

HL7 v3 miał być "perfekcyjny" - pełna formalizacja w XML, RIM (Reference Information Model), tysiące stron specyfikacji.

Efekt? Prawie nikt tego nie zaimplementował. Za skomplikowane, za drogie, za wolne.

FHIR: Nowe podejście (2014)

FHIR (wymawiane jak "fire" 🔥) powstał z prostej obserwacji:

"Zróbmy to tak, jak robią to programiści webowi - REST API + JSON"

Filozofia FHIR

  1. 80/20 Rule - Zdefiniuj 80% przypadków, resztę można rozszerzyć
  2. RESTful - Standardowe HTTP verbs (GET, POST, PUT, DELETE)
  3. JSON + XML - Wybierz format który ci pasuje
  4. Modularność - Zasoby (Resources) jak klocki LEGO
  5. Open Source - Specyfikacja dostępna za darmo

Podstawy FHIR

Resources - Fundamentalne klocki

FHIR definiuje około 150 typów zasobów (Resources). Najważniejsze:

| Resource | Opis | Przykład użycia | |----------|------|-----------------| | Patient | Dane pacjenta | Imię, PESEL, adres | | Practitioner | Personel medyczny | Lekarz, pielęgniarka | | Observation | Obserwacje/wyniki | Wynik badania krwi | | Condition | Diagnoza/choroba | ICD-10: J06.9 | | MedicationRequest | Recepta | Lek, dawkowanie | | Encounter | Wizyta/pobyt | Hospitalizacja | | DiagnosticReport | Raport diagnostyczny | USG, RTG, laboratorium |

Przykład: Pacjent w FHIR (JSON)

{
  "resourceType": "Patient",
  "id": "przyklad-pacjent",
  "identifier": [
    {
      "system": "http://nfz.gov.pl/pesel",
      "value": "80051512345"
    }
  ],
  "name": [
    {
      "use": "official",
      "family": "Kowalski",
      "given": ["Jan", "Adam"]
    }
  ],
  "gender": "male",
  "birthDate": "1980-05-15",
  "address": [
    {
      "use": "home",
      "line": ["ul. Przykładowa 123"],
      "city": "Warszawa",
      "postalCode": "00-001",
      "country": "PL"
    }
  ],
  "telecom": [
    {
      "system": "phone",
      "value": "+48 123 456 789",
      "use": "mobile"
    },
    {
      "system": "email",
      "value": "jan.kowalski@example.com"
    }
  ]
}

Czytelne? Bardzo! Nawet nie-programista zrozumie co to jest.

RESTful API

FHIR działa jak każde nowoczesne REST API:

# Pobierz pacjenta
GET /fhir/Patient/123

# Szukaj pacjentów po nazwisku
GET /fhir/Patient?family=Kowalski

# Utwórz nowego pacjenta
POST /fhir/Patient
Content-Type: application/fhir+json
{ ... dane pacjenta ... }

# Aktualizuj pacjenta
PUT /fhir/Patient/123
Content-Type: application/fhir+json
{ ... zaktualizowane dane ... }

# Usuń pacjenta
DELETE /fhir/Patient/123

Search Parameters

FHIR ma potężny system wyszukiwania:

# Pacjenci urodzeni po 1980
GET /fhir/Patient?birthdate=gt1980-01-01

# Obserwacje dla konkretnego pacjenta
GET /fhir/Observation?patient=Patient/123

# Aktywne recepty na paracetamol
GET /fhir/MedicationRequest?status=active&medication=paracetamol

# Wizyty z ostatnich 30 dni
GET /fhir/Encounter?date=gt2024-12-15

# Łączenie warunków
GET /fhir/Observation?patient=123&code=http://loinc.org|85354-9&date=gt2024-01-01

FHIR w praktyce

Przykład: Integracja z laboratorium

Scenariusz: Szpital chce automatycznie pobierać wyniki badań z laboratorium.

Bez FHIR:

  • Własny format CSV/XML
  • FTP do przesyłu plików
  • Parser pisany od zera
  • Mapowanie pól: 3 tygodnie pracy
  • Każde laboratorium = nowa integracja

Z FHIR:

// Pobierz wyniki dla pacjenta z ostatnich 24h
const results = await fetch(
  'https://lab.example.com/fhir/DiagnosticReport?' +
  'patient=Patient/123&' +
  'date=gt' + yesterday + '&' +
  'status=final',
  {
    headers: {
      'Authorization': 'Bearer ' + token,
      'Accept': 'application/fhir+json'
    }
  }
);

const bundle = await results.json();

// Bundle zawiera wszystkie wyniki
bundle.entry.forEach(entry => {
  const report = entry.resource;
  console.log(`Badanie: ${report.code.text}`);
  console.log(`Status: ${report.status}`);
  console.log(`Data: ${report.effectiveDateTime}`);
});

Korzyści:

  • Standardowy format - jedno laboratorium, wszystkie laboratoria
  • Dokumentacja online - nie musisz pytać dostawcy
  • Biblioteki gotowe - HAPI FHIR (Java), fhir.js, Firely SDK (.NET)
  • Walidacja - serwer odrzuci niepoprawne dane

Przykład: Wynik badania krwi (Observation)

{
  "resourceType": "Observation",
  "id": "hemoglobina-123",
  "status": "final",
  "category": [
    {
      "coding": [
        {
          "system": "http://terminology.hl7.org/CodeSystem/observation-category",
          "code": "laboratory",
          "display": "Laboratory"
        }
      ]
    }
  ],
  "code": {
    "coding": [
      {
        "system": "http://loinc.org",
        "code": "718-7",
        "display": "Hemoglobin [Mass/volume] in Blood"
      }
    ],
    "text": "Hemoglobina"
  },
  "subject": {
    "reference": "Patient/123",
    "display": "Jan Kowalski"
  },
  "effectiveDateTime": "2026-01-14T10:30:00+01:00",
  "valueQuantity": {
    "value": 14.5,
    "unit": "g/dL",
    "system": "http://unitsofmeasure.org",
    "code": "g/dL"
  },
  "referenceRange": [
    {
      "low": {
        "value": 13.5,
        "unit": "g/dL"
      },
      "high": {
        "value": 17.5,
        "unit": "g/dL"
      },
      "text": "13.5-17.5 g/dL (mężczyźni)"
    }
  ],
  "interpretation": [
    {
      "coding": [
        {
          "system": "http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation",
          "code": "N",
          "display": "Normal"
        }
      ]
    }
  ]
}

FHIR na świecie

USA: Obowiązek prawny

Od 2021 roku 21st Century Cures Act wymaga:

  • Wszystkie systemy EHR muszą obsługiwać FHIR
  • Pacjenci mają prawo do swoich danych przez API
  • Kary za "information blocking" do $1M/naruszenie

Apple Health i Google Health już pobierają dane z szpitali przez FHIR!

Unia Europejska: EHDS nadchodzi

European Health Data Space (EHDS) - regulacja która zmieni wszystko:

  • Obowiązkowa wymiana danych medycznych między krajami UE
  • FHIR jako podstawowy format wymiany
  • Termin: 2025-2027 dla poszczególnych krajów
  • Polska: przygotowania trwają

Polska: Stan obecny

  • P1 (e-recepta, e-skierowanie) - własny format, ale migracja do FHIR planowana
  • IKP (Internetowe Konto Pacjenta) - integracje coraz częściej przez FHIR
  • Prywatne kliniki - liderzy już implementują FHIR
  • Szpitale publiczne - powoli, ale nieuchronnie

Narzędzia i biblioteki

Serwery FHIR

| Serwer | Język | Licencja | Uwagi | |--------|-------|----------|-------| | HAPI FHIR | Java | Open Source | Najpopularniejszy | | Microsoft FHIR Server | C# | Open Source | Azure integration | | IBM FHIR Server | Java | Open Source | Enterprise-ready | | Google Cloud Healthcare API | - | Commercial | Managed service | | Firely Server | .NET | Commercial | Certyfikowany |

Biblioteki klienckie

JavaScript/TypeScript:

npm install fhir-kit-client
# lub
npm install @types/fhir

Python:

pip install fhirclient
# lub
pip install fhir.resources

Java:

<dependency>
  <groupId>ca.uhn.hapi.fhir</groupId>
  <artifactId>hapi-fhir-client</artifactId>
  <version>6.10.0</version>
</dependency>

.NET:

dotnet add package Hl7.Fhir.R4

Narzędzia do testowania

  • FHIR Validator - Oficjalny walidator HL7
  • Postman - Kolekcje FHIR gotowe do importu
  • Inferno - Testy zgodności (używane w USA do certyfikacji)
  • Synthea - Generator syntetycznych danych pacjentów

Praktyczne wskazówki

1. Zacznij od profili

FHIR jest elastyczny - za elastyczny. Użyj profili (profiles) żeby ograniczyć opcje:

{
  "resourceType": "StructureDefinition",
  "id": "pl-patient",
  "url": "http://example.pl/fhir/StructureDefinition/pl-patient",
  "name": "PolishPatient",
  "status": "active",
  "kind": "resource",
  "abstract": false,
  "type": "Patient",
  "baseDefinition": "http://hl7.org/fhir/StructureDefinition/Patient",
  "derivation": "constraint"
}

2. Używaj terminologii

FHIR bez kodów to chaos. Najważniejsze systemy kodowania:

  • LOINC - kody badań laboratoryjnych
  • SNOMED CT - diagnozy, procedury
  • ICD-10 - klasyfikacja chorób
  • ATC - leki
  • UCUM - jednostki miar

3. Testuj z prawdziwymi danymi

Synthea generuje realistyczne dane:

# Generuj 100 pacjentów z Polski
java -jar synthea.jar -p 100 --exporter.fhir.export true

4. Waliduj zawsze

# Oficjalny walidator
java -jar validator_cli.jar patient.json -version 4.0

5. Myśl o bezpieczeństwie

FHIR + SMART on FHIR = OAuth2 dla healthcare:

// SMART on FHIR authorization
const client = await FHIR.oauth2.ready();
const patient = await client.patient.read();

Przyszłość FHIR

FHIR R5 (2023)

  • Lepsze wsparcie dla genomiki
  • Ulepszone subskrypcje (real-time updates)
  • Nowe zasoby dla badań klinicznych

FHIR Subscriptions

Real-time powiadomienia:

{
  "resourceType": "Subscription",
  "status": "active",
  "criteria": "Observation?patient=Patient/123",
  "channel": {
    "type": "websocket",
    "endpoint": "wss://example.com/fhir/ws"
  }
}

FHIR Bulk Data

Export milionów rekordów:

GET /fhir/$export
Accept: application/fhir+ndjson

Podsumowanie

FHIR to nie przyszłość - to teraźniejszość. Jeśli budujesz cokolwiek w healthcare IT:

  1. Ucz się FHIR teraz - będzie obowiązkowy
  2. Używaj gotowych bibliotek - nie wyważaj otwartych drzwi
  3. Testuj z Synthea - nie potrzebujesz prawdziwych danych pacjentów
  4. Śledź EHDS - zmiany prawne nadchodzą szybko
  5. Dołącz do community - chat.fhir.org, HL7 Polska

Zasoby do nauki


Masz pytania o FHIR? Planujesz integrację systemów medycznych? Skontaktuj się ze mną - chętnie pomogę!

Podobał Ci się ten artykuł?

Udostępnij go znajomym i współpracownikom!

TP

Tomasz Pisarewski

Full-Stack Developer | AI Expert | Fide-Soft

Od ponad 10 lat tworzę oprogramowanie - od aplikacji webowych przez systemy backendowe po rozwiązania oparte na sztucznej inteligencji. Dzielę się wiedzą z projektów i najnowszych technologii w branży IT.