Имя: Пароль:
1C
1С v8
Как из WEB-клиента обратиться к localhost ?
0 DES
 
02.02.23
18:55
Есть задача в вебклиенте обрабатывать информацию локально с использованием локального сервера.
Но в HTTPЗапрос недоступен в вебклиенте.
Как можно обойти это ограничние ?
8 Garykom
 
гуру
02.02.23
21:45
(4) я не к localhost из веб-клиента работает?
9 DES
 
02.02.23
22:58
(7) а это к чему ?
ВызватьHTTPМетодАсинх
10 Garykom
 
гуру
02.02.23
23:09
(9) получить = GET
ВызватьHTTPМетод(GET|POST|PUT и т.д.)
11 DES
 
03.02.23
00:55
(10) а как выглядит GET ?
12 DES
 
03.02.23
01:03
а так не прокатит?
        обещание = Соединение.ПолучитьАсинх(Запрос);
        Сообщить(1);
        Результат = Ждать обещание;
        Сообщить(2);
        Если Результат.КодСостояния=200 Тогда
13 lodger
 
03.02.23
09:55
В веб-клиенте нужно учитывать, что запрос можно отправить только на тот же самый домен, на котором опубликован веб-клиент, или на домен, в котором нет CORS-ограничений на принятие запроса от веб-клиента. В противном случае будет вызвано исключение.
Если веб-клиент опубликован по HTTPS, то запрос можно отправить, только используя защищенное соединение. В противном случае будет вызвано исключение.
14 lodger
 
03.02.23
09:55
если бы ты умел делать настоящие вебсайты, то ты бы знал шо це CORS-ограничения
15 Garykom
 
гуру
03.02.23
10:32
(14) Если бы ты умел делать плагины для браузеров
(13) то бы знал что это прекрасно обходится плагином, который по сути из двух частей одна в браузере а вторая локальное приложение вне браузера
и может как с файловой системой работать вне песочницы браузера так и http-запросы слать куда угодно

ЗЫ Если это не сделали в 1С то гм
16 DES
 
03.02.23
14:19
(13) на localhost есть  ограничения CORS ?
17 DES
 
03.02.23
14:24
Поясните с асинхронами.  Я проверяю доступность сервера на локалхосте если он ответит на Хелло - Хеллом.
Т.е. код
Если НЕ функияпроверкилокалхоста() тогда
Сообщить("Извините, не сегодня"); Возврат
конецесли;

Как в функции вернуть ответ асинхронно получая его с локалхолста?

Если функция продолжает проверять результат, а ответ еще не прибыл?
и функция возвращает ложь.
18 Garykom
 
гуру
03.02.23
14:24
19 DTX 4th
 
03.02.23
14:43
че-т не смог понять, о чем вы

ну если надо с клиента дернуть локалхост клиента, а HTTPЗапрос не доступ в стар версиях, то на ум приходит следующее:
1. использовать COM-объект
2. извернуться и использовать js либу типа axios

(14) CORS при чем не очень понятно. Автор верно подметил, что на локалхосте скорее всего их не будет)

(4) Запрос = Новый HTTPЗапрос("/" + Прмтр, Заголовки);

А где путь то до локального сервера? Не в этом ли дело
Подобное выглядит как попытка постучать в текущий адрес сайта.
20 DTX 4th
 
03.02.23
14:46
Ну и вот первая ссылка из [зачеркнуто]суперсекретной коллекции[/зачеркнуто] гугла

https://infostart.ru/public/1488090/
21 Fragster
 
гуру
03.02.23
14:58
(19) корс будет, если другой origin, например веб клиент на 80 порту, а то, куда обращаются - на 3000
может спасти какой-нибудь реверс-прокси, настроенный на том же порту, что и основной веб клиент. в зависимости от того, что за веб сервер (iis или апач) - делается по разному, но не сложно. и гуглится элементарно
22 DTX 4th
 
03.02.23
15:07
(21) Первое предложение не понятно. Дальше изврат)

1. Сервер на 1С на x.x.x.x
2. Клиент на y.y.y.y коннектится через веб морду к 1с
3. Автора надо дернуть локалхост y.y.y.y
Все верно?

Ну и да, касательно корсов чего вспомнил. Их проверка лежит на браузере. Не из браузера можно дернуть корс (: Этим и занимаемся реверс-прокси))
23 DES
 
03.02.23
15:18
(19)     "А где путь то до локального сервера?"
Соединение = Новый HTTPСоединение("localhost",XXXXX,,,,5,);

Все работает на тонком клиенте, на ВЕБЕ не хочет
24 Kassern
 
03.02.23
15:19
(23) Доступность:
Тонкий клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.
25 Kassern
 
03.02.23
15:19
Где вы тут веб-клиент увидели?
26 DES
 
03.02.23
15:21
27 DES
 
03.02.23
15:22
что такое ВызватьHTTPМетодАсинх(<HTTPМетод>, <HTTPЗапрос>, <ИмяВыходногоФайла>)
и как это мне может помочь ?
28 Kassern
 
03.02.23
15:23
(27) Открываете СП и в поиск вбиваете ВызватьHTTPМетодАсинх. Там же все есть)
29 Kassern
 
03.02.23
15:23
Только опять же Доступность:
Тонкий клиент, мобильный клиент, толстый клиент, мобильное приложение (клиент).
30 Kassern
 
03.02.23
15:25
хотяя...
"Если веб-клиент опубликован по HTTPS, то запрос можно отправить, только используя защищенное соединение. В противном случае будет вызвано исключение."
31 Kassern
 
03.02.23
15:25
Может просто в СП не дописали доступность. В общем пробуйте на новых платформах
32 DES
 
03.02.23
15:40
так пробую на 22 , не лезет
33 Kassern
 
03.02.23
15:41
(32) код покажите, как пробуете
34 DTXyupyup
 
03.02.23
15:45
(27) Асинх это про другое.

(32) DevTools чего говорит? (19) чем не нравится?
35 Kassern
 
03.02.23
15:49
(34) "Асинх это про другое."
" В веб-клиенте будут поддержаны типы HTTPСоединение, HTTPЗапрос, HTTPОтвет и ЗащищенноеСоединениеOpenSSL.

В связи с ограничениями, накладываемыми браузерами, перечисленные типы в веб-клиенте будут поддержаны не в полном объеме. Так, например, все синхронные методы работы с HTTP-запросами будут вызывать исключение «Метод недоступен в веб-клиенте». Все различия в поведении будут, как обычно, подробно описаны в документации. "
36 DES
 
03.02.23
15:51
&НаКлиенте    
Функция ВыполнитьGET_ЭЦП(Прмтр) Экспорт
    Перем Соединение, Заголовки, Запрос, Результат;
    
    Соединение = Новый HTTPСоединение("localhost",12345,,,,5,);
    Заголовки = Новый Соответствие;
    Заголовки.Вставить("Accept", "application/json;q=0.9,text/plain");
    Заголовки.Вставить("Accept-Charset", "utf-8");
    Заголовки.Вставить("User-Agent", "Java/1.8.0_202");        
    Заголовки.Вставить("Connection", "close");        
    Запрос = Новый HTTPЗапрос("/" + Прмтр, Заголовки);
    Попытка
        Результат = Соединение.Получить(Запрос);
        Если Результат.КодСостояния=200 Тогда
            Возврат Результат.ПолучитьТелоКакСтроку();
        КонецЕсли;
    Исключение  
        Сообщить(ОписаниеОшибки());
        Возврат Неопределено;
    КонецПопытки;
    
КонецФункции

Это работает на Тонком клиенте
37 Kassern
 
03.02.23
15:53
(36) на вебе вылетает на  Результат = Соединение.Получить(Запрос);  ?
38 Kassern
 
03.02.23
15:53
или уже на  Соединение = Новый HTTPСоединение("localhost",12345,,,,5,);  ?
39 DTXyupyup
 
03.02.23
15:55
(35) Ок, мб
Но он ошибку не получает

Последние вопросы:
1. Асинх уже попробовал автор?
Черным по белому вон же доку цитируют
2. Если асинх не работае, чем 19 не устраивает?

По поводу (22).
Там же браущер дергает запрос, корсам быть, согласен. *Если использовать HTTPЗапрос
Не факт, что корсы помешают если использовать ком-объект винды
Но корсы тут явно вторичны)
40 DTXyupyup
 
03.02.23
15:56
а, ну и почему скрина из девтулзов нет, тоже непонятно
41 DES
 
03.02.23
15:58
(40) что такое девтулзы ?
Ошибку дает на  Результат = Соединение.Получить(Запрос);
42 Kassern
 
03.02.23
15:59
(41) Вы же читали документацию. Прочтите внимательно еще раз (35) Там же черным по белому написано, что на веб клиенте синхронные методы ограничены и нужно использовать асинхронные.
43 Kassern
 
03.02.23
16:00
Покажите нам вариант с асинхронным запросом вместо Соединение.Получить(Запрос);
44 Kassern
 
03.02.23
16:00
Думаю что все будет норм отрабатывать
45 DES
 
03.02.23
16:01
я не знаю как асинхронные использовать.

&НаКлиенте
Асинх Функция ВыполнитьGET_ЭЦП_Асинх(Прмтр)
    Перем Соединение, Заголовки, Запрос, Результат;
    
    Соединение = Новый HTTPСоединение("localhost",12345,,,,5,);
    Заголовки = Новый Соответствие;
    Заголовки.Вставить("Accept", "application/json;q=0.9,text/plain");
    Заголовки.Вставить("Accept-Charset", "utf-8");
    Заголовки.Вставить("User-Agent", "Java/1.8.0_202");        
    Заголовки.Вставить("Connection", "close");        
    Запрос = Новый HTTPЗапрос("/" + Прмтр, Заголовки);
    Попытка
        обещание = Соединение.ПолучитьАсинх(Запрос);
        Сообщить("Ждать обещание");
        Результат = Ждать обещание;
        Сообщить("обещание");
        Если Результат.КодСостояния=200 Тогда
            Возврат Результат.ПолучитьТелоКакСтроку();
        КонецЕсли;
    Исключение  
        Сообщить(ОписаниеОшибки());
        Возврат Неопределено;
    КонецПопытки;

не работает тоже
46 DES
 
03.02.23
16:03
вернее функция возвращает ответ до  Результат = Ждать обещание;
47 DES
 
03.02.23
16:05
получается так в логах

"Ждать обещание"
"сервер не ответил"
"обещание";
48 Kassern
 
03.02.23
16:05
(45) Потому что написали вы не понимаете, что такое асинх вызовы.
По факту вы дали задание выполнить метод, цикл идет дальше. 1ска не ждет ответа а выполняет дальше код. Это примерно так же как показатьВопрос в 1с.
49 DTXyupyup
 
03.02.23
16:05
(40) Эх, опять свою суперсекретную коллекцию расчехлять..
https://letmegooglethat.com/?q=что+такое+девтулзы+%3F&l=1

(45) 45 сообщение потребовалось
неужели в сп нет примеров использования асинх методов?
даже не знаю тогда что делать, если в гугле забанили
50 Kassern
 
03.02.23
16:06
Вам нужно структуру переделать под асинх вызовы
51 Kassern
 
03.02.23
16:07
Обещание (Promise)
Доступен, начиная с версии 8.3.18.
Описание:
Используется для асинхронных вычислений. Все асинхронные функции возвращают объект типа Обещание.
Обещание - это контейнер для, возможно, пока неизвестного результата выполнения некоторого действия (асинхронной функции).
У функции может быть два результата: нормальное завершение (тогда Обещание содержит возвращаемое значение) или исключение (тогда Обещание оборачивает исключение).
52 Kassern
 
03.02.23
16:08
походу надо так
Рез = Ждать Об; // Об - Обещание
53 DTXyupyup
 
03.02.23
16:09
(50) Нужно слушать научится и вопросы задавать)
Все уже было сказано слишком много. Дальше должно придти понимания. Оно приходит только в одиночку.
В общем пойду посмотрю, что в политике творится) А то слишком давно тут не был, а тем не видно ни одной, хотя раньше пачками пилили))
54 DES
 
03.02.23
16:10
(52) ну я же так и сделал , вот же Результат = Ждать обещание;
55 Kassern
 
03.02.23
16:11
(54) Это читали?
В веб-клиенте нужно учитывать, что запрос можно отправить только на тот же самый домен, на котором опубликован веб-клиент, или на домен, в котором нет CORS-ограничений на принятие запроса от веб-клиента. В противном случае будет вызвано исключение.
Если веб-клиент опубликован по HTTPS, то запрос можно отправить, только используя защищенное соединение. В противном случае будет вызвано исключение.
56 DES
 
03.02.23
16:15
все пока в локалке, все по http пока
57 Kassern
 
03.02.23
16:18
(56) Я так понимаю у вас привязка к клиенту обязательная, так как только на нем нужные данные для передачи?
58 DES
 
03.02.23
16:18
кажется я понял в этой части
Если Не ВыполнитьGET_ЭЦП_Асинх("Hi") тогда ....

проверка условия не ждет окончания выполнения функции и поэтому проблема.

как тогда поступать ?
59 DES
 
03.02.23
16:20
(57) на клиенте сервер обработки инфы, проверяющий откуда запрос к нему пришел, (можно только от локалхоста)
60 Kassern
 
03.02.23
16:20
(58) Раскидать как это делается для ПоказатьВопрос используя оповещения
61 DES
 
03.02.23
16:21
там просто понятно проверятся в этой же процедуре, а мне нужно вернуть ответ в функции
62 DES
 
03.02.23
16:23
как затормозить ответ асинх функции пока она не получила данные ?
63 Kassern
 
03.02.23
16:24
(62) По идее "ждать" должно тормозить, а как на самом деле - не проверял.
64 DES
 
03.02.23
16:26
оно тормозит внутри функции, но саму функцию нужно публиковать с префиксом асинк. Вот саму то функции проверка IF то и не ждет.
65 Kassern
 
03.02.23
16:31
Попробуйте через ВыполнитьОбработкуОповещения(<ВыполняемоеОповещение>, <Результат>) реализовать
66 Жан Пердежон
 
03.02.23
16:32
(64)
Результат = Ждать АсинхФункция();
Если Результат =...
67 Kassern
 
03.02.23
16:33
Или сделайте в 2 подхода.
1 - сделали запрос, вы сразу вернули 200, ид запроса и мол ожидайте. Себе в табличку записали нужный ответ напротив ид запроса.
2- сервис делает запрос по ид. Если ждать отработало, то вы вернули его результат, иначе вернули, мол ждите еще, пока не готово.
68 Kassern
 
03.02.23
16:34
Представьте, что ждать у вас будет отрабатывать пол часа к примеру. Вы будете заставлять сервис тупить пол часа, чтобы он результат получил?)
69 DES
 
03.02.23
16:39
(66)  Оператор Ждать (Await) может употребляться только в асинхронных процедурах или функциях
внутри Асинх можно, снаружи - нельзя

Делаю цикл Пока ответ=неопределено цикл
но что то не хочет
70 Kassern
 
03.02.23
16:42
(69) А если вызывающую функцию тоже сделать асинх?
71 DES
 
03.02.23
16:42
(70) а как ее потом ловить ?
72 DES
 
03.02.23
16:43
Обещ = ВыполнитьGET_ЭЦП_Асинх("h")
возвращает Обещ типа Обещание.
как обработать ?
Ждать Обещ - не дает
73 Kassern
 
03.02.23
16:47
(71) Через оповещения пробовали?
Взять ту же типовую конфу, там все обмены асинх сделаны через оповещения
74 Kassern
 
03.02.23
16:47
Вот кусок кода из обмена с банками
Если ПрограммаБанка = ПредопределенноеЗначение("Перечисление.ПрограммыБанка.АсинхронныйОбмен") Тогда
        Параметры = Новый Структура;
        Параметры.Вставить("НастройкаОбмена", НастройкаОбмена);
        Параметры.Вставить("РеквизитыНастройкиОбмена", ПараметрыОбмена);
        Параметры.Вставить("ОбработчикПослеТестаНастройки", Обработчик);
        Если ПараметрыОбмена.АутентификацияПоСертификату ИЛИ ПараметрыОбмена.ТребуетсяПодпись Тогда
            Оповещение = Новый ОписаниеОповещения("ПослеПолученияОтпечатковПроверитьСвязь", ЭтотОбъект, Параметры);
            ПолучитьОтпечаткиСертификатов(Оповещение);
        Иначе
            ПослеПолученияОтпечатковПроверитьСвязь(Новый Соответствие, Параметры);
        КонецЕсли;
75 Kassern
 
03.02.23
16:49
Вот по сберу
Оповещение = Новый ОписаниеОповещения("ОбработатьРезультатАсинхроннойПодписиСбербанк", ЭтотОбъект,
        ДополнительныеПараметры, "ОбработатьОшибкуПодписиСбербанк", ЭтотОбъект);
76 Kassern
 
03.02.23
16:50
Как я и писал выше, вам нужно структуру когда переделать под асинхронные вызовы
77 DES
 
03.02.23
16:56
(76) это понятно, непонятно как
78 Kassern
 
03.02.23
16:57
Гляньте как-нибудь процедуру ОбработатьРезультатАсинхроннойПодписиСбербанк из модуля ОбменСБанкамиСлужебныйКлиент
Там наглядно видно как использовать асинхронные вызовы

Проще говоря проверяется ответ, пока он равен 0 маячит форма с крутилкой, как только результат<>0 тогда успешный успех)
79 DES
 
03.02.23
16:58
У меня перед работой модуля идет проверка доступности/готовности локального сервера.
Проверяю Если на запрос "Привет" не приходит ответ "Ну привет" тогда  возврат конецесли
иначе начинаем работать
80 DES
 
03.02.23
17:00
получается нужно гонять цикл Пока
81 Kassern
 
03.02.23
17:02
(80) Посмотрите как там сделано, нет там цикла явного. Просто открывается форма, при открытии выполняется оповещение с проверкой. Там через ПодключитьОбработчикОжидания отрабатывает
82 Kassern
 
03.02.23
17:03
У вас же есть под рукой типовые конфы, посмотрите как там асинхронные вызовы делают
83 DES
 
03.02.23
17:03
нету ничего такого, тут я сам с собственном соку
84 Kassern
 
03.02.23
17:07
Если будет настроение, то в выхи поковыряю для саморазвития эти асинх и ожидать в веб клиенте. Отпишусь потом
85 lodger
 
03.02.23
17:10
(84) а чего там ковырять в асинх? точно так же как в тонком клиенте.
86 DTXyupyup
 
03.02.23
18:11
чем кстати (20) не устроило?

про режим совместимости уже было?


ну и что за задачам - уже слишком интересно, что там за сервер такой локальный


из интересных и простых вариантов еще можно предложить микросервис написать на этом клиенте - архитектура чуть получше будет
87 DTXyupyup
 
03.02.23
18:32
кстати, в тонком клиенте может работать как раз из-за корсов.
и сейчас нет даже понимания, отправляется ли запрос куда-то или нет. в этом направление уже толкали, и не раз.
88 DES
 
03.02.23
18:42
(87) синхроны интерпретатор не пускает, а асихнроны - в непонятках
89 Kassern
 
03.02.23
19:08
(85) сам не тестил, вот и интересно
90 DES
 
04.02.23
00:27
нигде не нашел примера на тему  ВызватьHTTPМетодАсинх(<HTTPМетод>, <HTTPЗапрос>, <ИмяВыходногоФайла>)
91 Garykom
 
гуру
04.02.23
00:49
Соединение = Новый HTTPСоединение("httpbin.org", , , , , 5);
Запрос = Новый HTTPЗапрос("/get");
ОбещанныйРезультат = Соединение.ВызватьHTTPМетодАсинх("GET", Запрос);
Результат = Ждать ОбещанныйРезультат;
Если Результат.КодСостояния = 200 Тогда
    // удачное завершение
Иначе
    // что-то пошло не так
КонецЕсли;

купи ИТС https://its.1c.ru/db/v8321doc#bookmark:dev:TI000002520
92 2mugik
 
04.02.23
10:49
теперь ему осталось вызвать как-то все это с оповещением чтобы поймать.
93 ДедМорроз
 
04.02.23
11:22
А web-сервер и сервер 1с на одной машине ?
Что касается расширения браузера,то там и запросы куда угодно работают и все,что происходит на странице,можно переопределять.
Но,расширение нужно ставить - это единственный недостаток.
Кроме того,расширение имеет доступ ко всему,что происходит в браузере,и очень опасно ставить неизвестные расширения.
94 DES
 
04.02.23
12:57
(93) на одной
95 DES
 
04.02.23
12:58
(93) где скачать это вебрасширение для edge
96 DES
 
04.02.23
13:05
сделал так
    Результат = Ждать Соединение.ПолучитьАсинх(Запрос);
    Если Результат.КодСостояния=200 Тогда
            Сообщить(Результат.ПолучитьТелоКакСтроку());
    КонецЕсли;
на тонком работает. а на вебе ошибка
"Соединение = Новый HTTPСоединение(\"localhost\",12345,,,,5,Новый ЗащищенноеСоединениеOpenSSL());"
97 DES
 
04.02.23
13:30
(91) сделал
на тонком - норм, на веб - ошибка
    "errorInfo": {
        "userDescription": "",
        "systemErrorInfo": {
            "systemCrash": true
        },
        "applicationErrorInfo": {
            "errors": [
                [
                    "InvalidStateError",
                    [],
                    "",
                    ""
                ]
            ]
        }
    },
98 DES
 
04.02.23
14:05
если  взываю по SSL то ошибка  "\tСоединение = Новый HTTPСоединение(\"localhost\",11443,,,,5,Новый ЗащищенноеСоединениеOpenSSL());"
если не SSL то  ошибка "\tРезультат = Ждать ОбещанныйРезультат;"
На  тонком клиенте оба варианта рабочие
99 Garykom
 
гуру
04.02.23
16:53
100 DES
 
04.02.23
19:11
(99) Был установлен ранее .

установил все на один комп и сервер 1с и веб и свой сервер и  вебрасш для хрома - один фиг.
в тонком клиенте работает и по ssl и без.
в вебе ошибки, но разные для https и для http
101 DES
 
04.02.23
19:13
"\tРезультат = Ждать ОбещанныйРезультат;"
102 Garykom
 
гуру
04.02.23
19:26
(100) не к локалхост из веб-клиента обращается?
103 DES
 
04.02.23
20:01
(102) к localhost из вебклиента всегда обращается
104 DES
 
04.02.23
20:08
(102) и тестирую прямо на этом компе
105 Garykom
 
гуру
04.02.23
22:29
(103) я спрашиваю у тебя HTTPЗапрос из веб-клиента на другие ip (не на localhost|127.0.0.1) нормально делается?
106 DES
 
05.02.23
17:37
(105) на ya.ru аналогично. в тонком норм, веб - нет
107 DES
 
06.02.23
19:57
(84) получилось?