Встала задача в передачи ответа на стороне веб клиента, на сторону сервера. На стороне оператора установлена служба, которая позволяет по адресу, например http://localhost:5107/Id, получить информацию которая привязана к ПО оператора, в виде JSON. Этот JSON необходимо передать на сервер, где проверяется этот Id и при положительном ответе, открывается форма авторизации на определенном ресурсе через 1С.
Пытался сделать через HTTP соединение и HTTP запросы, но их вызывать нельзя на стороне веб клиента, хотя в справке написано, доступно для веб клиента. Пробовал через виндовые комманды, но что бы к ним обратиться, создается COM объект, который так же не доступен на веб клиенте. Делать на стороне сервера я данный запрос не могу, т.к. тогда на сервере придется ставить службу, а это бессмысленно, т.к. привязка идет на уровне железа, на конкретную точку с которой работает оператор. Есть у кого какие мысли, как передать ответ с веб клиента на сервер?
Можно попробовать разместить на форме поле HTML-документа и сделать запрос его средствами - JavaScript, AJAX. см https://infostart.ru/public/398366/ и подобное.
Решил вопрос с веб клиентом через JavaScript, делюсь решением, как получить GET ответ в контексте веб клиента и передавать уже его на серверный контекст.
Формируем HTML документ, размещаем поле HTML документа на форме, скорее всего можно и программно его создать. В серверной процедуре создания прописываем
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
GetJSON_Text = "<!DO CTYPE html>
|<ht ml>
|<head runat='server'>
|<met a http-equiv='Content-Type' content='text/html; charset=utf-8'/>
| <title>'Пример JS' </title>
| <sc ript type='text/javascript'>
| document.addEventListener('DOMContentLoaded', function (event) {
| getHardware(url)
| });
| function Hard(url,H)
| {
| H = getHardware(url);
| console.log(H);
| return H;
| }
| function getHardware(url)
| {
| var xhr = new XMLHttpRequest();
| xhr.open(url, false);
| xhr.send();
| if (xhr.status != 200) {
| document.getElementById('HardForm').innerHTML = 'Служба не активна';
| return 404; //: 404: Not Found
| } else {
| // вывести результат
| document.getElementById('HardForm').innerHTML = xhr.responseText;
| return xhr.responseText;
| }
| }
| </sc ript>
|</head>
|<body>
|<button on click='Hard(url,'')'>Get Hardware</button>
| <fo rm id='HardForm' runat='server'>
| </form>
|</body>
|</html>";
ШаблонHTML = GetJSON_Text;
ПолеHTML = ШаблонHTML;
КонецПроцедуры
Показать
на клиентской части вызываем любую функцию со следующим кодом
//------------------------------------url ="http://localhost:5107/Id"-----------------------------------//
&НаКлиенте
Функция GET_JS(url)
ОкноДокумента = ЭтаФорма.Элементы.ПолеHTML.Документ.defaultView;
Если ОкноДокумента = Неопределено Тогда
Возврат "";
КонецЕсли;
Результат = ОкноДокумента.Hard(url,"");
Возврат Результат;
КонецФункции
(2)эта обработка, которая до того как послать POST запрос авторизации, собирает так сказать данные о железе оператора, операторов N-количество, у всех разное железо, но все подключаются через web интерфейс к одному серверу с базой 1С, где развернут веб сервер. У каждого оператора установлена служба, которая позволяет обращаться по адресу http://localhost:5107/Id и получать JSON c параметрами железа. Так вот я не могу обратиться с веб клиента к этому http://localhost:5107/Id, т.к. требуется установить HTTP соединение, а оно на веб клиенте не доступно. Через Новый COMОбъект("MSXML2.XMLHTTP") хотел обратиться, что бы получить ответ, COM объекты так же не доступны. Решил службу сделать в 1С, используя WSH: GetComObject("winmgmts:{impersonationLevel=impersonate}!//" + TrimAll(ComputerName) + "/root/cimv2"), НО так же не доступно GetComObject на стороне веб клиента, а на стороне сервера я получу данные о железе сервера, а мне нужны данные о железе оператора и передавать их на сервер.
Можно попробовать разместить на форме поле HTML-документа и сделать запрос его средствами - JavaScript, AJAX. см https://infostart.ru/public/398366/ и подобное.
(5)Платформа 8.3.15, да HTTP соединение там уже убрали со справки, осталось только COM-соединение доступное на веб клиенте. Через IP не выйдет т.к. этот адрес доступен только после установки службы и подписания ее, на сервере ее ставить нельзя, да и IP опять же передать на сервер, не вызывая COM, пока ни знаю. На счет JavaScript, AJAX, спасибо, порою в этом направлении. Хотя я начал копать пока в направлении, размещении на форме HTTP документа, авто открытия http://localhost:5107/Id , распарсить и получить нужный мне JSON. Наверное это единственные 2 способа, которые пока осталось проверить.
Решил вопрос с веб клиентом через JavaScript, делюсь решением, как получить GET ответ в контексте веб клиента и передавать уже его на серверный контекст.
Формируем HTML документ, размещаем поле HTML документа на форме, скорее всего можно и программно его создать. В серверной процедуре создания прописываем
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
GetJSON_Text = "<!DO CTYPE html>
|<ht ml>
|<head runat='server'>
|<met a http-equiv='Content-Type' content='text/html; charset=utf-8'/>
| <title>'Пример JS' </title>
| <sc ript type='text/javascript'>
| document.addEventListener('DOMContentLoaded', function (event) {
| getHardware(url)
| });
| function Hard(url,H)
| {
| H = getHardware(url);
| console.log(H);
| return H;
| }
| function getHardware(url)
| {
| var xhr = new XMLHttpRequest();
| xhr.open(url, false);
| xhr.send();
| if (xhr.status != 200) {
| document.getElementById('HardForm').innerHTML = 'Служба не активна';
| return 404; //: 404: Not Found
| } else {
| // вывести результат
| document.getElementById('HardForm').innerHTML = xhr.responseText;
| return xhr.responseText;
| }
| }
| </sc ript>
|</head>
|<body>
|<button on click='Hard(url,'')'>Get Hardware</button>
| <fo rm id='HardForm' runat='server'>
| </form>
|</body>
|</html>";
ШаблонHTML = GetJSON_Text;
ПолеHTML = ШаблонHTML;
КонецПроцедуры
Показать
на клиентской части вызываем любую функцию со следующим кодом
//------------------------------------url ="http://localhost:5107/Id"-----------------------------------//
&НаКлиенте
Функция GET_JS(url)
ОкноДокумента = ЭтаФорма.Элементы.ПолеHTML.Документ.defaultView;
Если ОкноДокумента = Неопределено Тогда
Возврат "";
КонецЕсли;
Результат = ОкноДокумента.Hard(url,"");
Возврат Результат;
КонецФункции