Имя: Пароль:
1C
1С v8
Асинхронность запроса к http-сервису и исполняемого кода
,
0 Vito
 
09.08.22
17:18
К http-сервису 1С  идет запрос с параметрами, в дальнейшем параметры используются на выполнения кода, довольно длительного по времени (в процессе формируется 2 запроса по API, ну вот такой кривой внешний сервис). В результате время выполнения первого запроса очень длинное, что неприятно, тем более иногда оно может превысить таймаут.

Как можно сделать, так чтобы http-сервису сразу ответил на запрос статусом 200, типа "я принял параметры", а дальше  спокойно стал исполнять длинный код?
Код http-сервиса:

Функция APIGET(Запрос)
  Ответ = Новый HTTPСервисОтвет(200);
  ДлинныйИспоняемыйКод(Запрос);
  Возврат Ответ;    
КонецФункции
1 Kassern
 
09.08.22
17:22
(0) легко так можно сделать. Вы передаете сервису параметры, он вам возвращает токен. Вы по этому токену проверяете, есть ли ответ, или нет. Если есть, то уже получаете данные
2 YAGolova
 
09.08.22
17:22
Воспользуйся фоновыми заданиями. Те ДлинныйИспоняемыйКод должен выполняться в фоне
3 Kassern
 
09.08.22
17:23
по такому принципу работает почта России, когда вам нужно получить информацию по большому количеству отправлений.
4 YAGolova
 
09.08.22
17:23
(1) Судя по всему ему и на надо получать данные - главное запрос отправить
5 Kassern
 
09.08.22
17:24
(4) если есть возможность с внешнего сервиса поменять алгоритм, то (1) как вариант
6 mTema32
 
09.08.22
17:58
(0) В (1) человек дело говорит. Так много сервисов работают.
Фактически получается разделение сервиса на два. Сторонний клиент делает запрос и ему создается запись с номером его запроса и текущим статусом. И клиент периодически опрашивает эту запись. Как только данные будут собраны, меняется статус запроса. И каким-либо методом используя этот номер запроса данные он забирает.
7 Vito
 
09.08.22
18:01
(5) Как вариант, но внешний сервис будет ждать или там тоже нужно городить асинхронность, а это геморно, а если сделать то можно и без токена обойтись...
(2) Попробую наверное этот вариант. Я о нем думал тоже. Мне кажется это проще всего.
По результатам отпишусь.
8 Vito
 
09.08.22
18:03
(6) Мне не надо назад возвращать результаты исполнения кода. Фактически запрос к http-сервису это хук, который всего лишь запускает процесс, причем некритичный. Он кнопкой продублирован.
9 Kassern
 
09.08.22
18:05
(8) А как вы узнаете, удачно, или нет этот "хук" отработал, или пофиг? Если пофиг, то да, токен не нужен, нужно лишь сам внешний сервис немного ковырнуть, чтобы он сразу ответ возвращал, а потом у себя крутил процесс.
10 Vito
 
09.08.22
18:47
(9)  Достаточно будет, что критерием успешности отработки является успешное получение параметров. А потом пусть крутиться, поэтому мне вариант 2 понравился.
11 Kassern
 
09.08.22
18:51
(10) а оно вам надо, висящее фоновое задание в 1с? Я бы на сторону внешнего сервиса это пихнул, меньше головняка в 1с
12 Новиков
 
09.08.22
18:55
(1) Классное решение.
13 Тихий омут
 
10.08.22
03:42
(0) ГИИС ДМДК?
14 Strogg
 
10.08.22
08:30
(1) поподробнее для вебсервис-новичков можно? Типа формируется какой то уид задания, в базу записывается сочетание уид - статус выполнения, и при следующем обращении к сервису по уид - выдается либо результат либо болт, если задание еще не выполнено?
15 Smit1C
 
10.08.22
08:36
(13) тоже хотел спросить )))
16 Kassern
 
10.08.22
09:00
(14) Попробую по подробнее:
Вы передаете данные для обработки на веб сервис, ответом сразу получаете какой-то гуид/токен.
Веб сервис добавляет ваши данные для обработки в очередь и присваивает статус
Далее вы периодически отправляете запрос на проверку статуса передавая полученный токен. Если данные веб сервис обработал, он вам вернет результат.
17 программистище
 
10.08.22
09:18
Еще можно писать данные в регистр очереди и отправлять 200, что данные записаны
А потом уже регламентное обрабатывает по очереди
18 Strogg
 
10.08.22
10:19
(16) в точности как я и написал)
19 Kassern
 
10.08.22
10:23
(18) ага, я чет дальше "по подробнее можно" не прочитал спросонья)
20 valerivp
 
12.08.22
00:17
(0) лучше вернуть 202
21 Serginio1
 
18.08.22
13:29
.Net в 1С. Асинхронные HTTP запросы, отправка Post нескольких файлов multipart/form-data, сжатие трафика с использованием gzip, deflate, удобный парсинг сайтов и т.д.
https://infostart.ru/1c/articles/466052/

Выполнитель=Врап.ПолучитьАсинхронныйВыполнитель();
ДобавитьОбработчик Выполнитель.ПриОкончанииВыполненияЗадачи, ПриОкончанииВыполнения;

//Обработчик события выглядит так
Процедура ПриОкончанииВыполнения(Задача,ДанныеКЗадаче)

    // Обязательно нужно отлавливать ошибку в 1С
    // Иначе она передается в .Net где обрабатывается там
    Попытка
Так как задача может завершиться с ошибкой
Мы должны проверить, и если ошибка нужно предпринять какие то действия
        Если (Задача.IsFaulted) Тогда  // Ошибка выполнения

            Сообщить("Ошибка "+Врап.ВСтроку(Задача.Exception));
            Сообщить("Данные к задаче "+Врап.ВСтроку(ДанныеКЗадаче));

        иначе
            Сообщить("=====Выполнена задача ====");
            Сообщить("Данные к задаче "+Врап.ВСтроку(ДанныеКЗадаче));
            Сообщить(Врап.ВСтроку(Задача.Result));


        КонецЕсли;

    Исключение
        Сообщить("Ошибка в процедуре");
        Сообщить(ОписаниеОшибки());
    КонецПопытки

КонецПроцедуры

Вызываем задачу так

    Клиент=Врап.СоздатьОбъект(HttpClient);
    Задача=Клиент.GetStringAsync("https://msdn.microsoft.com/ru-ru/library/hh551745(v=vs.118).aspx");
    Выполнитель.Выполнить(задача,ТекущаяДата());
22 ДедМорроз
 
18.08.22
14:57
Очередь нужна,если запросов будет много и они могут приходить параллельно,а фоновое задание хочется иметь одно.
Если не важно,то для каждого обращения может запускаться свое фоновое задание.
23 valerivp
 
18.08.22
15:16
(21)но это же на клиенте - для него есть штатные методы, а в старых платформах - js
24 Serginio1
 
18.08.22
16:07
(23) Так клиенту похрену когда придет ответ если он принимает ответы асинхронно.
Если не хочешь асинхронно, то возвращай Id ответа, ответ помещай в словарь и метод для опроса по Id . Можешь использовать Вэб сокеты для оповещения https://infostart.ru/1c/articles/434771/
Вариантов куча. Но обычно это асинхронные методы