semd_validator

1

Описание

Сервис проверки СЭМД и локальная копия ФНСИ для 1С:Медицина

Языки

  • XSLT99,9%
  • Java0,1%
README.md

SEMD validator - сервис проверки СЭМД для 1С:Медицина и выдачи копий справочников ФНСИ

Сервис предназначен для выполнения проверок структурированных электронных медицинских документов (СЭМД) на соответствие схеме, схематрону и справочникам ФНСИ.

Сервис состоит из двух компонент: сервлета semd.war и утилиты fnsi-downloader.jar. Утилита получает справочники ФНСИ и сохраняет в собственной базе данных. Справочники загружаются из json файлов формата ФНСИ как из ФНСИ, так и из локальных файлов. Сервлет осуществляет проверку СЭМД, а также выдает справочники ФНСИ по Rest API.

Сервлет semd.war

База данных сервлета

База данных со справочниками ФНСИ, xsd схемы и схематроны для СЭМД располагаются в папке data. Папка должна быть доступна на чтение пользователю, от которого работает Jetty.

В папке data должны быть созданы папки schematrons, avl, passport, cache, delta, local с такими же правами доступа как к папке data. Состав загружаемых с ФНСИ справочников задается в файле\ах FNSIlist.json и FNSIExtraList.json.

FNSIlist.json и FNSIExtraList.json - настройки использования справочников ФНСИ

В файле FNSIlist.json задаются настройки сохранения справочников, которые загружаются на основании их присутствия в справочнике 1.2.643.5.1.13.13.99.2.805. Если в FNSIlist.json справочник не присутствует, но присутствует в справочнике 1.2.643.5.1.13.13.99.2.805, то он загружается с настройками из паспорта справочника.

В файле FNSIExtraList.json задается список справочников и настройки их сохранения, которых нет в справочнике 1.2.643.5.1.13.13.99.2.805, но требуется загрузить в сервис с целью их промежуточного хранения в сервисе. Формат обоих файлов идентичный.

Справочники 1.2.643.5.1.13.13.99.2.805 и 1.2.643.5.1.13.13.11.1520 необходимо включить в файл FNSIExtraList.json, так как их содержимое требуется для загрузки справочников в соответствии с содержимым FNSIlist.json.

Массив объектов в формате JSON, где для справочников указываются следующие настройки:

  • CODESYSTEM - Обязательный. oid справочника ФНСИ.
  • LOAD - Необязательный. Если указано значение 0 (false), то справочник не загружается.
  • USE_COMPARE - Необязательный. Если указано значение 0 (false), то при загрузке справочника не используется метод compare.
  • VALUE - Необязательный. Имя поля справочника ФНСИ, которое будет использоваться как значение справочника. При проверке СЭМД это поле соответствует атрибуту displayName. Если значение не указано, то берется поле, помеченное как VALUE в паспорте справочника.
  • REKV - Необязательный. Список полей справочника, которые будут запрошены с ФНСИ при загрузке справочника. Если REKV отсутствует, то справочник загружается полностью (все поля). Ключ и значение загружаются всегда.
  • INDEXES - Необязательный. Массив объектов с описанием индексов справочника. Реквизиты объекта:
    • FIELD - Обязательный. Имя поля.
    • TYPE - Обязательный. Тип индекса - UNIQ или SIMPLE.
    • SORTING - Необязательный. Массив наименование колонок, задающий порядок сортировки строк в узле индекса. После имени колонки можно указать направление сортировки по полю ASC или DESC. Если не указано, то используется ASC.

UNIQ индексы устанавливаются на поле с типом PRIMARY по паспорту, а также на поля, записанные в поле systemName в справочнике 1.2.643.5.1.13.13.99.2.805. Если в массиве INDEXES не описан индекс на поле, заданное как VALUE, то автоматически будет добавлен SIMPLE индекс на это поле.

Индексы можно устанавливать на уже загруженные справочники. При запуске загрузчика состав индексов будет приведен в соответствии с настройками.

Пример задания индекса на поле:

  • VALIDATE_REFNAME - Если указано значение 0 (false), то при проверке СЭМД не выполнять проверку атрибута codeSystemName.
  • VALIDATE_VALUE - Необязательный. Если указано значение 0 (false), то при проверке СЭМД не выполняется проверка displayName.
  • FNSI - Необязательный. Если указано значение 0 (false), то справочник будет загружаться из папки local.
  • WITHOUT_ROWID - Необязательный. Если указано значение 0 (false), то в справочник будет добавлено поле ROWID и в качестве первичного ключа будет использоваться поле. Поле заполняется уникальными значениями автоматически.
  • COMMENT - Необязательный. Комментарий к справочнику.

Если по данным паспорта не удалось определить поле, которые будет записано в VALUE, то утилита fnsi-downloader выдаст сообщение

и справочник не будет загружен.

Папа avl

Содержит содержимое справочников в файлах со следующими расширениями:

  • avl - файл с уникальным индексом на поле. Данные хранятся в виде avl дерева, загружается в память целиком. В дереве хранятся ссылки на ext файл. Ограничение на размер файла - 2 Гб.
  • idx1 - файл с простым индексом на поле. Данные хранятся в виде avl дерева, загружается в память целиком. Ограничение на размер файла - 2 Гб.
  • idx2 - файл со ссылками на ext файла из узлов дерева idx1. В дереве idx1 хранится ссылка на файл ext2, где лежит массив ссылок на ext. Данные загружаются построчно по мере необходимости. Ограничение на размер файла - 2 Гб.
  • stat - статистика простого индекса.
  • ext - файл с содержимым справочника. Строки справочника загружаются только в момент их использования. Ограничение на размер файла - 2^{63} байт.

Папка passport

Содержит json файлы паспортов справочников.

Папка schematrons

Содержит xsl файлы, полученные их sch файлов (схематронов). Проверка СЭМД осуществляется с помощью xsl файлов. Трансформация sch в xsl производится командой сервлета updatedb. Папка должна быть доступна на изменение пользователю, от которого работает Jetty.

Папка cache

Содержит файлы, загруженные с ФНСИ. Папка очищается после успешного завершения работы fnsi-downloader или при устаревании кеша. Кеш хранится одни сутки. В случае если работа fnsi-downloader была прервана, то при его повторном запуске ранее скачанные с ФНСИ данные будут использоваться из этой папки.

Папка local

Для загрузки справочников не из ФНСИ необходимо файлы справочника (паспорта и данные) в формате ФНСИ поместить в эту папки. Также необходимо прописать правила загрузки этих справочников в файле FNSIExtraList.json.

Служебные страницы

/validate (или verify) - валидация СЭМД

В случае проверки только на xsd-схемы и\или на соответствие справочникам ФНСИ при успешной проверке будет возвращено значение "valid". Иначе будет возращен текст сообщения об ошибке. Проверка на соответствие ФНСИ выполняется в соответствии с файлом настроек FNSIlist.json.

Типы проверок:

  • 0 - проверка только на xsd.
  • 1 - проверка только на sch.
  • 2 - проверка на xsd и sch.
  • 3 - проверка на xsd, sch и ФНСИ. Точный порядок проверок - xsd, ФНСИ, sch.

После выполнения проверки схематроном возвращается результат проверки. Результат записывается в элементе /result/sch. В атрибуте @file элемента sch записывается имя xsl преобразования, по которому выполнялась проверка. Пример успешной проверки:

Примеры неуспешных проверок:

Проверка на соотвествие НФСИ выполняется для ограниченного списка тегов. Часть списка задается в файле FNSITags.txt. Это текстовый файл в кодировке UTF-8. Названия тегов записывается построчно. Тег должен содержать следующие атрибуты, значение которых подлежит контролю - code, codeSystemVersion, codeSystemName, displayName. Если есть namespace, то тег указывается с namespace.

Вторая часть проверяемых тегов содержат сведения из ФРМО об медицинских организациях - это теги с именем representedOrganization и теги со следующими xPath:

  • /ClinicalDocument/informationRecipient/intendedRecipient/receivedOrganization
  • /ClinicalDocument/recordTarget/patient/guardian/guardianOrganization
  • /ClinicalDocument/recordTarget/patientRole/providerOrganization
  • /ClinicalDocument/custodian/assignedCustodian/representedCustodianOrganization
/updatedb - генерация xsl для схематронов

Sch файлы уже должны находится в папке DATA_PATH. Требования к файлам такие же как как к отправляемым в zip архиве через форму send_sch.html Для доступа к ссылкам требуются права администратора или доступ с localhost. В URL передается список OID ЭМД, которым необходимо сгенерировать XSL для валидации. Список передается через разделитель - "_".

Примеры:

Возвращаемые значение - текст 'OK' и далее через пробел список OID ЭМД, которые успешно обработались. В случае возникновения ошибки команда вернет текст ошибки.

/reload - очистка кеша справочников ФНСИ

При завершении работы fnsi-downloader вызывает reload для того, чтобы перезагрузить все справочники сервлета, т.к. они могли обновиться.

Параметры сервлета

В файле semd.war:\WEB-INF\web.xml задаются следующие параметры:

  • DATA_PATH - Обязательный. Полный путь к папке, где будут хранится загруженный файлы (xsd, sch и сгенерированные xsl файлы). Значение по умолчанию - /var/www/upload/tron2.
  • LIST_TYPES_FOR_VARIFICATION - Необязательный. Список OID ЭМД, по которым выполняется проверка. OID указывают через запятую, без пробелов. Если список пустой, то ограничений нет и проверка выполняется по всем типам, по которым загружены xsd и sch.
  • DISABLE_VALIDATOR - Необязательный. Значение "1" отключает возможность использования валидатора СЭМД.
  • ENABLE_AUTHENTICATION - Необязательный. Значение "1" активирует аутентификацию через учетную запись пользователя Портала 1С:ИТС. См. параметр 1Cticket.
  • ZabbixCommand - Необязательный. Команда на запуск zabbix_sender с параметрами. Пример значения: "zabbix_sender -z127.0.0.1 -p10051 -T -i-". Если параметр задан, то следующие три параметра являются обязательными.
  • ZabbixHost - Необязательный. Имя хотя zabbix, информация по которому собирается. Пример значения: "Zabbix server".
  • ZabbixRPSTrapper - Необязательный. Названия траппера zabbix, который собирает информация об rps на получения данных ФНСИ. Пример значения: "fnsi_rps".
  • ZabbixSymbolsSentTrapper - Необязательный. Названия траппера zabbix, который собирает информация об числе символов, которые сервис отправил клиентам при выполнении запрсов на получения данных ФНСИ. Пример значения: "fnsi_symbols_sent".

Установка сервлета

Для работы сервлета semd.war нужен Jetty версии 9.4. Необходимо опубликовать сервлет semd.war в Jetty 9 и руководствоваться инструкций по публикации Jetty.

Для Jetty из состава Ubuntu 24.04 файл semd.war необходимо поместить в папку /var/lib/jetty9/webapps. Отвечать сервлет будет по адресу "http:/localhost:9000/semd/login.html".

Параметр -XX:SoftRefLRUPolicyMSPerMB запуска java рекомендуется указывать в значение 20000. В Ubuntu 24.04 параметры можно задать в файле /etc/default/jetty в переменной JAVA_ARGS. Пример:

Для записи логов jetty необходимо подключить модуль console-capture. Это этого в файле /etc/jetty9/start.ini (для Ubuntu 24.04) надо добавить команду его загрузки

Для предоставления прав записи в эту папку в некоторых дистрибутивах необходимо в настройка sandbox сервиса Jetty дать права записи. Например, в Ubuntu 24.04 необходимо в файле /etc/systemd/system/multi-user.target.wants/jetty9.service в секции [Service] добавить строку (новую):

Для применения настроек надо выполнить:

Rest API НСИ

Rest API НСИ

fnsi-downloader.jar

Загрузка справочников из ФНСИ выполняет консольной утилитой fnsi-downloader.

Параметры командной строки

  • USERKEY - Обязательный. Ключ доступа к сайту nsi.rosmindrav.ru.
  • DATA_PATH - Обязательный. Папка, где располагается файл FNSIlist.json и FNSIExtraList.json (настройки использования справочников ФНСИ), в этой же папке должны быть созданы папки avl и passport, куда будут сохраняться бинарные версии справочников и данные паспортов. Значение параметра должно совпадать с аналогичным параметром сервлета.
  • URL - Необязательный. Адрес публикации сервлета. Используется для сброса кеша сервлета в случае обновления базы данных (вызывается метод reload). ВАЖНО, чтобы доступ к сервлету был через localhost, т.к. сервлет без авторизации принимает команды только с localhost. Для проверки правильности задания URL команда reload должна вернуть значение 'OK':
  • SIZE - Необязательный. Передается в параметр size в запросах к ФНСИ. Число записей, которые вернет ФНСИ. Значение по умолчанию - 2000.
  • CLEARCACHE - Необязательный. Очищать ли кеш скачанных файлов при завершении работы: 0 (не очищать) и 1 (очищать). Значение по умолчанию - 1. Отключение очистки кеша более чем на сутки не рекомендуется. При загрузке данных с ФНСИ весь обмен сохраняется в файлах. В случае аварийного завершения программы можно ее перезапустить, и загрузка с ФНСИ будет продолжена с того места, где произошло прерывание. Кеш действует один календарный день.
  • RELOAD - Необязательный. Список OID справочников, разделенных запятыми, которые надо загрузить. Загрузка справочников производится по параметрам из FNSIlist.json и FNSIExtraList.json. Загружаются актуальные версии и загрузка производится только методом data. Если версия справочника была загружена ранее, то справочник будет заменен.
  • LOG_PATH - Необязательный. Путь для хранения файлов логов утилиты. Если путь не задан, то логи выводятся в STDOUT (консоль). Лог пишется в файл fnsi.log.

Пример запуска

Установка сертификата nsi.rosminzdrav.ru

Для запуска fnsi-downloader может потребоваться установка сертификата сайта ФНСИ в хранилище сертификатов Java. Для этого необходимо в браузере сохранить сертификат сайта nsi.rosminzdrav.ru в бинарном виде (DER).

Java

Экспортировать его в

$JAVAHOME$\lib\security\cacerts
:

Linux на примере Ubuntu 24.04

  • openssl x509 -inform DER -in ./.rosminzdrav.ru.der -outform PEM -out ./.rosminzdrav.ru.crt
  • скопировать _.rosminzdrav.ru.crt в /usr/local/share/ca-certificates
  • выполнить команду update-ca-certificates

Уровень логирования задается в файле log4j.properties внутри fnsi-downloader-X.X-jar-with-dependencies.jar. Уровень логирования по умолчанию - INFO. При использовании уровня DEBUG будет выводиться больше информации об обмене с ФНСИ.

Сборка

Для сборки проекта необходимо выполнить команду в корневой папке проекта

в папке, где расположен файл pom.xml, который определяет проект, состоящий из 4-х модулей - servlet, console, avltree.

В составе репозитория можно найти уже собранные semd-X-X.war и fnsi-downloader-X.X-jar-with-dependencies.jar актуальных версий.

Подробнее о Maven можно найти на странице https://maven.apache.org/guides/getting-started/maven-in-five-minutes.html.

В проекте demo демонстрируется работа со справочниками.