Руководство к использованию стандарта FHIR в ЦИСЗ
0.2.7455 - ci-build

OperationDefinition: Операция объединения ресурсов Patient

Официальный URL: https://fhir.by/OperationDefinition/merge-patient
Unknown as of 2026-11-10 Имя: merge

Операция объединения ресурсов Patient

Назначение и область применения

Операция $merge предназначена для объединения двух ресурсов Patient в один. Один ресурс определяется как Source (источник), другой — как Target (цель, мастер-запись). Данные Source интегрируются в Target, Source деактивируется.

Цели объединения

Цели объединения:

  • устранение дублирующих записей пациента;
  • объединение данных пациента, поступивших из разных МИС;
  • корректировка неполных или неверных ресурсов пациента;
  • объединение данных пациента в жизненном цикле данных при оказании медицинской помощи;
  • обеспечение целостности пациента в ИЭМК.

Область применения

Операция применяется только к ресурсам Patient, существующим в ЦИСЗ.

Операция не применяется к ресурсу Patient профиля Персональная информация.

Операция выполняется асинхронно, за исключением режима preview=true, который выполняется синхронно.

Статус асинхронной операции доступен по URL, возвращённому в ответе на запуск операции.

Пример:

{
    "resourceType": "Parameters",
    "parameter": [
        {
            "name": "ProcessingStatus",
            "valueString": "Pending"
        },
        {
            "name": "OperationStatusReference",
            "valueReference": {
                "reference": "https://internal.cisz.by/api/fhir/Patient/$merge/status/28d2b533-8685-44ec-b532-807236110fe0"
            }
        },
        {
            "name": "StatusDescription",
            "resource": {
                "resourceType": "OperationOutcome"
            }
        }
    ]
}

Если требуется создать нового пациента, объединённого из нескольких Source, клиент должен:

1) создать нового Patient — Target;

2) вызвать $merge для каждого Source, указав созданный Target.

Термины и роли

Термин Определение
Source Запись пациента, которая поглощается и деактивируется
Target Мастер-запись пациента, которая остаётся активной и принимает данные
replaced-by Значение Patient.link.type у Source: «заменено на» указывает на Target
replaces Значение Patient.link.type у Target: «заменяет» указывает на Source

Акторы и права

Ролевая модель

Операция доступна только ролям, указанным в данном разделе.

Роль Описание Права
Регистратор Сотрудник ОЗ, ответственный за внесение персональных данных $merge (+preview)
Врач / фельдшер / медсестра Медицинский работник, оказывающий помощь Запрещено
Администратор ОЗ Главный врач, заместитель главного врача, заведующий отделением $merge (+preview)

Маппинг ролей iehr.merge

Код Наименование
registrar Регистратор
medical-registrar-senior Медицинский регистратор (старший)
registrar-senior Регистратор (старший)
chief-physician Главный врач
head-department-med Заведующий отделением
specialist-doctor head of department Врач-специалист (заведующий отделением)
deputy-chief-physician Заместитель главного врача
deputy-chief-physician-clinical Заместитель главного врача по медицинской части

Ограничение по периоду

Операция применяется ко всем существующим в ЦИСЗ ресурсам пациента (из перечня связанных ресурсов) за весь период. Выбор определенного периода для объединения невозможен.

Выбор Source и Target

Выбор Source и Target:

  • Target выбирается по наиболее полным или достоверным данным;
  • при объединении ресурсов профиля «Пациент» и «Пациент без ИН»: Target — ресурс профиля «Пациент»;
  • если ни одна запись не подходит, создаётся новый ресурс Patient, который становится Target;
  • ресурс профиля «Пациент» нельзя использовать как Source;
  • Source и Target должны быть разными ресурсами;
  • нельзя выбрать Target ресурс профиля «Анонимный пациент».

Предусловия

Перед выполнением $merge должны быть выполнены следующие условия:

  • Source и Target существуют в ЦИСЗ;
  • Source и Target — разные ресурсы;
  • Source не деактивирован;
  • профили Source и Target допустимы бизнес-правилами;
  • Target не является ресурсом профиля «Анонимный пациент»;
  • для активных случаев госпитализации, дневного стационара, лучевой терапии, диспансеризации должно быть выполнено закрытие активных случаев;
  • не должно быть активного непрерывного случая временной нетрудоспособности.

Описание операции

Пример тела запроса

{
  "resourceType": "Parameters",
  "parameter": [
    { "name": "source", "valueReference": { "reference": "pa-1234567..." } },
    { "name": "target", "valueReference": { "reference": "pa-6543210..." } },
    { "name": "preview", "valueBoolean": false }
  ]
}

Форматы ответа

Preview — синхронный ответ:

Запрос:

POST [FHIR_BASE]/Patient/$merge
Authorization: Bearer <token>

Тело запроса:

{
  "resourceType": "Parameters",
  "parameter": [
    { "name": "source", "valueReference": { "reference": "pa-1234567..." } },
    { "name": "target", "valueReference": { "reference": "pa-6543210..." } },
    { "name": "preview", "valueBoolean": true }
  ]
}

Ответ:

Код состояния: 200 Ok

Тело ответа (Bundle типа searchSet):

...
{
            "resource": {
                "resourceType": "OperationOutcome",
                "issue": [
                    {
                        "severity": "information",
                        "code": "informational",
                        "diagnostics": "Будет обновлено 1 ресурса Condition, 1 Encounter, 1 EpisodeOfCare, 1 Observation."
                    }
                ]
            },
            "search": {
                "mode": "outcome"
            }
        }
...

Асинхронный запуск объединения:

Запрос:

POST [FHIR_BASE]/Patient/$merge
Authorization: Bearer <token>

Тело запроса:

{
  "resourceType": "Parameters",
  "parameter": [
    { "name": "source", "valueReference": { "reference": "pa-1234567..." } },
    { "name": "target", "valueReference": { "reference": "pa-6543210..." } },
    { "name": "preview", "valueBoolean": false }
  ]
}

Ответ:

Код состояния: 202 Accepted

Тело ответа:

{
    "resourceType": "Parameters",
    "parameter": [
        {
            "name": "ProcessingStatus",
            "valueString": "Pending"
        },
        {
            "name": "OperationStatusReference",
            "valueReference": {
                "reference": "https://staging.cisz.by/api/fhir/Patient/$merge/status/28d2b553-8685-44ec-b532-807236110fe0"
            }
        },
        {
            "name": "StatusDescription",
            "resource": {
                "resourceType": "OperationOutcome"
            }
        }
    ]
}

Получение статуса асинхронной операции

Пример Parameters при успешном объединении

Запрос:

GET [FHIR_BASE]/Patient/$merge/status/{taskId}
Authorization: Bearer <token>

Ответ:

Код состояния: 200 OK

Тело ответа:

{
  "resourceType": "Parameters",
  "issue": [
    {
      "name": "ProcessingStatus",
      "valueString": "Successed"
    },
    {
      "name": "OperationStatusReference",
      "valueReference": {
        "reference": "http://internal.cisz.by/fhir/Patient/$merge/status/28d2b553-8685-44ec-b532-807236110fe0"
      }
    },
    {
      "name": "OperationId",
      "valueString": "214ae4b3-1f1f-11ef-8fe6-222a0e90dedd"
    }
  ]
}
Пример Parameters при ошибке валидации запроса

Запрос:

GET [FHIR_BASE]/Patient/$merge/status/{sourceId}
Authorization: Bearer <token>

Ответ:

Код состояния: 404 Not Found
{
  "resourceType": "Parameters",
  "id": "8bc2465e-560f-4069-a51e-e76a32a21d3c",
  "meta": {
    "lastUpdated": "2026-05-29T09:17:36.9823861+00:00"
  },
  "issue": [
    {
      "severity": "error",
      "code": "invalid",
      "details": {
        "coding": [
          {
            "system": "http://hl7.org/fhir/dotnet-api-operation-outcome",
            "code": "1012"
          }
        ],
        "text": "Операция объединения для '{sourceId}' не найдена."
      }
    }
  ]
}

Алгоритм объединения

Общие принципы

Target — мастер-запись, его данные приоритетны. Если Target содержит значение, оно остаётся, иначе не заполняется.

Объединение расширений

По умолчанию используется стратегия Target-приоритет, без дополнения из Source.

После объединения полей, но до обновления связанных ресурсов, формируются записи link:

у Source:

  • добавляется новый элемент Patient.link:
    • type: “replaced-by”
    • other: { “reference”: “Patient/" }
  • все старые Patient.link сохраняются.

у Target:

  • добавляется новый элемент Patient.link:
    • type: “replaces”
    • other: { “reference”: “Patient/" }
  • если у Target уже есть такой же link, дублирование пропускается;
  • остальные link сохраняются.

Обновление связанных ресурсов

По умолчанию операция применяется ко всем ресурсам пациента. Перечень ресурсов может уточняться по мере развития ЦИСЗ. Обо всех изменениях разработчики МИС будут уведомлены по регламентированным каналам связи.

При возникновении логических ошибок во время операции изменения ресурсов Source не происходят.

Важно: обновление ссылок Patient.link выполняется после сохранения Target и Source.

Особые правила по ресурсам

Ресурс/область Правило
Анамнезы Оставляет данные Source или Target, обновлённые по дате актуализации
Закрепление Оставляет только данные Target
Непрерывный случай временной нетрудоспособности При наличии активного случая временной нетрудоспособности операция запрещена
Активные случаи госпитализации, дневного стационара, диспансеризации Если Source имеет активные ресурсы, а Target нет - $merge пройдет успешно. Если и Source и Target имеют активные ресурсы - при $merge вернется ошибка, в этом случае необходимо закрыть (отменить) активные ресурсы
Список назначенных рецептурных препаратов (List) Оставляет данные Target и Source
Набор рекомендаций по проведению профилактических прививок Объединяется массив recommendation
AllergologyAnamnesis Объединение массива item без логических проверок
FamilyAnamnesisBY Объединение массива item:familyMember без логических проверок
Электронные документы Ссылки на пациента-Source не изменяются. Идентификаторы электронных документов доступны через $everything для Target, но имеют исходный вид

Полный перечень связанных ресурсов

Ресурс Действие Примечания
Encounter Обновление ссылок —
Observation Обновление ссылок —
Condition Обновление ссылок Возможно дублирование диагнозов
AdverseEvent Обновление ссылок —
AllergyIntolerance Обновление ссылок Возможно дублирование
CarePlan Обновление ссылок —
ClinicalImpression Обновление ссылок —
DeviceDispense Обновление ссылок —
DeviceRequest Обновление ссылок —
DiagnosticReport Обновление ссылок —
DocumentReference Обновление ссылок Содержимое документа не меняется
EpisodeOfCare Обновление ссылок При наличии активных ресурсов для госпитализации, дневного стационара, непрерывного случая временной нетрудоспособности - запрет операции
FamilyMemberHistory Обновление ссылок —
Flag Обновление ссылок —
ImagingStudy Обновление ссылок —
Immunization Обновление ссылок —
ImmunizationRecommendation Особое объединение См. особые правила по ресурсам
List Особое правило См. особые правила по ресурсам
MedicationRequest Обновление ссылок —
MedicationStatement Обновление ссылок —
Procedure Обновление ссылок —
Provenance Обновление ссылок —
QuestionnaireResponse Разное См. особые правила по ресурсам
RelatedPerson Обновление ссылок —
ServiceRequest Обновление ссылок —
Specimen Обновление ссылок —
Task Обновление ссылок —
Appointment Обновление ссылок —

Preview

Запрос с preview=true всегда выполняется синхронно.

Сервер:

Проверяет существование и допустимость Source/Target. Подсчитывает количество связанных ресурсов, подлежащих обновлению. Возвращает Bundle, содержащий ресурс пациента с дополненным массивом Patient.link, и ресурс OperationOutcome, содержащий количество затрагиваемых ресурсов.

Ошибки, откат, блокировки, идемпотентность

Ошибки

Ошибки, возвращаемые синхронно:

HTTP Условие OperationOutcome.code
400 Bad Request Отсутствуют обязательные параметры, некорректный формат, неизвестные параметры invalid
403 Forbidden Недостаточно прав Forbidden
500/503 Внутренние ошибки exception

Откат операции

Откат выполняется автоматически только в случае ошибок во время выполнения операции.

Ручной откат изменений невозможен.

При сбое сервер восстанавливает исходное состояние:

  • возвращает active = true у Source;
  • удаляет добавленные link.replaced-by и link.replaces;
  • восстанавливает исходные ссылки во всех изменённых ресурсах.

После успешного отката возвращается Parameters c OperationOutcome при проверке статуса.

Блокировки

Новые данные, созданные после вызова операции и ссылающиеся на Source, не сохранятся. Пользователю будет возвращено предупреждение о неактивном ресурсе Patient.

Идемпотентность

Операция не является идемпотентной.

Повторный вызов $merge с той же парой Source/Target, если Source уже деактивирован и все ссылки обновлены, должен вернуть код состояния 200 OK и ресурс Parameters c OperationOutcome, содержащим предупреждение: Объединение пациентов было успешно выполнено ранее. Исходный пациент (Source: {request.Source}) деактивирован, указывающим, что объединение уже выполнено. Повторное обновление связанных ресурсов не выполняется.

URL: [base]/$merge

Параметры

ИспользоватьНаименованиеСфера действияКардинальностьТипПривязкаДокументация
INsource1..1id (Анонимный пациент, Пациент без ИН)

Прямая ссылка (id) на ресурс пациента-источника (Source). Может быть ссылкой только на ресурс профилей 'Пациент без ИН' или 'Анонимный пациент'. Идентификатор передается только как GUID регистра пациентов: pa-1234567...

INtarget1..1id (Пациент, Пациент без ИН)

Прямая ссылка (id) на ресурс пациента-цели (Target). Может быть ссылкой только на ресурс профилей 'Пациент' или 'Пациент без ИН'. Идентификатор передается только как GUID регистра пациентов: pa-1234567...

INpreview0..1boolean

true — режим предпросмотра. Объединение не выполняется, система только показывает, какие ресурсы будут затронуты. В ответ вернутся ресурсы для пациента-цели и OperationOutcome с количеством затронутых ресурсов

OUTreturn1..1boolean

Статус ответа будет одним из следующих: • 200 OK — если запрос на объединение не предполагает проблем (хотя могут присутствовать warning) для предварительного просмотра или был завершен без проблем; • 202 Accepted — запрос на объединение принят, обработка объединения будет продолжена в фоновом режиме, статус выполнения объединения доступен по URL, возвращенному в ответе; • 400 Bad Request — во входных параметрах есть ошибки, которые необходимо исправить; • 422 Unprocessable Entity — бизнес-правила препятствуют завершению объединения. Ресурс Parameters будет включать: • входные параметры операции; • OperationOutcome, содержащий ошибки, предупреждения и информационные сообщения; • результирующий объединенный ресурс Patient.

Примечания:

Сценарии использования

Объединение двух существующих записей разных профилей

  1. Предусловие: существуют две записи — «Пациент» и «Пациент без ИН», относящиеся к одному физическому лицу.
  2. Действие: пользователь инициирует $merge, указывая Source и Target. Target — «Пациент».
  3. Результат: данные объединяются, ссылки обновляются, Source деактивируется.
  4. Постусловие: Target — единственная активная запись. Source доступен через link.other.

Объединение с созданием новой мастер-записи

  1. Предусловие: существует запись «Пациент без ИН» и требуется создать запись «Пациент».
  2. Действие: пользователь создаёт новую запись «Пациент» — Target, затем выполняет $merge, указывая запись «Пациент без ИН» как Source.
  3. Результат: создаётся новая мастер-запись.
  4. Постусловие: Target — единственная активная запись.

Дополнительный сценарий для одинаковых профилей

  1. Предусловие: существуют две записи — «Пациент без ИН» и «Пациент без ИН», относящиеся к одному физическому лицу.
  2. Действие: пользователь инициирует $merge, указывая Source и Target. Target — выбор мастер-записи за специалистом.
  3. Результат: данные объединяются, ссылки обновляются, Source деактивируется.
  4. Постусловие: Target — единственная активная запись. Source доступен через link.other.

Объединение записи “Анонимный пациент”

  1. Предусловие: существуют две записи — «Пациент» или «Пациент без ИН» и «Анонимный пациент».
  2. Действие: пользователь с соответствующими правами инициирует $merge.
  3. Результат: данные объединяются, Source деактивируется.
  4. Постусловие: Target — единственная активная запись.

Preview

  1. Действие: пользователь выполняет операцию с preview=true.
  2. Результат: система возвращает ответ с количеством затронутых ресурсов, изменения не применяются.