ЭДО-Лайт Честный Знак (Content is not allowed in prolog.)

1. RektoDuck 15.08.22 10:43 Сейчас в теме
Доброго времени суток :)
Никак не могу решить проблему с ошибками при отправке УПД в ЭДО-Лайт честного знака. Обращался к ним в поддержку (зря даже надеялся на помощь) - отписали стандартно:
Ответ поддержки ЧЗ


Вообщем проблема такова что при отправке исправного файла через веб-интерфейс - все ок. При попытке чтения и отправки этого же самого файла через их метод 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
	Исключение
		Сообщить(Ответ.ПолучитьТелоКакСтроку());
		Возврат Неопределено
	КонецПопытки;
Показать
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. gudvin77 18.08.22 09:20 Сейчас в теме
КодировкаТекста.ANSI
"windows-1251"
У 1С по умолчанию UTF-8
Думаю имеет смысл копать в этом направлении.
Плюс проверить на невидимые символы XML очень их не любит при разборе.
3. RektoDuck 18.08.22 12:44 Сейчас в теме
(2) Все кодировки установлены вручную (как видно в коде) - кодировка в исходном файле XML верная и принимается через веб интерфейс. При кодировке xml в base64 для отправки - брал и декодил base64 в кодировке windows-1251 Туть, все отлично. Проверял структуру после перекодирования туда и обратно - тоже все отлично. Скрытых символов не нашел...
4. user5300 1014 19.10.22 14:57 Сейчас в теме
(3) Получилось реализовать?

Вот пример загрузки черновика :

Функция ОтправитьДокументВЭДОЛайт(Токен,ЗаписьXML) Экспорт
	
	Результат = новый Структура("ИД, ТекстОшибки");
	
	HTTPСоединение = Новый HTTPСоединение(ПолучитьАдресГИС_МТ(),443,,,,,Новый ЗащищенноеСоединениеOpenSSL);		  	
	URLЗапроса = "/api/v1/outgoing-documents";	
	
	ВремГраница = СтрЗаменить(Строка(Новый УникальныйИдентификатор()), "-", "");
	
	ТелоЗапроса = Новый ТекстовыйДокумент();

	ТелоЗапроса.РазделительСтрок = Символы.CR+Символы.LF;
	ТелоЗапроса.ДобавитьСтроку("--" + ВремГраница);

	ТелоЗапроса.ДобавитьСтроку("Content-Disposition: form-data; name=""content""; filename="+ИДФайл + ".xml");
	ТелоЗапроса.ДобавитьСтроку("Content-Type: application/xml");
	ТелоЗапроса.ДобавитьСтроку("");
	ТелоЗапроса.ДобавитьСтроку(ЗаписьXML);
	ТелоЗапроса.ДобавитьСтроку("--" + ВремГраница + "--");
	ТелоЗапросаТекст=ТелоЗапроса.ПолучитьТекст();


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

	
	HTTPЗапрос  = Новый HTTPЗапрос(URLЗапроса, ЗаголовокHTTP);	
	
	HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапросаТекст, КодировкаТекста.ANSI, ИспользованиеByteOrderMark.НеИспользовать);

	HTTPОтвет 	= HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
					
	ОтветСтрока  = HTTPОтвет.ПолучитьТелоКакСтроку();
	
	ЧтениеJSON = Новый ЧтениеJSON;
	ЧтениеJSON.УстановитьСтроку(ОтветСтрока);
		
	Расшифровка = ПрочитатьJSON(ЧтениеJSON, Ложь);
	Если Расшифровка.Свойство("id") Тогда	
		Результат.ИД =Расшифровка.id;
	Иначе
		Результат.ТекстОшибки = "Не удалось загрузить документ в систему Честный знак!";
	КонецЕсли;

	Возврат Результат;
	
КонецФункции

Показать


Только не получается подписать почему то... Пишет ошибка подписи
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот