Вопрос по POST-запросу и загрузке веб пакета через веб-сервис 1с 7.7
Здравствуйте. Подскажите, кто сталкивался. до этого с 7.7 дело не имел. Есть задача сформировать XML файл, сделать ZIP-архив и загрузить его через веб-сервис.
Есть код для 8-ки который проверяет соединение с сервером.
Как реализовать подобное на 7ке?
Есть код для 8-ки который проверяет соединение с сервером.
Соединение = НеОпределено;
Попытка
СисИнфо = Новый СистемнаяИнформация;
Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(СисИнфо.ВерсияПриложения, "8.3.3.721") < 0 тогда
Выполнить("Соединение = Новый HTTPСоединение(ПараметрыПодключения.Сервер, ПараметрыПодключения.Порт, ПараметрыПодключения.Пользователь, ПараметрыПодключения.Пароль, ПараметрыПодключения.Прокси, ПараметрыПодключения.ЗащищенноеСоединение)");
Иначе
Если НЕ ПараметрыПодключения.ЗащищенноеСоединение Тогда
ssl = Неопределено;
Иначе
ssl = Новый ЗащищенноеСоединениеOpenSSL(
Неопределено,
Неопределено);
КонецЕсли;
//Соединение = Новый HTTPСоединение(ПараметрыПодключения.Сервер, ПараметрыПодключения.Порт, ПараметрыПодключения.Пользователь, ПараметрыПодключения.Пароль, ПараметрыПодключения.Прокси, ,ssl);
Соединение = Новый HTTPСоединение(ПараметрыПодключения.Сервер, ПараметрыПодключения.Порт, , , , ,ssl);
КонецЕсли;
Исключение
СообщитьПодробно(ОписаниеОшибки(), Истина);
СообщитьПодробно(" Не удалось установить соединение с сервером. Проверьте правильность адреса сервера, порт, имя пользователя и пароль.", Истина);
Соединение = Неопределено;
Конецпопытки;
Возврат Соединение;
ПоказатьКак реализовать подобное на 7ке?
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
//======================================================================
Функция ВернутьДОМ(Строка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;
КонецПопытки;
КонецЕсли;
Возврат ДОМ;
КонецФункции
Показать
Зато они есть в операционной системе...
Что-то подобное как вариант:
Что-то подобное как вариант:
ЛогинПароль = Кодировать(ИмяПользователяВебСервиса+":"+ПарольПользователяВебСервиса);
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);
Исключение
Сообщить(ОписаниеОшибки());
Возврат "";
КонецПопытки;
Показать
Ну и вот:
Но это если "Authorization" - " Basic "
//======================================================================
Функция Кодировать(Стр, Кодировка = "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 "
Еще как вариант написать скрипт на 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);
Соль = Сред(СтрокаАвторизации, ПозицияСимвола + СтрДлина(префикс));
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот