Архитектура интеграции: как МИС общается с ЕГИСЗ
Единая государственная информационная система в сфере здравоохранения (ЕГИСЗ) выступает центральным хабом для обмена медицинскими данными. Медицинская информационная система (МИС) клиники подключается к ней как клиент, отправляя электронные направления, сведения о расписании и получая статусы записей. Ядро взаимодействия - два потока данных: исходящий (направления пациентов и слоты) и входящий (подтверждения, отказы, обновления статусов).
Для системного администратора или DevOps-инженера интеграция начинается с организации защищённого транспортного уровня. Без него ни один запрос не пройдёт. Далее идёт выбор протокола прикладного уровня, который определит формат ваших пакетов и методы API. Ошибка на этом этапе приводит к отклонению даже синтаксически корректных сообщений.
Типовая схема включает три компонента: вашу МИС, промежуточный шлюз с криптозащитой и API-эндпоинты ЕГИСЗ. Шлюз терминирует VPN-туннель и проверяет клиентский TLS-сертификат. После успешного рукопожатия МИС может вызывать методы для создания направлений, загрузки слотов и проверки статусов. Все вызовы журналируются на стороне шлюза - эти логи станут основным источником для диагностики.
Протоколы и форматы: что выбрать для своей МИС
ЕГИСЗ поддерживает два стека протоколов: классический SOAP с XML-сообщениями и современный FHIR (Fast Healthcare Interoperability Resources) поверх REST с JSON. Выбор зависит от возможностей вашей МИС и требований конкретного регионального сегмента ЕГИСЗ.
FHIR предпочтительнее для новых интеграций. Он работает через привычные HTTP-методы (GET, POST, PUT, DELETE), использует компактный JSON и предоставляет готовые ресурсы: Patient, Appointment, ServiceRequest, Slot. SOAP остаётся в эксплуатации у legacy-систем, которые не обновлялись последние 5-7 лет. Если ваша МИС поддерживает оба протокола, выбирайте FHIR - меньше накладных расходов на парсинг XML, проще отладка через Postman или curl.
Пример эндпоинта FHIR для создания направления:
POST https://egisz-gateway.example.gov.ru/fhir/ServiceRequest
Пример SOAP-эндпоинта:
POST https://egisz-gateway.example.gov.ru/ws/ReferralService
Заголовок Content-Type для FHIR: application/fhir+json. Для SOAP: text/xml; charset=utf-8. Не перепутайте - шлюз ЕГИСЗ отбрасывает запросы с неверным Content-Type до обработки тела.
Защищённый канал: настройка VPN и TLS
Медицинские данные относятся к категории специальных персональных данных. Передавать их через открытый интернет без шифрования запрещено регулятором. ЕГИСЗ требует организации VPN-туннеля (IPsec или WireGuard) и взаимной TLS-аутентификации.
Пошаговая настройка WireGuard до шлюза ЕГИСЗ:
- Получите от оператора ЕГИСЗ публичный ключ шлюза, IP-адрес эндпоинта и выделенный вам диапазон туннельных адресов.
- Сгенерируйте пару ключей на стороне МИС:
wg genkey | tee privatekey | wg pubkey > publickey - Создайте конфигурационный файл
/etc/wireguard/egisz.conf:[Interface] PrivateKey = <ваш_приватный_ключ> Address = 10.200.0.2/30 DNS = 10.200.0.1 [Peer] PublicKey = <публичный_ключ_шлюза> Endpoint = egisz-gw.example.gov.ru:51820 AllowedIPs = 10.200.0.0/30 PersistentKeepalive = 25 - Поднимите туннель:
wg-quick up egisz - Проверьте связность:
ping 10.200.0.1
После поднятия туннеля настройте TLS. ЕГИСЗ выдаёт клиентский сертификат X.509. Проверьте его валидность и цепочку доверия:
openssl s_client -connect 10.200.0.1:443 -cert client.crt -key client.key -CAfile ca.crt -verify 2
Успешное рукопожатие подтверждает, что канал готов к передаче данных. Сохраните вывод команды - он пригодится при обращении в техподдержку ЕГИСЗ.
Электронное направление: структура и формирование
Электронное направление - структурированный документ, который МИС отправляет в ЕГИСЗ для маршрутизации пациента в другое учреждение. Отказ в приёме направления чаще всего вызван несоответствием формата или отсутствием обязательных полей. Разберём структуру, чтобы вы могли формировать корректные документы с первого раза.
Обязательные поля направления: идентификатор пациента в ЕГИСЗ (ЕНП - единый номер пациента), диагноз по справочнику МКБ-10, цель визита (консультация, диагностика, госпитализация), OID целевого учреждения. Все справочники вы получаете от регионального оператора ЕГИСЗ. Не подставляйте значения из локальной БД МИС - OID и коды должны совпадать с мастер-данными федеральной системы. Подробнее о настройке правил маршрутизации внутри МИС читайте в пошаговом руководстве по настройке маршрутизации пациентов в МИС.
Пример направления в формате FHIR
Работающий JSON-документ для ресурса ServiceRequest с комментариями к каждому блоку:
{
"resourceType": "ServiceRequest",
"id": "ref-2026-07-21-001",
"status": "active",
"intent": "order",
"priority": "routine",
"subject": {
"reference": "Patient/1234567890",
"display": "ЕНП пациента"
},
"code": {
"coding": [{
"system": "urn:oid:1.2.643.5.1.13.13.11.1005",
"code": "Z01.7",
"display": "Консультация кардиолога"
}]
},
"reasonCode": [{
"coding": [{
"system": "urn:oid:1.2.643.5.1.13.13.11.1006",
"code": "I10",
"display": "Эссенциальная гипертензия"
}]
}],
"performer": [{
"reference": "Organization/1.2.643.5.1.13.13.12.1.100.777",
"display": "OID целевого учреждения"
}],
"authoredOn": "2026-07-21T10:30:00+03:00"
}
Частые ошибки при формировании:
- Неверный OID справочника в поле
system. Каждый справочник (МКБ-10, цели визита, типы услуг) имеет уникальный OID. Сверяйтесь с реестром, полученным от оператора. - Отсутствие
intent. Поле обязательно для ServiceRequest, допустимые значения: proposal, plan, order, original-order, reflex-order, filler-order, instance-order, option. - Пустой
performer. Без указания целевого учреждения направление не может быть маршрутизировано. - Несовпадение кодировки. Все строки должны быть в UTF-8. Кириллица в cp1251 вызывает ошибку парсинга на стороне ЕГИСЗ.
Передача сведений о слотах и мощностях
Маршрутизация пациента невозможна без актуального расписания. ЕГИСЗ агрегирует слоты со всех подключённых учреждений и показывает пациенту доступные времена для записи. Ваша задача - обеспечить регулярную синхронизацию слотов из МИС в федеральную систему.
Механизм работает по принципу push: МИС отправляет изменения расписания через API ЕГИСЗ. Полная выгрузка выполняется раз в сутки, инкрементальные обновления - по факту изменений (отмена приёма, перенос, добавление нового слота). Задержка между изменением в МИС и отображением в ЕГИСЗ не должна превышать 15 минут. При превышении этого порога срабатывает алерт мониторинга.
API для загрузки расписания: эндпоинты и методы
ЕГИСЗ предоставляет REST-методы для управления слотами в формате FHIR. Основной ресурс - Slot. Доступные операции:
PUT /fhir/Slot/{slot_id}- создание или полное обновление слота. Тело запроса - ресурс Slot в JSON.DELETE /fhir/Slot/{slot_id}- удаление слота (отмена приёма).PATCH /fhir/Slot/{slot_id}- частичное обновление (изменение статуса).
Аутентификация через клиентский TLS-сертификат. Дополнительный заголовок Authorization: Bearer <токен> не требуется, если используется взаимный TLS.
Пример curl-запроса для загрузки слота:
curl -X PUT \
https://egisz-gateway.example.gov.ru/fhir/Slot/slt-20260721-001 \
--cert client.crt \
--key client.key \
-H "Content-Type: application/fhir+json" \
-d '{
"resourceType": "Slot",
"id": "slt-20260721-001",
"schedule": {"reference": "Schedule/sch-cardio-01"},
"status": "free",
"start": "2026-07-22T09:00:00+03:00",
"end": "2026-07-22T09:30:00+03:00",
"serviceType": [{
"coding": [{
"system": "urn:oid:1.2.643.5.1.13.13.11.1005",
"code": "B01.015.001"
}]
}]
}'
Поле schedule.reference указывает на ресурс Schedule, который описывает врача и кабинет. Его нужно предварительно зарегистрировать в ЕГИСЗ через отдельный запрос. Без привязки к Schedule слот не будет отображаться в системе записи.
Диагностика и устранение ошибок интеграции
Сбои при обмене с ЕГИСЗ делятся на три категории: транспортные (нет соединения), аутентификационные (недействителен сертификат) и прикладные (невалидные данные). Для каждой категории есть свой набор инструментов диагностики.
Транспортные ошибки выявляются через проверку VPN-туннеля и доступности эндпоинта. Аутентификационные - через анализ TLS-рукопожатия. Прикладные - через разбор кодов ответа HTTP и тела сообщения с описанием ошибки.
Базовый набор инструментов: tcpdump для захвата трафика, openssl для проверки сертификатов, curl и Postman для тестовых запросов, анализатор JSON (jq) для валидации структуры. Логи МИС и логи шлюза ЕГИСЗ сопоставляются по временным меткам - расхождение в миллисекундах указывает на задержку на конкретном узле.
Кейс: ошибка 400 Bad Request при отправке направления
Симптом: МИС отправляет направление, ЕГИСЗ возвращает HTTP 400 с телом {"issue": [{"severity": "error", "code": "invalid", "diagnostics": "Invalid JSON content"}]}.
Причина: в теле запроса присутствует невалидный JSON. В одном из кейсов проблема была в поле diagnosis - разработчик МИС использовал строку вместо массива объектов CodeableConcept. ЕГИСЗ ожидает массив, даже если диагноз один.
Диагностика: сохраните тело запроса из логов МИС в файл request.json. Прогоните через валидатор:
cat request.json | jq .
Если jq выдаёт ошибку парсинга - JSON сломан синтаксически. Если парсинг успешен - сверьте структуру с FHIR-схемой ресурса ServiceRequest. Конкретно в этом кейсе jq показал, что reasonCode - строка, а не массив. Исправление: обернули значение в квадратные скобки, отправили повторно - 201 Created.
Для системной диагностики маршрутизации в целом используйте чек-лист аудита и оптимизации схемы маршрутизации пациентов. Он поможет проверить метрики и найти узкие места за один рабочий день.
Мониторинг и проверка корректности обмена
Интеграция с ЕГИСЗ требует непрерывного мониторинга. Разовый запуск и проверка «работает - не работает» недостаточны. Нужен автоматический контроль трёх уровней: доступность канала, валидность сертификата, успешность тестовых запросов.
Настройте алерты на события в логах: ошибки TLS, таймауты соединения, коды ответов 4xx и 5xx. Порог срабатывания - три ошибки подряд за 5 минут. Инструмент алертинга можно подключить к вашей системе мониторинга (Zabbix, Prometheus + Alertmanager) через парсинг лог-файла или HTTP-эндпоинт health-check.
Сверка целостности: раз в час сравнивайте количество отправленных направлений (из логов МИС) с количеством принятых (из ответов ЕГИСЗ). Расхождение больше 1% - повод для внеплановой диагностики. Такая проверка выявляет «тихие» потери пакетов, которые не генерируют явных ошибок.
Скрипт для автоматической проверки соединения
Bash-скрипт для ежедневного контроля. Проверяет три компонента: VPN-туннель, TLS-сертификат и ответ health-check эндпоинта. Разместите в cron с запуском каждые 15 минут:
#!/bin/bash
LOG_FILE="/var/log/egisz-health.log"
GW_IP="10.200.0.1"
HC_URL="https://10.200.0.1/fhir/metadata"
CERT="/etc/ssl/egisz/client.crt"
KEY="/etc/ssl/egisz/client.key"
CA="/etc/ssl/egisz/ca.crt"
# Проверка VPN-туннеля
ping -c 3 -W 2 $GW_IP > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') CRITICAL: VPN tunnel to $GW_IP is down" >> $LOG_FILE
exit 1
fi
# Проверка срока действия сертификата
EXPIRY=$(openssl x509 -enddate -noout -in $CERT | cut -d= -f2)
EXPIRY_EPOCH=$(date -d "$EXPIRY" +%s)
NOW_EPOCH=$(date +%s)
DAYS_LEFT=$(( ($EXPIRY_EPOCH - $NOW_EPOCH) / 86400 ))
if [ $DAYS_LEFT -lt 30 ]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') WARNING: TLS certificate expires in $DAYS_LEFT days" >> $LOG_FILE
fi
# Проверка health-check эндпоинта
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" --cert $CERT --key $KEY --cacert $CA $HC_URL)
if [ "$HTTP_CODE" != "200" ]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') CRITICAL: Health-check returned HTTP $HTTP_CODE" >> $LOG_FILE
exit 2
fi
echo "$(date '+%Y-%m-%d %H:%M:%S') OK: All checks passed" >> $LOG_FILE
exit 0
Добавьте в cron:
*/15 * * * * /usr/local/bin/egisz-health-check.sh
Скрипт пишет результат в лог-файл. Система мониторинга забирает оттуда строки с CRITICAL и отправляет уведомление дежурному администратору. Порог срабатывания - одно событие CRITICAL, так как интеграция с ЕГИСЗ критична для работы клиники.
Если вы планируете масштабное обновление инфраструктуры, используйте готовый шаблон чек-листа для планирования миграции IT-систем в 2026 году. Он поможет синхронизировать обновление МИС с требованиями ЕГИСЗ без потери совместимости.