Перейти к содержимому
Как это устроено

Ослепление и приватность

X7 Insight защищает две разные вещи: целостность ослепления исследования (чтобы допуск к кодам лечения не «протёк» через данные) и приватность участников (чтобы в системе не было прямых идентификаторов пациента). Клинические значения, связанные с кодом субъекта, остаются персональными данными специальной категории. Обе защиты работают на уровне сервера, а не интерфейса — поэтому их нельзя обойти, «подсмотрев» ответ API или выгрузку.

Ослепление задаётся полем (ItemDef.blinded) и ролью. Слепое значение видит только расслеплённая роль — держатель права data.unblinded.read в своей области (например, несвязанный статистик или неслепой фармацевт). Всем остальным сервер отдаёт маску в каждом канале, и кнопки «показать» у них нет: случайно раскрыть слепое значение нельзя.

  • Слепое поле показывается как ••• — фиксированной ширины. Длина маски не зависит от значения, поэтому по ней нельзя догадаться, «длинное» значение или «короткое».
  • Маскирование делает сервер при сериализации, а не браузер. Роль без допуска не получит значение ни в форме, ни в API, ни в экспорте — скрывать нечего, потому что значение просто не передаётся.
  • В аудиторском следе слепые значения в колонках «До / После» тоже маскируются для тех, у кого нет допуска.

Расслеплённая роль и экстренное раскрытие

Заголовок раздела «Расслеплённая роль и экстренное раскрытие»
  • Право data.unblinded.read назначается явно и с причиной — грантом или ролью (пресет «Unblinded Statistician»). Назначение и его отзыв записываются в аудиторский след: по нему видно, кто и когда был расслеплён. Администратору это право автоматически не выдаётся.
  • Расслеплённая роль видит значения без дополнительных действий. Каждый экран или выгрузка, показавшие ей слепые значения, оставляют в аудиторском следе одну запись «Расслеплённое чтение»: кто, где и какие формы или записи — без самих значений.
  • Код группы конкретного субъекта ослеплённая роль может узнать только через экстренное раскрытие — это делает исследователь, с причиной, подтверждением и уведомлением спонсора.
  • Экспорт всегда собирается с явно выбранным профилем слепоты: «ослеплённая» (с маскированием, по умолчанию) или «расслеплённая» — вторая требует права на расслеплённые данные. Режима «маскировать по правам запустившего» больше нет: слепота каждой выгрузки видна в журнале «Экспорты» по самой строке.
  • Инспекционный пакет — всегда слепой: он никогда не расслепляет, независимо от прав запускающего. Финальный пакет — слепой по умолчанию; расслеплённый вариант возможен под двойным контролем: право data.unblinded.read требуется и у запускающего, и у скачивающего.

Приватность: псевдонимные коды субъектов

Заголовок раздела «Приватность: псевдонимные коды субъектов»

X7 Insight — это система сбора клинических данных, а не медицинская карта. Участник идентифицируется псевдонимным кодом субъекта, а не именем.

  • В EDC не хранятся ФИО, адреса и прямые идентификаторы пациента — субъект адресуется кодом; таблица «код ↔ человек» остаётся в центре.
  • Псевдонимизация не обезличивание: клинические значения, связанные с кодом, — это персональные данные специальной категории (сведения о состоянии здоровья, ст. 10 152‑ФЗ), пока ключ сопоставления существует. Состав полей минимизируйте по протоколу (ст. 5 ч. 5 152‑ФЗ): системный шаблон демографии просит год рождения, а не полную дату.
  • Файлы и изображения загружаются уже обезличенными: закрыть прямые идентификаторы на скане первички — шаг центра перед загрузкой, как и при передаче копии монитору.
  • Субъект — это код (например, идентификатор в рамках центра и исследования) плюс клинические данные и статус. Такой псевдонимный код позволяет вести данные участника, не раскрывая, кто это.
  • Данные и аудит языконезависимы: локализация — только представление, канонические данные хранятся в нейтральном виде. Имена сотрудников в аудиторском следе — это данные персонала, а не участников: они нужны для атрибутируемости записи.

Ослепление — это обычная механика доступа, а не отдельный «режим»:

  • слепота поля задаётся в дизайне (ItemDef.blinded);
  • значение видит только держатель data.unblinded.read в нужной области (scope);
  • назначение и отзыв этого права аудируются;
  • события платформы фильтруют полезную нагрузку по правам подписчика, чтобы слепое значение не «утекло» через уведомление модулю.

Подробнее о правах и областях — в Каталоге разрешений.