Как реализовать интеграцию 1С с Системой электронных паспортов (АС СЭП) и решить проблемы с подписанием XML

Программист 1С v8.3 (Управляемые формы) Промышленность, строительство и АПК
← На главную

Интеграция с АС СЭП (Система электронных паспортов) — задача не из легких. Многие разработчики сталкиваются с тем, что стандартные механизмы 1С, такие как импорт WS-ссылки на основе предоставленной WSDL-схемы, работают некорректно. Техническая поддержка системы зачастую признает наличие ошибок в схемах, но не спешит их исправлять, ссылаясь на то, что «у других же работает». В этой статье мы подробно разберем, как обойти ограничения платформы, правильно сформировать XML-пакет и успешно подписать его квалифицированной электронной подписью (КЭП) по алгоритмам ГОСТ.

Анализ основных проблем интеграции

При попытке классического подключения через веб-сервисы мы часто натыкаемся на следующие препятствия:

  1. Некорректная WSDL/XSD схема: Фабрика XDTO создается с ошибками, некоторые теги не определяются или имеют неверную вложенность. В ряде случаев может помочь конвертация схемы XSD в модель XDTO.
  2. Проблемы каноникализации: Для проверки подписи на стороне СЭП требуется строгое соблюдение алгоритма исключительной каноникализации (C14N). Средства 1С при сериализации объектов XDTO могут менять порядок атрибутов или пространства имен, что делает подпись невалидной.
  3. Сложности с SOAP-конвертом: Подписывать нужно не просто данные, а конкретные части SOAP-сообщения (чаще всего Body), вставляя результат в Header.

Проанализируем наиболее жизнеспособный вариант, к которому приходит большинство разработчиков: отказ от XDTO в пользу текстовых шаблонов. Тем не менее, для формирования корректных структур полезно изучить автоматическое формирование XSD-пакета. Рассмотрим этот путь пошагово.

Шаг 1. Формирование XML на основе макета

Вместо того чтобы мучиться с кривой структурой XDTO, мы создадим текстовый макет XML-запроса непосредственно в 1С. Это гарантирует нам полный контроль над каждым символом в файле. Создадим макет типа «Текст» (например, с именем status4) и разместим в нем структуру SOAP-конверта с параметрами в квадратных скобках.

Рассмотрим функцию заполнения такого макета данными:


Функция ЗаполнениеМакетаСтатус()
    Обработка = РеквизитФормыВЗначение("Объект");
    // Получаем текст из макета, который мы заранее подготовили
    МакетТекст = Обработка.ПолучитьМакет("status4").ПолучитьТекст();

    // Заменяем параметры на реальные значения
    МакетТекст = СтрЗаменить(МакетТекст, "[MessageID]", Новый УникальныйИдентификатор);
    МакетТекст = СтрЗаменить(МакетТекст, "[Mnemonic]", "ВАШ_МНЕМОНИК");
    МакетТекст = СтрЗаменить(МакетТекст, "[HumanReadableName]", "НАИМЕНОВАНИЕ_ОРГАНИЗАЦИИ");
    
    // Формируем временную метку в формате ISO 8601
    Таймштамп = Формат(ТекущаяДата(), "ДФ=yyyy-MM-ddThh:mm:ss.000+03:00");
    МакетТекст = СтрЗаменить(МакетТекст, "[SendingTimestamp]", Таймштамп);
    
    // Данные автомобиля
    МакетТекст = СтрЗаменить(МакетТекст, "[VIN]", "ABC1234567890DEFG");
    
    Возврат МакетТекст;
КонецФункции

Важный момент: Обратите внимание на формат даты. СЭП крайне чувствительна к формату Timestamp, обязательно указывайте миллисекунды и смещение часового пояса.

Шаг 2. Подготовка к подписанию (XMLDSig)

Для подписания мы будем использовать библиотеку стандартных подсистем (БСП), но со специфическими настройками. Основная хитрость заключается в правильном заполнении параметров 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;
    
    ОписаниеДанных = Новый Структура;
    ОписаниеДанных.Вставить("Операция", "ПодписаниеДанных");
    ОписаниеДанных.Вставить("ЗаголовокДанных", "Подписание запроса в СЭП");
    ОписаниеДанных.Вставить("Данные", СтруктураПодписи);
    
    Оповещение = Новый ОписаниеОповещения("ЗавершитьПодписание", ЭтотОбъект);
    
    // Вызываем стандартное диалоговое окно БСП для выбора сертификата и подписания
    ЭлектроннаяПодписьКлиент.Подписать(ОписаниеДанных, Неопределено, Оповещение);
КонецПроцедуры

Шаг 3. Обработка результата и отправка

После того как БСП вернет нам подписанный текст, его необходимо отправить на сервер СЭП. Выясним одну важную деталь: соединение должно устанавливаться через защищенный канал TLS с поддержкой ГОСТ. Если ваша 1С работает на Windows, убедитесь, что в системе установлен КриптоПро CSP и сертификат сервера СЭП добавлен в доверенные.

Пример обработки результата подписания (для отладки таких HTTP-ответов отлично подойдет аналог Postman на платформе 1С):


&НаКлиенте
Процедура ЗавершитьПодписание(РезультатПодписи, ДополнительныеПараметры) Экспорт
    Если Не РезультатПодписи.Успех Тогда
        Сообщить("Ошибка при подписании: " + РезультатПодписи.ОписаниеОшибки);
        Возврат;
    КонецЕсли;
    
    // Получаем готовый XML с внедренной подписью
    ПодписанныйXML = РезультатПодписи.СвойстваПодписи.Подпись;
    
    // Теперь отправляем через HTTPСоединение
    ОтправитьЗапросНаСервер(ПодписанныйXML);
КонецПроцедуры

Технические нюансы работы с TLS ГОСТ

Проанализируем ситуацию с защищенным соединением. Стандартный объект 1С HTTPСоединение не всегда корректно подхватывает ГОСТ-сертификаты для TLS-handshake. Рассмотрим альтернативные варианты, если прямое соединение выдает ошибку:

Работа с очередями (QueueService)

Помните, что АС СЭП работает асинхронно. Когда вы отправляете запрос (например, на смену владельца), система не возвращает результат мгновенно. Она возвращает MessageID. Вам необходимо реализовать регламентное задание, которое будет с определенной периодичностью опрашивать веб-сервис очередей (QueueService), используя полученный идентификатор, пока статус не изменится на «Исполнено» или не вернется ошибка валидации.

Резюме

Для успешной интеграции с ЭПТС программисту 1С следует:

  1. Отказаться от автоматической генерации XDTO по WSDL из-за ошибок в описании схем.
  2. Использовать текстовые макеты XML для формирования точной структуры SOAP-пакета.
  3. Настроить параметры XMLDSig в БСП строго под алгоритмы ГОСТ 2012.
  4. Обеспечить наличие КриптоПро CSP на стороне клиента (или сервера) для работы защищенного канала связи.

Такой подход, хоть и кажется «ручным», является наиболее стабильным и позволяет избежать бесконечных правок при незначительных изменениях в схемах на стороне контролирующего органа.

← На главную