Вопрос по 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 13 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 такими проблемами если и страдают, то я с ними не сталкивался.
Оставьте свое сообщение
Вакансии
1С аналитик
Москва
зарплата от 210 000 руб.
Полный день

Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)