Доброго времени суток :)
Никак не могу решить проблему с ошибками при отправке УПД в ЭДО-Лайт честного знака. Обращался к ним в поддержку (зря даже надеялся на помощь) - отписали стандартно:
Ответ поддержки ЧЗ
Мы подготовили ответ на Ваше обращение: При работе с запросом ошибок не обнаружено, рекомендуем повторить запрос в другом ПО или обратиться к производителю, сервисной организации либо сотруднику, осуществляющему обслуживание Вашего программного обеспечения (1С). В компетенции технической поддержки системы маркировки «Честный знак» не входит консультация, настройка и донастройка продуктов сторонних организаций.
Вообщем проблема такова что при отправке исправного файла через веб-интерфейс - все ок. При попытке чтения и отправки этого же самого файла через их метод API - "3.1. Метод загрузки файла информации продавца УПД согласно приказу 820 от 19.12.2018 № ММВ-7-15/820@ в формате XML" - отдает ошибку либо Content is not allowed in prolog. , либо Header length exceeded maximum header size of 4096 (если убрать переносы строк между "Content-Type: application/xml" и текстом base64 документа). Использую кодировку windows-1251 и в файле, и при чтении, и при передаче. Пытался перекодировать строку передачи в ANSI - не помогло. Использовал разные разновидности кода заполнения тела запроса - не помогло. Если сталкивались с такой проблемой, подскажите позязя :)
Соединение = Новый HTTPСоединение("edo-gismt.crpt.ru",443,,,,,Новый ЗащищенноеСоединениеOpenSSL);
HTTPЗапрос = Новый HTTPЗапрос("/api/v1/outgoing-documents");
ВремГраница = "---------------------------" + СтрЗаменить(Новый УникальныйИдентификатор, "-", "");
HTTPЗапрос.Заголовки.Вставить("Authorization", "Bearer " + Токен);
HTTPЗапрос.Заголовки.Вставить("Content-Type", "multipart/form-data; boundary="+ВремГраница);
Файл = Новый ТекстовыйДокумент;
Файл.Прочитать(ПутьФайла);
//СтрокаBase64 = ЗашифроватьBase64(Файл.ПолучитьТекст(),"windows-1251");
СтрокаBase64 = ЗашифроватьBase64(ПерекодироватьСтроку(Файл.ПолучитьТекст(),КодировкаТекста.ANSI),КодировкаТекста.ANSI);
СертификатДляОбмена = "...76F1FD4C6923858EAF..."; //Отпечаток сертификата
ПодписанныйТекст = ПодписатьТекст(СтрокаBase64,СертификатДляОбмена,Истина);
ПС = Символы.ВК+Символы.ПС;
Тело = "";
Тело = Тело + "--"+ВремГраница+ПС;
Тело = Тело + "Content-Disposition: form-data; name=""content""; filename="""+ИмяФайла+".xml"""+ПС;
Тело = Тело + "Content-Type: application/xml"+ПС+ПС;
Тело = Тело + СтрокаBase64 +ПС;
Тело = Тело + "--"+ВремГраница+"--"+ПС;
HTTPЗапрос.УстановитьТелоИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзСтроки(Тело,КодировкаТекста.ANSI));
Ответ = Соединение.ОтправитьДляОбработки(HTTPЗапрос);
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
Попытка
ID = ПрочитатьJSON(ЧтениеJSON).id;
Возврат ID
Исключение
Сообщить(Ответ.ПолучитьТелоКакСтроку());
Возврат Неопределено
КонецПопытки;
Показать
З.Ы. Временно убрал "Content-Disposition: form-data; name=""signature""" - с ним потом
Старый код:
Соединение = Новый HTTPСоединение("edo-gismt.crpt.ru",443,,,,,Новый ЗащищенноеСоединениеOpenSSL);
HTTPЗапрос = Новый HTTPЗапрос("/api/v1/outgoing-documents");
ВремГраница = СтрЗаменить(Новый УникальныйИдентификатор, "-", "");
HTTPЗапрос.Заголовки.Вставить("Authorization", "Bearer " + Токен);
HTTPЗапрос.Заголовки.Вставить("Content-Type", "multipart/form-data; boundary="+ВремГраница);
Файл = Новый ТекстовыйДокумент;
Файл.Прочитать(ПутьФайла);
СтрокаBase64 = ЗашифроватьBase64(Файл.ПолучитьТекст(),"windows-1251");
ТелоЗапроса = Новый ТекстовыйДокумент();
ТелоЗапроса.РазделительСтрок = Символы.ВК + Символы.ПС;
ТелоЗапроса.ДобавитьСтроку("--" + ВремГраница);
ТелоЗапроса.ДобавитьСтроку("Content-Disposition: form-data; name=""content""; filename="""+ИмяФайла+".xml""");
ТелоЗапроса.ДобавитьСтроку("Content-Type: text/xml"+ПС);
ТелоЗапроса.ДобавитьСтроку(СтрокаBase64);
ТелоЗапроса.ДобавитьСтроку("--" + ВремГраница);
ТелоЗапроса.ДобавитьСтроку("Content-Disposition: form-data; name=""signature"";"+ПС);
ТелоЗапроса.ДобавитьСтроку(ПодписанныйТекст);
ТелоЗапроса.ДобавитьСтроку("--" + ВремГраница + "--"+ПС);
ТелоЗапросаСтрока = ТелоЗапроса.ПолучитьТекст();
HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапросаСтрока, "windows-1251", ИспользованиеByteOrderMark.НеИспользовать);
Ответ = Соединение.ОтправитьДляОбработки(HTTPЗапрос);
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
Попытка
ID = ПрочитатьJSON(ЧтениеJSON).id;
Возврат ID
Исключение
Сообщить(Ответ.ПолучитьТелоКакСтроку());
Возврат Неопределено
КонецПопытки;
КодировкаТекста.ANSI
"windows-1251"
У 1С по умолчанию UTF-8
Думаю имеет смысл копать в этом направлении.
Плюс проверить на невидимые символы XML очень их не любит при разборе.
(2) Все кодировки установлены вручную (как видно в коде) - кодировка в исходном файле XML верная и принимается через веб интерфейс. При кодировке xml в base64 для отправки - брал и декодил base64 в кодировке windows-1251 Туть, все отлично. Проверял структуру после перекодирования туда и обратно - тоже все отлично. Скрытых символов не нашел...