Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Протокол https и версия 1С 7.7. (число прочтений - 9063 )
Геннадий
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 59
Зарегистрирован: 08. Марта 2012
Пол: Мужской
Протокол https и версия 1С 7.7.
04. Июля 2019 :: 09:14
Печать  
Подскажите, пожалуйста, как "подружить" семерку 1С с протоколом https.

V7HttpReader из "в7плюс" ругается на неправильный протокол. Если в запросе поменять https на http, запрос автоматически переносится.

Существуют ли какие-нибудь другие библиотеки, работающие с https?

Спасибо за потраченное время.
  
Наверх
 
IP записан
 
Геннадий
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 59
Зарегистрирован: 08. Марта 2012
Пол: Мужской
Re: Протокол https и версия 1С 7.7.
Ответ #1 - 04. Июля 2019 :: 10:23
Печать  
Кажется, нашел!

Вот такой инструмент, встроенный в Windows:
Соединение = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");

Получилось отправить тестовый запрос и получить ответ.
  
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 850
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Протокол https и версия 1С 7.7.
Ответ #2 - 04. Июля 2019 :: 10:25
Печать  
Попробуй это:

Код
Выбрать все
    ХТТПЗапрос = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
    ХТТПЗапрос.Open("GET", УРЛ, 0);//Или POST
    ХТТПЗапрос.SetCredentials(Логин,Пароль,1);
 

  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
Геннадий
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 59
Зарегистрирован: 08. Марта 2012
Пол: Мужской
Re: Протокол https и версия 1С 7.7.
Ответ #3 - 04. Июля 2019 :: 11:53
Печать  
alyuev писал(а) 04. Июля 2019 :: 10:25:
Попробуй это:

Код
Выбрать все
    ХТТПЗапрос = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
    ХТТПЗапрос.Open("GET", УРЛ, 0);//Или POST
    ХТТПЗапрос.SetCredentials(Логин,Пароль,1);
 



Спасибо, все работает.
Теперь у меня следующая проблема - как разобрать строку из формата JSON в удобный для 1С формат (список значений и т.п.), учитывая перекодировку из утф8.

Вот такое возвращает сайт:
{"products": [{"id": 997431097, "external_id": null, "name": "\u0422\u0440\u0443\u0431\u0430 \u043f\u0440\u043e\u0444\u0438\u043b\u044c\u043d\u0430\u044f \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0430\u044f 22*1,2; L - 6", "sku": "\u0410-0001", "keywords": "", ....

и т.д. Не хочется писать парсер, который наверняка уже писался другими людьми 100500 раз. Улыбка
  
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 850
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Протокол https и версия 1С 7.7.
Ответ #4 - 04. Июля 2019 :: 14:01
Печать  
Код
Выбрать все
HTTPxml=СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
HTTPxml.Option(2,"utf-8");
HTTPxml.Open(ТипЗапроса, ПолныйУРЛ, 0);
HTTPxml.SetRequestHeader("Accept-Language" , "ru");
HTTPxml.SetRequestHeader("Accept-Charset"  ,"utf-8");
HTTPxml.setRequestHeader("Content-Language", "ru");
HTTPxml.setRequestHeader("Content-Charset" , "utf-8");
HTTPxml.setRequestHeader("Content-type"    , "application/x-www-form-urlencoded; charset=utf-8"); 



ТипЗапроса - POST или GET
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 850
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Протокол https и версия 1С 7.7.
Ответ #5 - 04. Июля 2019 :: 14:02
Печать  
Ну, и далее:

Код
Выбрать все
//*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* Made by AAA
Функция jsonВСписок(obj,scriptCtrl)
	Перем сп,ТипОбъекта,Ключ,Значение,ТипЗнач;
	//Сообщить(scriptCtrl.run("oSize", obj)); 				//Размер объекта (количество пар ключ-значение)
	//Сообщить(scriptCtrl.run("oKey", obj, 1)); 			//Ключ пары с номером 1
	//Сообщить(scriptCtrl.run("oValueByKey", obj, "id")); 	//Получить значение объекта по ключу
	//Сообщить(scriptCtrl.run("aGet", obj.products, 0).id); //Получить Элемент массива с индексом 0
	//Сообщить(scriptCtrl.run("eType", obj.products)); 		//Получить тип объекта, даже если он - массив
	сп = СоздатьОбъект("СписокЗначений");
	ТипОбъекта = scriptCtrl.run("eType", obj);
	Если ТипОбъекта = "object" Тогда
		Для н=0 По scriptCtrl.run("oSize", obj)-1 Цикл
			Ключ = scriptCtrl.run("oKey", obj, н);
			Значение = scriptCtrl.run("oValueByKey", obj, Ключ);
			ТипЗнач = scriptCtrl.run("eType", Значение);
			Если Найти("number, string", ТипЗнач) > 0 Тогда
				Значение=СтрЗаменить(Значение,"\""","""");// убираем экранирование, сделанное с помощью \
				Значение=СтрЗаменить(Значение,"\\","\");
				Значение=СтрЗаменить(Значение,"\/","/");
				сп.ДобавитьЗначение(Значение, Ключ);
			ИначеЕсли Найти("object, array", ТипЗнач) > 0 Тогда
				сп.ДобавитьЗначение(jsonВСписок(Значение,scriptCtrl), Ключ);
			КонецЕсли;
		КонецЦикла;
	ИначеЕсли ТипОбъекта = "array" Тогда
		Для н=0 По obj.length-1 Цикл
			Значение = scriptCtrl.run("aGet", obj, н);
			ТипЗнач = scriptCtrl.run("eType", Значение);
			Если Найти("number, string", ТипЗнач) > 0 Тогда
				Значение=СтрЗаменить(Значение,"\""","""");// убираем экранирование, сделанное с помощью \
				Значение=СтрЗаменить(Значение,"\\","\");
				Значение=СтрЗаменить(Значение,"\/","/");
				сп.ДобавитьЗначение(Значение, СокрЛП(Строка(н)));
			ИначеЕсли Найти("object, array", ТипЗнач) > 0 Тогда
				сп.ДобавитьЗначение(jsonВСписок(Значение,scriptCtrl), СокрЛП(Строка(н)));
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;
	Возврат сп;
КонецФункции //jsonВСписок(obj)
//*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* Made by AAA
Функция глРазборJSON(Знач Стр) Экспорт //На входе строка в текущей системной кодировке
	Перем scriptCtrl,Рез,сп,РегВыр,код;
	Если ПустаяСтрока(Стр)=1 Тогда Возврат СоздатьОбъект("СписокЗначений");КонецЕсли;
	//Взято здесь https://gist.github.com/r72cccp/9991957
	scriptCtrl = СоздатьОбъект("MSScriptControl.ScriptControl");
	scriptCtrl.Language="jscript";
	код = "
	|
	| function parseJSON(strJSON) {
	| var tmpFunc = (new Function('return('+strJSON+');'))();
	| return(tmpFunc);
	| }
	|
	| // Получить элемент массива
	| function aGet(Array, index) {
	| return(Array[index]);
	| }
	|
	| // Получить ключ пары по индексу
	| function oKey(Obj, index) {
	| var size = 0, key;
	| for (key in Obj) {
	| if (size == index) break;
	| if (Obj.hasOwnProperty(key)) size++;
	| }
	| return(key);
	| }
	|
	| // Получить значение пары по ключу
	| function oValueByKey(Obj, key) {
	| return(Obj[key]);
	| }
	|
	| //Получить количество пар в объекте
	| Object.size = function(obj) {
	| var size = 0, key;
	| for (key in obj) {
	| if (obj.hasOwnProperty(key)) size++;
	| }
	| return(size);
	| }
	|
	| //Получить размер объекта (количество пар в нём)
	| function oSize(Obj) {
	| return(Object.size(Obj));
	| }
	|
	| // Получить тип объекта (number, string, object, array)
	| function eType(Element) {
	| if (Element instanceof Array) {
	| 	return(""array"");
	| } else if (Object.prototype.toString.call(Element) === '[object Array]') {
	| 	return(""array"");
	| } else {
	| 	return(typeof(Element));
	| }
	| }
	|";
	scriptCtrl.AddCode(код);
	//В строках нельзя использовать символ "\"!!! Его нужно экранировать, как \\. Вообще ошибки описаны здесь http://json.parser.online.fr/ в Samples, а здесь - http://json.org - все правила
	//Стр = СтрЗаменить(Стр,"\","/"); //+Al 2015-07-15 20:35:32 Я для JIRA я добавлял эту замену? Если JSON не парсится - значит он кривой!
	РегВыр = СоздатьОбъект("VBScript.RegExp");
	РегВыр.IgnoreCase=1; РегВыр.Global=1; РегВыр.Multiline=1;
	РегВыр.Pattern="([^\\])\\([^\\])"; //+Al 2015-08-13 18:41:39 Чистим неправильный JSON, в котором есть одиночный \. Его нужно экранировать, т.е. заменить на \\. В частности JIRA неправильно формирует JSON
	Стр = РегВыр.Replace(Стр,"$1\\$2");// Может, если будет глючит - перенести Регулярку в JavaScript
	Рез = scriptCtrl.run("parseJSON", стр ); //Работает
	сп = jsonВСписок(Рез,scriptCtrl);
	Возврат сп;
КонецФункции //глРазборJSON(Знач Стр)
 

  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
Геннадий
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 59
Зарегистрирован: 08. Марта 2012
Пол: Мужской
Re: Протокол https и версия 1С 7.7.
Ответ #6 - 05. Июля 2019 :: 09:49
Печать  
alyuev писал(а) 04. Июля 2019 :: 14:02:
Ну, и далее:



Огромное Вам спасибо!
  
Наверх
 
IP записан
 
programm.ist
Junior Member
**
Отсутствует


1C 7.7

Сообщений: 18
Зарегистрирован: 09. Января 2017
Re: Протокол https и версия 1С 7.7.
Ответ #7 - 28. Июня 2022 :: 06:28
Печать  
Небольшое дополнение, т.к. сам столкнулся с чтением огромных json: Для больших json можно поступить так:

function parseJSON(path) {
    var fso = new ActiveXObject('Scripting.FileSystemObject');
    var ts = fso.OpenTextFile(path, 1, true);
    var str = ts.readAll();
    ts.close();
    var json = eval('('+str+')');
    return(json);
}

Вместо строки с json передать путь к файлу, в скрипте открыть файл, прочитать его и сделать eval.
  
Наверх
 
IP записан
 
VictorZP
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 1
Зарегистрирован: 11. Июля 2023
Re: Протокол https и версия 1С 7.7.
Ответ #8 - 11. Июля 2023 :: 19:08
Печать  
programm.ist писал(а) 28. Июня 2022 :: 06:28:
Небольшое дополнение, т.к. сам столкнулся с чтением огромных json: Для больших json можно поступить так:

function parseJSON(path) {
    var fso = new ActiveXObject('Scripting.FileSystemObject');
    var ts = fso.OpenTextFile(path, 1, true);
    var str = ts.readAll();
    ts.close();
    var json = eval('('+str+')');
    return(json);
}

Вместо строки с json передать путь к файлу, в скрипте открыть файл, прочитать его и сделать eval.



Спасибо. Тоже столкнулся с большим текстом и падением 1Ски через скрип. Добавил как у Вас через файл и норм. Лучшее решение для 1С 7.7 в плане скорости
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать