Интеграция с АС СЭП (Система электронных паспортов) — задача не из легких. Многие разработчики сталкиваются с тем, что стандартные механизмы 1С, такие как импорт WS-ссылки на основе предоставленной WSDL-схемы, работают некорректно. Техническая поддержка системы зачастую признает наличие ошибок в схемах, но не спешит их исправлять, ссылаясь на то, что «у других же работает». В этой статье мы подробно разберем, как обойти ограничения платформы, правильно сформировать XML-пакет и успешно подписать его квалифицированной электронной подписью (КЭП) по алгоритмам ГОСТ.
При попытке классического подключения через веб-сервисы мы часто натыкаемся на следующие препятствия:
XDTO создается с ошибками, некоторые теги не определяются или имеют неверную вложенность. В ряде случаев может помочь конвертация схемы XSD в модель XDTO.XDTO могут менять порядок атрибутов или пространства имен, что делает подпись невалидной.Body), вставляя результат в Header.Проанализируем наиболее жизнеспособный вариант, к которому приходит большинство разработчиков: отказ от XDTO в пользу текстовых шаблонов. Тем не менее, для формирования корректных структур полезно изучить автоматическое формирование XSD-пакета. Рассмотрим этот путь пошагово.
Вместо того чтобы мучиться с кривой структурой XDTO, мы создадим текстовый макет XML-запроса непосредственно в 1С. Это гарантирует нам полный контроль над каждым символом в файле. Создадим макет типа «Текст» (например, с именем status4) и разместим в нем структуру SOAP-конверта с параметрами в квадратных скобках.
Рассмотрим функцию заполнения такого макета данными:
Функция ЗаполнениеМакетаСтатус()
Обработка = РеквизитФормыВЗначение("Объект");
// Получаем текст из макета, который мы заранее подготовили
МакетТекст = Обработка.ПолучитьМакет("status4").ПолучитьТекст();
// Заменяем параметры на реальные значения
МакетТекст = СтрЗаменить(МакетТекст, "[MessageID]", Новый УникальныйИдентификатор);
МакетТекст = СтрЗаменить(МакетТекст, "[Mnemonic]", "ВАШ_МНЕМОНИК");
МакетТекст = СтрЗаменить(МакетТекст, "[HumanReadableName]", "НАИМЕНОВАНИЕ_ОРГАНИЗАЦИИ");
// Формируем временную метку в формате ISO 8601
Таймштамп = Формат(ТекущаяДата(), "ДФ=yyyy-MM-ddThh:mm:ss.000+03:00");
МакетТекст = СтрЗаменить(МакетТекст, "[SendingTimestamp]", Таймштамп);
// Данные автомобиля
МакетТекст = СтрЗаменить(МакетТекст, "[VIN]", "ABC1234567890DEFG");
Возврат МакетТекст;
КонецФункции
Важный момент: Обратите внимание на формат даты. СЭП крайне чувствительна к формату Timestamp, обязательно указывайте миллисекунды и смещение часового пояса.
Для подписания мы будем использовать библиотеку стандартных подсистем (БСП), но со специфическими настройками. Основная хитрость заключается в правильном заполнении параметров XMLDSig. Система ЭПТС требует использования алгоритмов ГОСТ 2012 года.
Разберем процедуру настройки параметров подписи:
&НаКлиенте
Процедура ПодписатьИОтправить(Команда)
ТекстXML = ЗаполнениеМакетаСтатус();
// Настройка параметров XMLDSig для работы с ГОСТ 34.10-2012
ПараметрыXMLDSig = ЭлектроннаяПодписьКлиент.ПараметрыXMLDSig();
// Пути для каноникализации и поиска подписываемых данных
ПараметрыXMLDSig.XPathSignedInfo = "(//. | //@* | //namespace::*)[ancestor-or-self::*[local-name='SignedInfo']]";
ПараметрыXMLDSig.XPathПодписываемыйТег = "(//. | //@* | //namespace::*)[not(ancestor-or-self::ds:Signature)]";
// Указываем алгоритмы (ГОСТ 2012 256 бит)
ПараметрыXMLDSig.ИмяАлгоритмаПодписи = "GR 34.10-2012 256";
ПараметрыXMLDSig.OIDАлгоритмаПодписи = "1.2.643.7.1.1.3.2";
ПараметрыXMLDSig.ИмяАлгоритмаХеширования = "GR 34.11-2012 256";
ПараметрыXMLDSig.OIDАлгоритмаХеширования = "1.2.643.7.1.1.2.2";
// Специфические URI алгоритмов для SOAP-безопасности
ПараметрыXMLDSig.АлгоритмПодписи = "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256";
ПараметрыXMLDSig.АлгоритмХеширования = "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256";
СтруктураПодписи = Новый Структура("КонвертSOAP, ПараметрыXMLDSig");
СтруктураПодписи.КонвертSOAP = ТекстXML;
СтруктураПодписи.ПараметрыXMLDSig = ПараметрыXMLDSig;
ОписаниеДанных = Новый Структура;
ОписаниеДанных.Вставить("Операция", "ПодписаниеДанных");
ОписаниеДанных.Вставить("ЗаголовокДанных", "Подписание запроса в СЭП");
ОписаниеДанных.Вставить("Данные", СтруктураПодписи);
Оповещение = Новый ОписаниеОповещения("ЗавершитьПодписание", ЭтотОбъект);
// Вызываем стандартное диалоговое окно БСП для выбора сертификата и подписания
ЭлектроннаяПодписьКлиент.Подписать(ОписаниеДанных, Неопределено, Оповещение);
КонецПроцедуры
После того как БСП вернет нам подписанный текст, его необходимо отправить на сервер СЭП. Выясним одну важную деталь: соединение должно устанавливаться через защищенный канал TLS с поддержкой ГОСТ. Если ваша 1С работает на Windows, убедитесь, что в системе установлен КриптоПро CSP и сертификат сервера СЭП добавлен в доверенные.
Пример обработки результата подписания (для отладки таких HTTP-ответов отлично подойдет аналог Postman на платформе 1С):
&НаКлиенте
Процедура ЗавершитьПодписание(РезультатПодписи, ДополнительныеПараметры) Экспорт
Если Не РезультатПодписи.Успех Тогда
Сообщить("Ошибка при подписании: " + РезультатПодписи.ОписаниеОшибки);
Возврат;
КонецЕсли;
// Получаем готовый XML с внедренной подписью
ПодписанныйXML = РезультатПодписи.СвойстваПодписи.Подпись;
// Теперь отправляем через HTTPСоединение
ОтправитьЗапросНаСервер(ПодписанныйXML);
КонецПроцедуры
Проанализируем ситуацию с защищенным соединением. Стандартный объект 1С HTTPСоединение не всегда корректно подхватывает ГОСТ-сертификаты для TLS-handshake. Рассмотрим альтернативные варианты, если прямое соединение выдает ошибку:
WinHttp.WinHttpRequest.5.1 можно более гибко настроить использование клиентского сертификата.conf.cfg или через параметры запуска можно указать использование определенных криптопровайдеров, но это требует глубокой настройки сервера 1С.Помните, что АС СЭП работает асинхронно. Когда вы отправляете запрос (например, на смену владельца), система не возвращает результат мгновенно. Она возвращает MessageID. Вам необходимо реализовать регламентное задание, которое будет с определенной периодичностью опрашивать веб-сервис очередей (QueueService), используя полученный идентификатор, пока статус не изменится на «Исполнено» или не вернется ошибка валидации.
Для успешной интеграции с ЭПТС программисту 1С следует:
XDTO по WSDL из-за ошибок в описании схем.XMLDSig в БСП строго под алгоритмы ГОСТ 2012.КриптоПро CSP на стороне клиента (или сервера) для работы защищенного канала связи.Такой подход, хоть и кажется «ручным», является наиболее стабильным и позволяет избежать бесконечных правок при незначительных изменениях в схемах на стороне контролирующего органа.