Как интегрировать 1С с системой «Честный Знак» (ЭДО Лайт) через API и правильно подписать титул покупателя?

Программист 1С v8.3 (Управляемые формы) Торговля и дистрибуция
← На главную

Интеграция с системой ЭДО Лайт (Честный Знак) является критически важной задачей для участников оборота маркированных товаров. Одной из наиболее сложных процедур является автоматизация приемки документов: получение входящих УПД, формирование ответного титула покупателя и его подписание электронной подписью — для этого есть автоматизация обмена УПД и интеграции с ЦРПТ. В процессе реализации программисты часто сталкиваются с техническими барьерами, такими как ошибки формата multipart/form-data, некорректная кодировка XML или проблемы с проверкой криптографии на стороне сервера ГИС МТ.

Рассмотрим подробнее, как выстроить стабильный процесс обмена данными, проанализируем типичные ошибки и разберем работающие примеры кода для платформы 1С:Предприятие 8.3. Для этой задачи есть комплексная интеграция 1С с системой «Честный Знак».

Шаг 1. Формирование тела запроса multipart/form-data

При отправке XML-файла и файла подписи через API ГИС МТ используется формат multipart/form-data. Основная проблема здесь заключается в строгом соблюдении разделителей (boundary) и заголовков внутри тела запроса. Если формат нарушен, сервер вернет ошибку DOC-0016 (неверный тип контента) или 413 Header length exceeded.

Разберем по шагам, как правильно сконструировать тело запроса в 1С. Для отладки таких запросов можно использовать аналог Postman на платформе 1С. Важно помнить, что данные от заголовков внутри частей должны отделяться двойным переносом строк, а сама строка должна собираться в кодировке ANSI (Windows-1251).


Разделитель = "---------------------------" + СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", "");
ПС = Символы.ВК + Символы.ПС;

Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type", "multipart/form-data; boundary=" + Разделитель);
Заголовки.Вставить("Authorization", "Bearer " + ТокенАвторизации);

Тело = "--" + Разделитель + ПС;
Тело = Тело + "Content-Disposition: form-data; name=""content""; filename=""" + ИмяФайлаXML + """" + ПС;
Тело = Тело + "Content-Type: application/xml" + ПС + ПС;
Тело = Тело + СтроковоеСодержимоеXML + ПС;

Тело = Тело + "--" + Разделитель + ПС;
Тело = Тело + "Content-Disposition: form-data; name=""signature""" + ПС;
Тело = Тело + "Content-Type: text/plain" + ПС + ПС;
Тело = Тело + ПодписьBase64 + ПС;
Тело = Тело + "--" + Разделитель + "--" + ПС;

HTTPЗапрос = Новый HTTPЗапрос("/api/v1/incoming-documents/xml/upd/title", Заголовки);
HTTPЗапрос.УстановитьТелоИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзСтроки(Тело, КодировкаТекста.ANSI));

Важный нюанс: никогда не используйте УстановитьТелоИзСтроки(), так как этот метод может принудительно добавить BOM или изменить кодировку. Используйте только УстановитьТелоИзДвоичныхДанных() с явным указанием КодировкаТекста.ANSI.

Шаг 2. Требования к XML и именованию файлов

Выясним причину возникновения ошибки DOC-0017 («Неверный тип документа»). ГИС МТ ожидает, что имя файла и его содержимое будут строго соответствовать формату. Для автоматизации этого процесса удобно использовать инструменты для групповой выгрузки XML по приказам №820 и №970. Для титула покупателя имя файла должно начинаться с префикса ON_NSCHFDOPPOKMARK_.

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

  1. Объявление XML: Обязательно используйте ЗаписатьОбъявлениеXML. Файл должен начинаться со строки <?xml version="1.0" encoding="windows-1251"?>.
  2. Кодировка: Используйте строго windows-1251. Если данные поступают из внешних источников, например, требуется извлечение кодов DataMatrix из PDF, следите за корректностью преобразования строк.
  3. Идентификаторы ЭДО: Убедитесь, что ИД отправителя и получателя в XML совпадают с теми, что зарегистрированы в вашем личном кабинете Честного Знака (префикс 2BE для ЭДО Лайт).

ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ПутьКФайлу, "windows-1251");
ЗаписьXML.ЗаписатьОбъявлениеXML();
// Формирование структуры по приказу ФНС №820
// ...
ЗаписьXML.Закрыть();

Шаг 3. Создание открепленной электронной подписи (Detached Signature)

Самая частая ошибка — «Подпись не прошла проверку в crypto». Для получения токена авторизации ГИС МТ требует присоединенную подпись, а для документов ЭДО — открепленную (отсоединенную) — для этого подойдёт модуль ЭДО для маркировки и ГИС МТ. Рассмотрим, как реализовать это с помощью встроенного МенеджераКриптографии или через CAdESCOM.

Для корректной работы необходимо использовать алгоритмы ГОСТ, что требует установленного криптопровайдера (например, КриптоПро CSP).

Посмотрим на пример функции для создания открепленной подписи:


Функция ПодписатьДанные(ДвоичныеДанныеФайла, ОтпечатокСертификата)
    Менеджер = Новый МенеджерКриптографии("Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider", "", 80);
    Хранилище = Менеджер.ПолучитьХранилищеСертификатов(ТипХранилищаСертификатовКриптографии.ПерсональныеСертификаты);
    
    Сертификат = Хранилище.НайтиПоОтпечатку(ОтпечатокСертификата);
    Если Сертификат = Неопределено Тогда
        ВызватьИсключение "Сертификат не найден в хранилище!";
    КонецЕсли;

    // Метод Подписать() возвращает открепленную подпись, если не указан файл-результат
    ДД_Подписи = Менеджер.Подписать(ДвоичныеДанныеФайла, Сертификат);
    
    РезультатBase64 = Base64Строка(ДД_Подписи);
    // Очистка от спецсимволов переноса строк
    РезультатBase64 = СтрЗаменить(РезультатBase64, Символы.ПС, "");
    РезультатBase64 = СтрЗаменить(РезультатBase64, Символы.ВК, "");
    
    Возврат РезультатBase64;
КонецФункции

Обратите внимание: если вы используете CAdESCOM, то в методе SignCades третьим параметром нужно передать Истина (True), чтобы подпись была отсоединенной.

Шаг 4. Решение проблем при работе на сервере 1С

Часто код, успешно работающий на клиенте, «крашит» сессию 1С при выполнении в фоновом задании на сервере. Разберем основные причины:

  1. Разрядность: Если сервер 1С 64-битный, криптопровайдер и компоненты доступа к сертификатам также должны быть 64-битными.
  2. Доступ к ключам: Служба сервера 1С работает под технической учетной записью (например, USR1CV8). У этой учетной записи должен быть доступ к закрытому ключу сертификата. Рекомендуется устанавливать сертификат в хранилище Локального компьютера, а не пользователя.
  3. Интерактивные окна: КриптоПро может пытаться показать окно ввода пароля к контейнеру. На сервере это невозможно, поэтому в настройках КриптоПро необходимо включить «Кэширование пароля» или передавать пароль программно через свойство ПарольДоступаКЗакрытомуКлючу менеджера криптографии.

Итоговый алгоритм действий

Подводя итог, для успешной подписи титула покупателя выполните следующие действия:

Соблюдение этих технических нюансов позволит избежать большинства ошибок «Честного Знака» и обеспечит корректный документооборот в вашей системе.

← На главную