В цикле статей мы, команда Gems Development, расскажем о работе с «Госуслугами» по ту сторону экрана и о том, как оформить эффективное взаимодействие органов государственной власти с порталом.
Общая схема взаимодействия через СМЭВ
Участники взаимодействия
Представим, что «Госуслуги» — это магазин, на витрине которого представлены сервисы для граждан и организаций. Запрос «покупателя» на услугу передаётся соответствующим органам через систему межведомственного электронного взаимодействия (СМЭВ). Система передаёт сообщения между порталом и ведомством.
Работа через СМЭВ происходит по протоколу SOAP (Simple Object Access Protocol — простой протокол для доступа к объектам).
Участники взаимодействия, как в магазине, делятся на поставщиков и потребителей. Поставщик — это информационная система (ИС), которая предоставляет сведения по запросу, а потребитель — система, запрашивает сведения.
Одна и та же ИС может действовать сразу в двух ролях. Например, в процессе предоставления услуги нужно уведомить портал о смене её статуса. В этом случае ИС-поставщик исполняет роль потребителя — проводит информационный обмен по статусам.
Виды сведений
Участники обмениваются данным через виды сведений (протоколы обмена) — правила формирования пакетов данных для передачи от одного участника другому.
Хороший пример вида сведений — Всероссийская перепись населения 2020. Данные о переписи передают федеральным органам исполнительной власти в электронном виде. В полученных данных существует чёткая структура сведений: ФИО, пол, дата рождения, гражданство, семейное положение. Также в рамках вида сведений описан ответ, который должен быть получен, если обработка запроса прошла успешно.
На июнь 2020 года в СМЭВ зарегистрировано более 1000 промышленных (рабочих) и 2000 тестовых видов.
Обмен данными в промышленной среде по всем видам сведений ведётся через защищённые каналы связи. Все передаваемые данные сопровождаются электронной цифровой подписью, с помощью которой СМЭВ идентифицирует участников взаимодействия.
Данные передаются по протоколу SOAP, при этом каждое сообщение представляет собой вложенную структуру:
Виды сведений делятся на две группы — простые и универсальные. Рассмотрим схему обмена данными по простому виду сведений:
На схеме видно, что данные форм отображаются непосредственно в конверты обмена данными. Из-за этого появляется ограничение: необходимо разработать структуру блока данных, запроса/ответа для каждого такого вида сведений.
Обмен по универсальному виду сведений можно представить так:
На первый взгляд схема может показаться более сложной, однако она демонстрирует принципиальную разницу, которая в итоге упрощает взаимодействие между участниками по универсальному виду сведений (УВС). Специфические данные форм передаются во вложении к конверту СМЭВ, а признаки УВС, позволяющие идентифицировать вид сведений, передаются непосредственно в конверте и имеют одинаковую для любого ВС структуру:
- номер заявления портала и сведения, позволяющие определить услугу;
- целевое подразделение, к которому пользователь обращается за услугой.
Данные формы, заполненные пользователем портала, пакуются во вложение к основному сообщению.
Таким образом можно оформить предоставление практически любых услуг без необходимости проходить трудную регистрацию нового вида сведений.
Очереди сообщений и процесс взаимодействия
В процессе взаимодействия сообщения помещаются в очереди входящих запросов и очереди входящих ответов. По сути очереди — это контейнеры, в которых содержатся сообщения по видам сведений.
Взаимодействие с очередями происходит с помощью специальных запросов. Более подробно они описаны в методических рекомендациях по работе со СМЭВ. Отметим только то, что благодаря очередям становится возможным асинхронный обмен данными: потребитель может оставить заявку на получение сведений, а поставщик — разместить ответ.
Следует помнить: чтобы забрать сообщение из очереди, необходимо подтвердить его получение с помощью Ack-запроса. В противном случае СМЭВ посчитает сообщение недоставленным и вернёт его в очередь через 15 минут после извлечения.
На каждый запрос может поступить как успешный, так и неуспешный ответ.
Представим себя в роли поставщика сведений: по запросу мы выдаём пользователю градостроительный план земельного участка, причём в рамках нашего ведомства действуют несколько территориальных подразделений, некоторые из которых такую услугу вовсе не оказывают. Допустим, пользователь портала при формировании заявления на получение услуги указал подразделение, не оказывающее услугу. Такая ситуация может возникнуть по двум причинам:
- Произошло расхождение справочных данных на портале и у поставщика;
- Нужного соответствия просто нет в настройках системы поставщика.
В любом случае поставщик должен ответить на запрос так, чтобы принимающая сторона могла понять, что запрос завершился неудачно, и, возможно предпринять ответные действия. Ответ на такой запрос оформляется в специальном пакете данных со сведениями о причине отказа.
Успешный ответ предполагает сценарий, в котором результат услуги — это набор файлов (что бывает довольно часто). Перед отправкой результата необходимо выгрузить файлы в файловое хранилище СМЭВ на основе FTP-сервера. Названия файлов и их контрольные суммы нужно зафиксировать в пакете, который отправляем через SOAP. Таким образом, есть две операции по передачи данных, которые нужно связать общим контекстом — сведениями о файлах.
На практике встречаются случаи, когда во время взаимодействия СМЭВ находится в режиме обслуживания, и запросы участника оборачиваются неудачей и требуют повторной отправки. Неудачу нужно зафиксировать и отправить запрос повторно.
Постановка задачи
С учётом приведённых выше особенностей, нашей команде предстояло обеспечить интеграцию ИС заказчика с «Госуслугами» по универсальному виду сведений. Информационная система заказчика — ИАС «Градоустройство». С её помощью пользователи ведомств, ответственные за оказания услуг, могут собирать пакеты документов и формировать результаты для дальнейшей передачи на портал через СМЭВ.
Итак, СМЭВ, как в поговорке про слова в песне, нельзя исключить из решения задачи интеграции с порталом государственных услуг. Но это к лучшему: благодаря системе у всех участников есть универсальная среда взаимодействия. Это позволяет опираться на определённый стандарт и не изобретать велосипед.
В следующих статьях мы рассмотрим, как на стороне поставщика сведений организовать обработку заявлений по данным пользователя с использованием движка автоматизации бизнес-процессов Workflow Core.
buldo
О, какая интересная тема на хабре. Очень интересно узнать технические подробности. Как отправляете сообщения в СМЭВ — стандартный адаптер или самописный. Если самописный, то как нормализуете сообщения, подписываете и проверяете подпись ответов.
casta001
Как правило у всех самописный… там в описании есть открытый код на java и на этом все… Никаких примеров с популярными фреймворками… Если вы не пишете на Яве, то придется самому пострадать… ибо описание смэва — это тошниловка… во всяком случае так было очень долгое время, последнюю версию не видел… команда смэва выпускает обычно несколько релизов в год…
и они очень любят бюрократию… система регистрации видов сведений, доступа к другим ВС построена на заполнении doc-файлов с многочисленными редакциями… то есть любая новая запятая в их форме — это требование скачать новую форму, иначе вернут..
GlukKazan
Ничего не изменилось.
ddolgushin Автор
Решение получилось разноплановое: обработка сообщений реализована на .Net Core с помощью модели классов, полученной по XSD-схемам СМЭВа. Это касается как непосредственно конверта СМЭВ, так и блоков бизнес-данных.
Подпись и проверка выполняются по запросу основного решения параллельно работающим сервисом. Этот сервис реализован уже на Java и в своей работе опирается на библиотеку «КриптоПро», которая, в том числе, обеспечивает нормализацию результирующих сообщений перед отправкой.
Таким образом, как верно заметил casta001, наш «адаптер» встал в стройные ряды изделий ручной работы )
buldo
А почему не использовали КриптоПро.Net, раз уж отдельный сервис с подписью сделан? Тогда бы решение было без java
ddolgushin Автор
Дело в том, что года два назад мы затеяли переход на .NET Core и Linux, и на тот момент подходящего решения от «КриптоПро» не было. Зато была Java CSP, которую, к слову, мы использовали и ранее в составе упомянутого сервиса в других проектах. Собственно, потому и решили остаться на проверенном варианте, слегка дополнив его реализацию.
casta001
Это уже традиционно, однако у Крипто Про какие-то проблемы в .Net Core
или уже есть нормальный релиз?
buldo
Там всё очень интересно. Только с форума криптопро можно узнать о том, что они пилят форк corefx с поддержкой ГОСТ шифрования. У них даже есть готовый how-to как собирать приложение вместе с их форком corefx.
Справедливости ради, форк corefx сейчас — это единственный адекватный способ добавить алгоритмы шифрования и подписи в net core.
Когда я попытался собрать замечательный проект GostCryptography под net core, выяснилось, что MS не дописала возможность добавления кастомных алгоритмов во время исполнения( хотя такой функционал есть в Net Framework). И по issue на гитхабе такая возможность появится только в net 5.
casta001
Супер, благодарю!