Вопрос по POST-запросу и загрузке веб пакета через веб-сервис 1с 7.7

1. 1c_uZer 26.08.20 12:05 Сейчас в теме
Здравствуйте. Подскажите, кто сталкивался. до этого с 7.7 дело не имел. Есть задача сформировать XML файл, сделать ZIP-архив и загрузить его через веб-сервис.

Есть код для 8-ки который проверяет соединение с сервером.

Соединение = НеОпределено;
	
	Попытка
		
		СисИнфо = Новый СистемнаяИнформация;
		
		Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(СисИнфо.ВерсияПриложения, "8.3.3.721") < 0  тогда	
			Выполнить("Соединение = Новый HTTPСоединение(ПараметрыПодключения.Сервер, ПараметрыПодключения.Порт, ПараметрыПодключения.Пользователь, ПараметрыПодключения.Пароль, ПараметрыПодключения.Прокси, ПараметрыПодключения.ЗащищенноеСоединение)");
		Иначе

			Если НЕ ПараметрыПодключения.ЗащищенноеСоединение Тогда
				ssl = Неопределено;
			Иначе
				
				ssl = Новый ЗащищенноеСоединениеOpenSSL(
				Неопределено,
				Неопределено); 
			КонецЕсли;
			//Соединение = Новый HTTPСоединение(ПараметрыПодключения.Сервер, ПараметрыПодключения.Порт, ПараметрыПодключения.Пользователь, ПараметрыПодключения.Пароль, ПараметрыПодключения.Прокси, ,ssl);	
			Соединение = Новый HTTPСоединение(ПараметрыПодключения.Сервер, ПараметрыПодключения.Порт, , , , ,ssl);	
		КонецЕсли;	
		
	Исключение
		
		СообщитьПодробно(ОписаниеОшибки(), Истина);	
		СообщитьПодробно(" Не удалось установить соединение с сервером. Проверьте правильность адреса сервера, порт, имя пользователя и пароль.", Истина);	
		
		Соединение = Неопределено;
		
	Конецпопытки;
	
	Возврат Соединение;
Показать


Как реализовать подобное на 7ке?
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. VictorRGB2 14 26.08.20 12:30 Сейчас в теме
(1) можно прикрутить через компоненту, например эту WinHttpRequest.5.1
4. 1c_uZer 26.08.20 17:26 Сейчас в теме
7. dvk09 2 27.08.20 10:23 Сейчас в теме
//======================================================================
Функция ВернутьДОМ(СтрокаXML = "")
	
	Попытка
		ДОМ = CreateObject("Msxml2.DOMDocument.6.0");
	Исключение
		ДОМ = CreateObject("Msxml2.DOMDocument");
	КонецПопытки;
	ДОМ.async = 0;
	ДОМ.resolveExternals = 0; 
	ДОМ.validateOnParse = 0;
	
	Если СтрокаXML = "" Тогда
		Возврат ДОМ;
	КонецЕсли;
	
	Если ТипЗначенияСтр(СтрокаXML)="СписокЗначений" Тогда
		Попытка
			ДОМ.load(СтрокаXML.ПолучитьЗначение(1));
			ДОМ.setProperty("SelectionLanguage", "XPath");
		Исключение
			Сообщить(ОписаниеОшибки());
			ДОМ = 0;
		КонецПопытки;
	ИначеЕсли ТипЗначенияСтр(СтрокаXML)="OLE.IXMLDOMElement" Тогда
		Попытка
			ДОМ.loadXML(СтрокаXML.text);
			ДОМ.setProperty("SelectionLanguage", "XPath");
		Исключение
			Сообщить(ОписаниеОшибки());
			ДОМ = 0;
		КонецПопытки;
	ИначеЕсли ТипЗначенияСтр(СтрокаXML)="OLE.IXMLDOMDocument3" Тогда
		Попытка
			ДОМ.loadXML(СтрокаXML.xml);
			ДОМ.setProperty("SelectionLanguage", "XPath");
		Исключение
			Сообщить(ОписаниеОшибки());
			ДОМ = 0;
		КонецПопытки;
	Иначе    
		Попытка
			ДОМ.loadXML(СтрокаXML);
			ДОМ.setProperty("SelectionLanguage", "XPath");
		Исключение
			Сообщить(ОписаниеОшибки());
			ДОМ = 0;
		КонецПопытки;
	КонецЕсли;
	
	
	Возврат ДОМ;
	
КонецФункции
Показать
8. dvk09 2 27.08.20 10:23 Сейчас в теме
2. Bazin 5 26.08.20 12:20 Сейчас в теме
7-ке нет процедур для работы с Web-сервисами
5. dvk09 2 27.08.20 10:19 Сейчас в теме
Зато они есть в операционной системе...
Что-то подобное как вариант:
ЛогинПароль = Кодировать(ИмяПользователяВебСервиса+":"+ПарольПользователяВебСервиса);
	WinHTTP = СоздатьОбъект("MSXML2.XMLHTTP.6.0");
	WinHTTP.Open("POST", ПолучитьАдрес(Сервис), 0, ИмяПользователяВебСервиса, ПарольПользователяВебСервиса);
	WinHTTP.setRequestHeader("Accept-Encoding","gzip,deflate");
	WinHTTP.setRequestHeader("Content-Type","application/soap+xml");
	WinHTTP.setRequestHeader("SOAPAction","http://КАКОЙ-ТО АДРЕС" + Метод);
	WinHTTP.setRequestHeader("Content-Length", СтрДлина(Request));
	WinHTTP.setRequestHeader("Host", Хост);
	WinHTTP.setRequestHeader("Connection", "Keep-Alive");
	WinHTTP.setRequestHeader("User-Agent", "Apache-HttpClient/4.1.1 (java 1.5)");
	WinHttp.setRequestHeader("Authorization"," Basic "+Строка(ЛогинПароль));        
	
	ДОМ_Результат = ВернутьДОМ();

	Попытка
		WinHTTP.send(Request);
		Если Строка(WinHTTP.status) = "200" Тогда
			ДОМ_Результат.load(WinHTTP.responseXML);
			ОбновитьДанныеПоАвтомомбилю(Метод, ДОМ_Результат);
			Если ФлагОтладка = 1 Тогда
				ИмяВременногоФайла = глПолучитьИмяВременногоФайла("xml");
				ДОМ_Результат.save(ИмяВременногоФайла);
				ЗапуститьПриложение(ИмяВременногоФайла);
			КонецЕсли;
		Иначе
			Сообщить(WinHTTP.status);
			Сообщить(WinHTTP.StatusText);
		КонецЕсли;
		Возврат Строка(WinHTTP.status);
		
	Исключение
		Сообщить(ОписаниеОшибки());
		Возврат "";
	КонецПопытки;
Показать
6. dvk09 2 27.08.20 10:22 Сейчас в теме
Только устанешь отправлять
Кури 1C++ дополнительно, иначе как ты web-сервису зип архив из 7.7 скормишь?
О Бинарных данных она тоже ничего не знает...
9. dvk09 2 27.08.20 10:32 Сейчас в теме
(6) Хотя яндекс пример в первой строкой выдает при поиске по строке "MSXML2.XMLHTTP передать zip архив"
10. 1c_uZer 27.08.20 10:52 Сейчас в теме
(9)
кс пример в первой строкой выдает при поиске по строке "MSXML2.XMLHTTP передать zip архив"

(5) тоже буду пробовать. спасибо огромное.
11. dvk09 2 27.08.20 11:02 Сейчас в теме
Ну и вот:
//======================================================================
Функция Кодировать(Стр, Кодировка = "base64")
    ЦДО=СоздатьОбъект("CDO.Message");
    БодиПарт=ЦДО.BodyPart;
    Поля=БодиПарт.Fields;
    Поле=Поля.Item("urn:schemas:mailheader:content-type");
    Поле.Value="text/plain; charset=""windows-1251""";
    Поля.Update();
    Стрим = БодиПарт.GetDecodedContentStream();
    Стрим.charset = "windows-1251";
    Стрим.WriteText(Стр);
    Стрим.Flush();
    БодиПарт.ContentTransferEncoding = Кодировка;
    Стрим=БодиПарт.GetEncodedContentStream();
    Возврат Стрим.ReadText();
КонецФункции   // Кодировать64(Стр)
Показать

Но это если "Authorization" - " Basic "
12. dvk09 2 27.08.20 11:11 Сейчас в теме
Еще как вариант написать скрипт на JS и выполнить его. Но это если JS знаете.

//==========================================================­============
Функция ПолучитьСкриптКонтрол2()
	ScrptCtrl=СоздатьОбъект("MSScriptControl.ScriptControl");
	ScrptCtrl.Language="javascript";
	ТекстФункции = "
	|
	|var hexcase = 0;
	|var b64pad  = '=';
	|var chrsz   = 8;
	|
	|function hex_sha1(s){return binb2hex(core_sha1(str2binb(s),s.length * chrsz));}
	|function b64_sha1(s){return binb2b64(core_sha1(str2binb(s),s.length * chrsz));}
	|function str_sha1(s){return binb2str(core_sha1(str2binb(s),s.length * chrsz));}
	|function hex_hmac_sha1(key, data){ return binb2hex(core_hmac_sha1(key, data));}
	|function b64_hmac_sha1(key, data){ return binb2b64(core_hmac_sha1(key, data));}
	|function str_hmac_sha1(key, data){ return binb2str(core_hmac_sha1(key, data));}
	|
	|function sha1_vm_test()
	|{
	|  return hex_sha1('abc') == 'a9993e364706816aba3e25717850c26c9cd0d89d';
	|}
	|
	|function core_sha1(x, len)
	|{
	|  x[len >> 5] |= 0x80 << (24 - len % 32);
	|  x[((len + 64 >> 9) << 4) + 15] = len;
	|
	|  var w = Array(80);
	|  var a =  1732584193;
	|  var b = -271733879;
	|  var c = -1732584194;
	|  var d =  271733878;
	|  var e = -1009589776;
	|
	|  for(var i = 0; i < x.length; i += 16)
	|  {
	|    var olda = a;
	|    var oldb = b;
	|    var oldc = c;
	|    var oldd = d;
	|    var olde = e;
	|
	|    for(var j = 0; j < 80; j++)
	|    {
	|      if(j < 16) w[j] = x[i + j];
	|      else w[j] = rol(w[j-3] ^ w[j-8] ^ w[j-14] ^ w[j-16], 1);
	|      var t = safe_add(safe_add(rol(a, 5), sha1_ft(j, b, c, d)),
	|                       safe_add(safe_add(e, w[j]), sha1_kt(j)));
	|      e = d;
	|      d = c;
	|      c = rol(b, 30);
	|      b = a;
	|      a = t;
	|    }
	|
	|    a = safe_add(a, olda);
	|    b = safe_add(b, oldb);
	|    c = safe_add(c, oldc);
	|    d = safe_add(d, oldd);
	|    e = safe_add(e, olde);
	|  }
	|  return Array(a, b, c, d, e);
	|
	|}
	|
	|function sha1_ft(t, b, c, d)
	|{
	|  if(t < 20) return (b & c) | ((~b) & d);
	|  if(t < 40) return b ^ c ^ d;
	|  if(t < 60) return (b & c) | (b & d) | (c & d);
	|  return b ^ c ^ d;
	|}
	|
	|function sha1_kt(t)
	|{
	|  return (t < 20) ?  1518500249 : (t < 40) ?  1859775393 :
	|         (t < 60) ? -1894007588 : -899497514;
	|}
	|
	|function core_hmac_sha1(key, data)
	|{
	|  var bkey = str2binb(key);
	|  if(bkey.length > 16) bkey = core_sha1(bkey, key.length * chrsz);
	|
	|  var ipad = Array(16), opad = Array(16);
	|  for(var i = 0; i < 16; i++)
	|  {
	|    ipad[i] = bkey[i] ^ 0x36363636;
	|    opad[i] = bkey[i] ^ 0x5C5C5C5C;
	|  }
	|
	|  var hash = core_sha1(ipad.concat(str2binb(data)), 512 + data.length * chrsz);
	|  return core_sha1(opad.concat(hash), 512 + 160);
	|}
	|
	|function safe_add(x, y)
	|{
	|  var lsw = (x & 0xFFFF) + (y & 0xFFFF);
	|  var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
	|  return (msw << 16) | (lsw & 0xFFFF);
	|}
	|
	|function rol(num, cnt)
	|{
	|  return (num << cnt) | (num >>> (32 - cnt));
	|}
	|
	|function str2binb(str)
	|{
	|  var bin = Array();
	|  var mask = (1 << chrsz) - 1;
	|  for(var i = 0; i < str.length * chrsz; i += chrsz)
	|    bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (32 - chrsz - i%32);
	|  return bin;
	|}
	|
	|function binb2str(bin)
	|{
	|  var str = '';
	|  var mask = (1 << chrsz) - 1;
	|  for(var i = 0; i < bin.length * 32; i += chrsz)
	|    str += String.fromCharCode((bin[i>>5] >>> (32 - chrsz - i%32)) & mask);
	|  return str;
	|}
	|
	|function binb2hex(binarray)
	|{
	|  var hex_tab = hexcase ? '0123456789ABCDEF' : '0123456789abcdef';
	|  var str = '';
	|  for(var i = 0; i < binarray.length * 4; i++)
	|  {
	|    str += hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8+4)) & 0xF) +
	|           hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8  )) & 0xF);
	|  }
	|  return str;
	|}
	|
	|function binb2b64(binarray)
	|{
	|  var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456­789+/';
	|  var str = '';
	|  for(var i = 0; i < binarray.length * 4; i += 3)
	|  {
	|    var triplet = (((binarray[i   >> 2] >> 8 * (3 -  i   %4)) & 0xFF) << 16)
	|                | (((binarray[i+1 >> 2] >> 8 * (3 - (i+1)%4)) & 0xFF) << 8 )
	|                |  ((binarray[i+2 >> 2] >> 8 * (3 - (i+2)%4)) & 0xFF);
	|    for(var j = 0; j < 4; j++)
	|    {
	|      if(i * 8 + j * 6 > binarray.length * 32) str += b64pad;
	|      else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F);
	|    }
	|  }
	|  return str;
	|}
	|
	|function encode64(input) {
	|    var keyStr = 'ABCDEFGHIJKLMNOP' +
	|                'QRSTUVWXYZabcdef' +
	|                'ghijklmnopqrstuv' +
	|                'wxyz0123456789+/' +
	|                '=';
	|
	|    var output = '';
	|    var chr1, chr2, chr3 = '';
	|    var enc1, enc2, enc3, enc4 = '';
	|    var i = 0;
	|
	|    do {
	|        chr1 = input.charCodeAt(i++);
	|        chr2 = input.charCodeAt(i++);
	|        chr3 = input.charCodeAt(i++);
	|
	|        enc1 = chr1 >> 2;
	|        enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
	|        enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
	|        enc4 = chr3 & 63;
	|
	|        if (isNaN(chr2)) {
	|        enc3 = enc4 = 64;
	|        } else if (isNaN(chr3)) {
	|        enc4 = 64;
	|        }
	|
	|        output = output + 
	|        keyStr.charAt(enc1) + 
	|        keyStr.charAt(enc2) + 
	|        keyStr.charAt(enc3) + 
	|        keyStr.charAt(enc4);
	|        chr1 = chr2 = chr3 = '';
	|        enc1 = enc2 = enc3 = enc4 = '';
	|    } while (i < input.length);
	|
	|    return output;
	|}
	|
	|function isodatetime() {
	|	if (!Date.prototype.toISOString) {
	|	  (function() {
	|	
	|	    function pad(number) {
	|	      if (number < 10) {
	|	        return '0' + number;
	|	      }
	|	      return number;
	|	    }
	|	
	|	    Date.prototype.toISOString = function() {
	|	      return this.getUTCFullYear() +
	|	        '-' + pad(this.getUTCMonth() + 1) +
	|	        '-' + pad(this.getUTCDate()) +
	|	        'T' + pad(this.getUTCHours()) +
	|	        ':' + pad(this.getUTCMinutes()) +
	|	        ':' + pad(this.getUTCSeconds()) +
	|	        '.' + (this.getUTCMilliseconds() / 1000).toFixed(3).slice(2, 5) +
	|	        'Z';
	|	    };
	|	
	|	  }());
	|	}
	|
	|	var timestamp = new Date();
	|	return timestamp.toISOString();
	|}
	|
	|
	|function wsse(Password) {
	|    var PasswordDigest, Nonce, Created;
	|    var r = new Array;
	|    
	|    Nonce = b64_sha1(isodatetime() + 'There is more than words');
	|    nonceEncoded = encode64(Nonce);
	|    Created = isodatetime();
	|    PasswordDigest = b64_sha1(Nonce + Created + Password);
	|
	|    r[0] = nonceEncoded;
	|    r[1] = Created;
	|    r[2] = PasswordDigest;
	|    return r;
	|}
	|
	|function wsseHeader(Username, Password) {
	|    var w = wsse(Password);
	|    var header = ""UsernameToken Username="" + Username + "", PasswordDigest="" + w[2] + "", Created="" + w[1] + "", Nonce="" + w[0] + """";
	|    return header;
	|}
	|
	|";
	ScrptCtrl.AddCode(ТекстФункции);
	Возврат ScrptCtrl;
КонецФункции // ПолучитьСкриптКонтрол
Показать

Ну и потом где-то в коде:
	СкриптКонтрол = ПолучитьСкриптКонтрол2();
	СтрокаАвторизации = СокрЛП(СкриптКонтрол.Run("wsseHeader", Логин, Пароль));
	префикс = "UsernameToken Username=";
	СтрокаАвторизации = Сред(СтрокаАвторизации, 1 + СтрДлина(префикс));
	префикс = ", PasswordDigest=";
	ПозицияСимвола = Найти(СтрокаАвторизации, префикс);
	Логин = Лев(СтрокаАвторизации, ПозицияСимвола - 1);
	СтрокаАвторизации = Сред(СтрокаАвторизации, ПозицияСимвола + СтрДлина(префикс));
	префикс = ", Created=";
	ПозицияСимвола = Найти(СтрокаАвторизации, префикс);
	Токен = Лев(СтрокаАвторизации, ПозицияСимвола - 1);
	СтрокаАвторизации = Сред(СтрокаАвторизации, ПозицияСимвола + СтрДлина(префикс));
	префикс = ", Nonce=";
	ПозицияСимвола = Найти(СтрокаАвторизации, префикс);
	ШтампВремени = Лев(СтрокаАвторизации, ПозицияСимвола - 1);
	Соль = Сред(СтрокаАвторизации, ПозицияСимвола + СтрДлина(префикс));

Показать
13. dvk09 2 27.08.20 11:14 Сейчас в теме
Сразу признаюсь, код на JS в ПолучитьСкриптКонтрол2 с просторов интернета.
Сам на такое не способен))
14. dvk09 2 27.08.20 11:15 Сейчас в теме
(13) Искал его из-за PasswordDigest авторизации
15. 1c_uZer 27.08.20 11:16 Сейчас в теме
(13) да я этот вариант сразу пропускаю)) я подобными вещами и на 8ке не занимался а тут вот пришлось....ищу способы.
16. dvk09 2 27.08.20 11:21 Сейчас в теме
хз, скриптом на JS передать данные может оказаться проще.
ну и 1С 7.7 ограничена в длине строки, это если вдруг сильно большой XML, ну или json внутри 1С из текста собрать захочешь, может тупо повиснуть и всё((
Скрипты на JS такими проблемами если и страдают, то я с ними не сталкивался.
Оставьте свое сообщение

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