Имя: Пароль:
1C
 
Можно ли в http сервисе вернуть ответ, потом продолжить выполнение кода?
,
0 anders297
 
05.10.23
11:54
Хочу по апи получить некоторые данные, вернуть клиенту ответ что получил их и все ок, далее продолжить выполнение тяжелого кода.

В методе HHTP сервиса
Ответ = Новый HTTPСервисОтвет(200);
Ид = Запрос.ПараметрыURL["id"];
Ответ.УстановитьТелоИзСтроки("success");
Возврат Ответ;


// Здесь продолжить работу с полученным ИД

Возможно ли это? Получается что мне эти идентификаторы нужно складывать в какое-то хранилище типа плана обмена, потом регзаданием обрабатывать. Но в рамках задачи, обработать нужно максимально быстро, насколько это возможно. Неохота регзадание каждые 10 секунд крутить ради запросов, которых может быть несколько в сутки.
1 Donkey_hot
 
05.10.23
10:52
(0) БСП, ВыполнитьПроцедуру не подойдет?
2 Новиков
 
05.10.23
11:00
(0) вернуть клиенту ответ что получил их и все ок
и
обработать нужно максимально быстро, насколько это возможно

В некотором контекстном противоречии. Если нужно отдать клиенту "квитанцию об успешной загрузке" в терминах обменов 1С - разговор один и твои проблемы, что ты далее будешь делать с загруженным. Т.е. это не проблемы сервиса http и его работы, он заканчивает свою деятельность отдачей ответа.

Если же с отдачей нужно как-то проинформировоать ту сторону о результатах обработки этой загрузки, то разговор другой.
3 Hmster
 
05.10.23
11:06
(0) А разве нельзя в самом сервисе перед отправкой ответа запустить регл. задание?
4 Новиков
 
05.10.23
11:22
(3) В общем случае, можно - но это проблему не решит, т.к. если возможна повторная до-обработка/новая обработка данных полученных ранее от внешнего api, то получается "одноразовый" http-сервис загрузчик какой-то: данные принял, ок вернул наружу, а обработать не смог и, допустим, упал на чем-то. Я бы сразу на это расчитывал, если это какой-то загрузчик прайс-листов или что-то подобного.
5 anders297
 
05.10.23
11:47
(2) информировать о успешной обработке не нужно. Только то что идентификатор я получил. Дальше мои проблемы.
6 anders297
 
05.10.23
11:50
(4) да, у меня предусмотрен функционал, который хранит полученные ИД, и он прослеживает чтобы их обработка прошла до конца. Но уведомления о нештатных ситуациях обрабатываются на нашей стороне. Клиенту по апи они не нужны.
7 anders297
 
05.10.23
11:52
(3) Я никогда раньше не запускал регзадания програмно )
Это то-же самое что запуск фоновых заданий?
8 DirectorGora
 
05.10.23
11:57
(0) По опыту скажу отсылка данных по http сервису вполне быстро отрабатывает, а вот если Вы хотите получить ответ от стороннего сервера, то вполне может много времени занять.
9 DirectorGora
 
05.10.23
11:58
(7) Регламентные задания отличаются от фоновых расписанием, не?
10 Новиков
 
05.10.23
12:03
(5) в этом случае, тогда эти "сырые данные" вы просто грузите в РС, структура которого совпадает полученным. Если у вас это 1 поле какое-то идентификатор, то значит идентификатор. И отдельный ресурс сделаете "Обработано". И заданием просто вычитываете, что не обработано, обрабатываете и проставляете флаг обработки. Это позволит вам этот процесс выстроить так, как он у вас в жизни происходит. Более того, сами можете настроить и второе задание, которое по какому-то SLA (дате получения данных по апи) будет алерты вам слать - дескать, вот загрузил данные, а 3 дня обработать их не могу. Ну, появится более такой гибкий и хороший механизм. А если сделать в лоб, запуск задания из сервиса - это плохая практика, одноразовая. Не получилось обработать и чего?
11 Hmster
 
05.10.23
12:13
(7)
ВидЗадания - Имя рег задания
    
    
    МетаРегЗадание = Метаданные.РегламентныеЗадания.Найти(ВидЗадания);
    Если Не МетаРегЗадание = Неопределено Тогда
        Попытка
            СтруктураОтбора = Новый Структура;
            СтруктураОтбора.Вставить("Метаданные",МетаРегЗадание);
            РеглЗад=РегламентныеЗадания.ПолучитьРегламентныеЗадания(СтруктураОтбора);
            Для Каждого Задание Из РеглЗад Цикл
                Попытка
                    Задание.Записать();
                Исключение
                КонецПопытки;                        
            КонецЦикла;
        Исключение
        КонецПопытки;
    КонецЕсли;
12 Волшебник
 
05.10.23
12:27
(11) Не надо глотать ошибки, это плохая практика
13 anders297
 
05.10.23
12:55
(11) спасибо
14 anders297
 
05.10.23
12:57
Когда мы делаем Задание.Записать() - Это запуск регзадания, сейчас отдельным процессом?
15 Donkey_hot
 
05.10.23
12:57
В упор не пойму, причем тут рег. задания...
16 arsik
 
гуру
05.10.23
12:58
А чем вам фоновые то не подошли?
17 Donkey_hot
 
05.10.23
13:03
(16) + Вот-вот
18 anders297
 
05.10.23
13:04
(16) та наверное ничем) в начале о них не подумал.
19 Donkey_hot
 
05.10.23
13:05
(18) Если есть БСП, см. (1), в противном случае см. МенеджерФоновыхЗаданий, метод Выполнить()
20 mTema32
 
05.10.23
13:26
(0) Складываешь данные в какой-нибудь РС с признаком обработаны/не обработаны. И фоном вешаешь задание которое эти данные лопатит, запускаясь с нужной периодичностью.
21 Valdis2007
 
05.10.23
14:36
(5) ну тогда тебе и не надо фоновые зад. , просто делай, что надо после - Возврат Ответ;
22 Valdis2007
 
05.10.23
14:42
Ответ = Новый HTTPСервисОтвет(200);
Ид = Запрос.ПараметрыURL["id"];
Ответ.УстановитьТелоИзСтроки("success");
//запуск асинхронной процедуры посмотри в СП подробности
ФоновыеЗадания.Выполнить("",МассивПараметров, Строка(Новый УникальныйИдентификатор),"");
//

Возврат Ответ;
23 mikecool
 
05.10.23
15:15
(9) сотрудник на 666к рублей не должен задавать таких вопросов
24 DirectorGora
 
05.10.23
15:26
(23) З - зависть))
25 ДедМорроз
 
05.10.23
23:28
Фоновые задания - это хорошо,но только,если клиент-сервер.
26 Новиков
 
06.10.23
09:01
(25) Думаешь, если файловая, то у него нет возможности запустить отдельный клиентский сеанс для этих дел?
27 Hmster
 
06.10.23
09:38
Фоновые задания это конечно хорошо, но если нужно гарантировано выполнить код, лучше подстраховаться регл.заданием.
Например, задание выполняется раз 10 минут, но при определенных обстоятельствах можно запустить раньше срока.