Интеграция с системой ЭДО Лайт (Честный Знак) является критически важной задачей для участников оборота маркированных товаров. Одной из наиболее сложных процедур является автоматизация приемки документов: получение входящих УПД, формирование ответного титула покупателя и его подписание электронной подписью — для этого есть автоматизация обмена УПД и интеграции с ЦРПТ. В процессе реализации программисты часто сталкиваются с техническими барьерами, такими как ошибки формата multipart/form-data, некорректная кодировка XML или проблемы с проверкой криптографии на стороне сервера ГИС МТ.
Рассмотрим подробнее, как выстроить стабильный процесс обмена данными, проанализируем типичные ошибки и разберем работающие примеры кода для платформы 1С:Предприятие 8.3. Для этой задачи есть комплексная интеграция 1С с системой «Честный Знак».
При отправке 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.
Выясним причину возникновения ошибки DOC-0017 («Неверный тип документа»). ГИС МТ ожидает, что имя файла и его содержимое будут строго соответствовать формату. Для автоматизации этого процесса удобно использовать инструменты для групповой выгрузки XML по приказам №820 и №970. Для титула покупателя имя файла должно начинаться с префикса ON_NSCHFDOPPOKMARK_.
Проанализируем общие ключевые моменты при записи XML:
ЗаписатьОбъявлениеXML. Файл должен начинаться со строки <?xml version="1.0" encoding="windows-1251"?>.windows-1251. Если данные поступают из внешних источников, например, требуется извлечение кодов DataMatrix из PDF, следите за корректностью преобразования строк.2BE для ЭДО Лайт).
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ПутьКФайлу, "windows-1251");
ЗаписьXML.ЗаписатьОбъявлениеXML();
// Формирование структуры по приказу ФНС №820
// ...
ЗаписьXML.Закрыть();
Самая частая ошибка — «Подпись не прошла проверку в crypto». Для получения токена авторизации ГИС МТ требует присоединенную подпись, а для документов ЭДО — открепленную (отсоединенную) — для этого подойдёт модуль ЭДО для маркировки и ГИС МТ. Рассмотрим, как реализовать это с помощью встроенного МенеджераКриптографии или через CAdESCOM.
Для корректной работы необходимо использовать алгоритмы ГОСТ, что требует установленного криптопровайдера (например, КриптоПро CSP).
Посмотрим на пример функции для создания открепленной подписи:
Функция ПодписатьДанные(ДвоичныеДанныеФайла, ОтпечатокСертификата)
Менеджер = Новый МенеджерКриптографии("Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider", "", 80);
Хранилище = Менеджер.ПолучитьХранилищеСертификатов(ТипХранилищаСертификатовКриптографии.ПерсональныеСертификаты);
Сертификат = Хранилище.НайтиПоОтпечатку(ОтпечатокСертификата);
Если Сертификат = Неопределено Тогда
ВызватьИсключение "Сертификат не найден в хранилище!";
КонецЕсли;
// Метод Подписать() возвращает открепленную подпись, если не указан файл-результат
ДД_Подписи = Менеджер.Подписать(ДвоичныеДанныеФайла, Сертификат);
РезультатBase64 = Base64Строка(ДД_Подписи);
// Очистка от спецсимволов переноса строк
РезультатBase64 = СтрЗаменить(РезультатBase64, Символы.ПС, "");
РезультатBase64 = СтрЗаменить(РезультатBase64, Символы.ВК, "");
Возврат РезультатBase64;
КонецФункции
Обратите внимание: если вы используете CAdESCOM, то в методе SignCades третьим параметром нужно передать Истина (True), чтобы подпись была отсоединенной.
Часто код, успешно работающий на клиенте, «крашит» сессию 1С при выполнении в фоновом задании на сервере. Разберем основные причины:
USR1CV8). У этой учетной записи должен быть доступ к закрытому ключу сертификата. Рекомендуется устанавливать сертификат в хранилище Локального компьютера, а не пользователя.ПарольДоступаКЗакрытомуКлючу менеджера криптографии.Подводя итог, для успешной подписи титула покупателя выполните следующие действия:
/api/v1/incoming-documents/{doc_id}/content — в этом поможет загрузка входящих XML-документов ЭДО для 1С.windows-1251 без BOM.Base64.POST, тщательно соблюдая структуру multipart/form-data.event_id завершите процесс, отправив подпись события через метод /api/v1/incoming-documents/{doc_id}/events/{event_id}/signature.Соблюдение этих технических нюансов позволит избежать большинства ошибок «Честного Знака» и обеспечит корректный документооборот в вашей системе.