Асинхронные вызовы

02.02.15

Разработка - Механизмы платформы 1С

В этой статье я покажу свою реализацию асинхронных вызовов серверных функций и процедур

Скачать файлы

Наименование Файл Версия Размер
АсинхронныеВызовы.cf
.cf 203,45Kb
200
.cf 203,45Kb 200 Скачать

Асинхронные вызовы

Основное преимущество асинхронных вызовов перед синхронными в том, что они не блокируют пользовательский интерфейс. Если вы синхронно запускаете процедуру или функцию, которая продолжительно выполняет какие-то действия, то ваш пользовательский интерфейс на это время будет недоступен.

Можно сказать, что построение отчета в фоновом режиме (СкомпоноватьРезультат(РежимКомпоновкиРезультата.Фоновый)) и есть асинхронный вызов. Правда тут надо оговориться, что все-таки это лишь эмуляция асинхронного вызова, как и реализация, которую я покажу.

 

Характеристики реализации

1. Обычное и управляемое приложения

2. Клиент-серверный и файловый режим

3. Асинхронное выполнение серверных процедур и функций

4. Получение возвращаемого функцией значения

5. Получение описания произошедшей ошибки

6. Отмена асинхронного вызова

7. Слежение за завершением асинхронного вызова

8. Слежение за ходом выполнения асинхронного вызова

 

Требования к асинхронно вызываемым функциям и процедурам

Асинхронно вызываемые функции и процедуры должны быть экспортными, и могут находиться в следующих модулях:

- Модули менеджеров объектов

- Глобальные и неглобальные серверные общие модули

Параметры в этих функциях и процедурах должны иметь возможность передаваться с клиента на сервер. Возвращаемые значения в этих функциях должны иметь возможность передаваться с сервера на клиент.

По факту можно сказать, что требования такие же, как и к функциям и процедурам, находящимся в общих серверных модулях с признаком ВызовСервера.


Общий модуль АсинхронныеВызовы

В этом модуле находятся процедуры и функции программного интерфейса асинхронных вызовов. Только с этим модулем вам придется работать при совершении асинхронных вызовов.

Программный интерфейс состоит из следующих процедур и функций:

//Клиент
Функция ВызватьФункцию(ИмяФункции, Параметры = Неопределено, Форма = Неопределено, ИмяОбработчикаЗавершения = Неопределено, ИмяОбработчикаХодаВыполнения = Неопределено, Контекст = Неопределено, АвтоотменаЧерез = Неопределено) Экспорт
Функция ВызватьПроцедуру(ИмяПроцедуры, Параметры = Неопределено, Форма = Неопределено, ИмяОбработчикаЗавершения = Неопределено, ИмяОбработчикаХодаВыполнения = Неопределено, Контекст = Неопределено, АвтоотменаЧерез = Неопределено) Экспорт
Процедура Отменить(АсинхронныйВызовИлиМассив) Экспорт
Процедура ОтменитьВсе() Экспорт

//Сервер
Процедура ОбновитьЗначениеХодаВыполнения(ЗначениеХодаВыполнения) Экспорт
Процедура ДобавитьСообщениеХодаВыполнения(Сообщение) Экспорт


Структура АсинхронныйВызов

Вокруг данной структуры и происходят все действия - в ней хранится вся информация об асинхронном вызове.

Постоянные свойства:
    Идентификатор - идентификатор асинхронного вызова (по факту идентификатор фонового задания)
    ИмяФункцииИлиПроцедуры - полное имя серверной функции или процедуры
    ЭтоФункция - признак того, что запускали функцию и будет возвращаемое значение
    Параметры - массив параметров, который мы передали при асинхронном вызове функции или процедуры
    Форма - форма, в модуле которой находятся процедуры обработчики
    ИмяОбработчикаЗавершения - имя экспортной процедуры находящейся в модуле формы, которая будет обрабатывать завершение выполнения асинхронного вызова
    ИмяОбработчикаХодаВыполнения - имя экспортной процедуры находящейся в модуле формы, которая будет обрабатывать ход выполнения асинхронного вызова
    АвтоотменаЧерез - количество секунд, через которое необходимо автоматически отменить асинхронный вызов
    НачатВ - время начала асинхронного вызова
    Контекст - произвольная дополнительная информация, которая может быть связана с асинхронным вызовом

Изменяемые свойства:
    Состояние - состояние асинхронного вызова (Активен, Завершен, Отменен, ЗавершенСОшибкой)
    ВозвращенноеЗначение - значение возращенное функцией (для процедур этого свойства нет)
    ЗначениеХодаВыполнения - значение хода выполнения, например, процент завершения
    СообщенияХодаВыполнения - все сообщения, которые передавала асинхронно вызванная функция или процедура
    ОписаниеОшибки - описание ошибки произошедшей при асинхронном вызове

Вам не следует самим изменять значения в этой структуре.

Асинхронный вызов процедуры или функции

Асинхронно вызвать процедуру или функцию можно только с клиента.  Для этого используются две функции: ВызыватьФункцию и ВызыватьПроцедуру. Обе они возвращают структуру АсинхронныйВызов, но вы можете не обрабатывать результат, который они возвращают, если используете обработчики или не хотите следить за судьбой вызова.

Вот самый простой асинхронный вызов:

АсинхронныеВызовы.ВызватьПроцедуру("ОбщийМодульСервер.КакаяТоПроцедура");

Если процедура или функция имеет входящие параметры, то такой вызов будет выглядеть так:

ПараметрыВызова = Новый Массив;
ПараметрыВызова.Добавить("ЗначениеПараметра");
АсинхронныеВызовы.ВызватьФункцию("Обработки.КакаяТоОбработка.КакаяТоФункция", ПараметрыВызова);


Отмена асинхронного вызова

Асинхронный вызов можно отменить вручную, примерно так:

АсинхронныеВызовы.Отменить(АсинхронныйВызов); //Ранее значение в переменную АсинхронныйВызов было получено из функции ВызватьФункцию или ВызватьПроцедуру

В качестве параметра можно передать структуру АсинхронныйВызов, уникальный идентификатор вызова, строку содержащую уникальный идентификатор вызова или Массив, который может содержать все ранее перечисленное.

Можно отменить сразу все асинхроные вызовы, вот так:

АсинхронныеВызовы.ОтменитьВсе();

При этом можно сказать, что в обоих примерах выше, сам отменяющий вызов является асинхронным, т.е. после его завершения состояние асинхронного вызова не изменится сразу.

Также асинхронный вызов можно отменить автоматически по истечении заданного времени, примерно так:

АсинхронныеВызовы.ВызватьПроцедуру("ОбщийМодульСервер.КакаяТоПроцедура",,,,,,60); //Если за 60 секунд вызов не будет завершен, то он будет автоматически отменен


Слежение за завершением асинхронного вызова

Для того, чтобы отследить момент, когда асинхронный вызов будет завершен (нормально, с ошибкой или будет отменен) вам необходимо сделать следующее.

Во-первых, вы должны реализовать процедуру обработчик завершения асинхронного вызова.

Для обычной формы и асинхронно вызванной процедуры обработчик будет выглядеть так:

Процедура ОбработчикЗавершения(АсинхронныйВызов, Состояние, ОписаниеОшибки) Экспорт

Для управляемой формы и асинхронно вызванной функции обработчик будет выглядеть так:

&НаКлиенте
Процедура ОбработчикЗавершения(АсинхронныйВызов, Состояние, ВозвращенноеЗначение, ОписаниеОшибки) Экспорт

Имя обработчика вы выбираете сами.

Во-вторых, вы должны при асинхронном вызове передать в параметрах вызывающую форму и имя обработчика завершения из модуля этой формы, примерно так:

АсинхронныеВызовы.ВызватьФункцию("Обработки.КакаяТоОбработка.КакаяТоФункция",, ЭтаФорма, "ОбработчикЗавершения");

Когда асинхронный вызов завершится (нормально, с ошибкой или будет отменен), то будет вызван наш обработчик завершения.

Вы можете узнать о завершении асинхронного вызова без подключения обработчика завершения. Для этого вы должны сохранить структуру АсинхронныйВызов, которую возвращают функции ВызватьФункцию и ВызватьПроцедуру, и периодически или по нажатию кнопки проверять значение свойства Состояние.

 

Слежение за ходом выполнения асинхронного вызова

Асинхронный вызов может выполняться долго и иногда хотелось бы понимать сколько уже выполнено, что именно уже выполнено, ну и так далее.

Для решения этой задачи я ввел два термина: значение хода выполнения и сообщения хода выполнения.

Значение хода выполнения - это значение, которое характеризует завершенность асинхронного вызова. Это может быть процент выполнения, количество созданных объектов. Причем не обязательно это должно быть число, это может быть структура, которая содержит несколько значений и не обязательно числовых.

Сообщения хода выполнения - это сообщения, которые могут помочь в понимании того, что уже выполнено. Это может быть логирование асинхронного вызова или какие-то важные сообщения для пользователя. Причем не обязательно это должна быть строка, это может быть структура которая содержит несколько значений и не обязательно строковых.

Значение и сообщения хода выполнения - это разные вещи. Значение в каждый момент только одно, а вот сообщений может быть много.

Для того, чтобы можно было обрабатывать значение и сообщения хода выполнения, функция или процедура, вызываемая асинхронно, должна их передавать специальным образом. Для этого реализованы 2 процедуры ОбновитьЗначениеХодаВыполнения и ДобавитьСообщениеХодаВыполнения.

Примерно вот так их можно использовать:

Процедура ВыполнитьРаботу() Экспорт

   Для Сч = 1 По 100 Цикл

      //Код выполняющий основную работу

      АсинхронныеВызовы.ОбновитьЗначениеХодаВыполнения(Сч); //Процент выполнения
      АсинхронныеВызовы.ДобавитьСообщениеХодаВыполнения("Выполнили " + Сч + "%");
 
   КонецЦикла;

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

Итак, если ваша функция или процедура, вызываемая асинхронно, обновляет значение или добавляет сообщения хода выполнения, то вы можете их отслеживать. Для этого нужно сделать следующее.

Во-первых, вам необходимо реализовать обработчик хода выполнения асинхронного вызова. Для обычной формы он будет выглядеть так:

Процедура ОбработчикХодаВыполнения(АсинхронныйВызов, Значение, Сообщения) Экспорт

Имя обработчика вы выбираете сами.

Во-вторых, вы должны при асинхронном вызове передать в параметрах вызывающую форму и имя обработчика хода выполнения из модуля этой формы, примерно так:

АсинхронныеВызовы.ВызватьФункцию("Справочники.КакойТоСправочник.КакаяТоФункция", ПараметрыВызова, ЭтаФорма, , "ОбработчикХодаВыполнения");

Обработчик хода выполнения будет вызываться тогда, когда обновилось значение хода выполнения или появились новые сообщения хода выполнения.

Вы можете узнать о ходе выполнения асинхронного вызова без подключения обработчика хода выполнения. Для этого вы должны сохранить структуру АсинхронныйВызов, которую возвращают функции ВызватьФункцию и ВызватьПроцедуру, и периодически или по нажатию кнопки проверять значение свойств ЗначениеХодаВыполнения и СообщенияХодаВыполнения. Если вы хотите видеть только новые сообщения, еще не обработанные вами, то вы должны очищать их.

АсинхронныйВызов.СообщенияХодаВыполнения.Очистить();


Демонстрационный пример

В демонстрационной конфигурации АсинхронныеВызовы.cf вы найдете пример для обычного приложения.

Демо (обычное приложение) 

И для управляемого приложения.

Демо (управляемое приложение)

Поэксперементируйте - это интересно.


Реализация

Можно сказать, что вся реализация строится на следующем:

- Фоновые задания и метод ПолучитьСообщенияПользователю

- Оператор Выполнить

- Глобальный обработчик ожидания

- Сериализация/десериализация с помощью ЗначениеВСтрокуВнутр/ЗначениеИзСтрокиВнутр

Более подробно вы всегда можете посмотреть реализацию в АсинхронныеВызовы.cf


Внедрение

Для внедрения в конфигурацию необходимо перенести 4 общих модуля:

- АсинхронныеВызовы

- АсинхронныеВызовыКлиент

- АсинхронныеВызовыСервер

- АсинхронныеВызовыКлиентГлобальный

А так же добавить в модули управляемого и обычного приложений экспортную переменную НезавершенныеАсинхронныеВызовы.

 

Заключение

Надеюсь, описанный в статье материал будет вам полезен. 

Спасибо за внимание.

Асинхронные вызовы

См. также

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    4539    dsdred    53    

72

Как готовить и есть массивы

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    5295    YA_418728146    25    

63

Планы обмена VS История данных

Обмен между базами 1C Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    6410    dsdred    36    

112

1С-ная магия

Механизмы платформы 1С Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    18476    SeiOkami    46    

118

Дефрагментация и реиндексация после перехода на платформу 8.3.22

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    12089    human_new    27    

74

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8824    YA_418728146    6    

141

Внешние компоненты Native API на языке Rust - Просто!

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    6279    sebekerga    54    

94

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    15987    SeiOkami    31    

103
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. пользователь 02.02.15 18:15
Сообщение было скрыто модератором.
...
2. jobkostya1c_ERP 100 03.02.15 07:27 Сейчас в теме
Материал будет полезен когда есть проблемы с производительностью.Или нужно на ночь запускать кучу фоновых процессов. Так обычно запускают отдельный процесс, даже в толстом клиенте 1С 8 и стараются 1С вообще не трогать.
3. Князь 77 03.02.15 08:20 Сейчас в теме
Весьма полезно. За реализацию оповещения пользователя о ходе процесса выполнения серверных процедур отдельное спасибо.
ybatiaev; +1 Ответить
4. LsrGroup 03.02.15 10:04 Сейчас в теме
В случае БСП лучше использовать подсистему ДлительныеОперации. Там все это уже реализовано.
Romario_; ivan_luzinov; DarkUser; herfis; dour-dead; pit201201; Aleksey81; YPermitin; AllexSoft; нормальный такой; +10 Ответить
9. pumbaE 09.02.15 11:54 Сейчас в теме
(4) LsrGroup, длительные операции - это одна из частностей асинхронного вызова, если у вас длительная операция прервется, то вы об этом вряд-ли узнаете и ваша важная задача не выполнится в полном объеме.
adhocprog; Aleksey81; +2 Ответить
17. herfis 498 23.01.17 18:06 Сейчас в теме
(9) По сути реализации - практически одно и то же. В БСП тоже есть возможность подключить обработчик оповещения завершения задания. И суть его реализации точно такая же, как у ТС - через обработчик ожидания на клиенте.
Из преимуществ разработки вижу только не завязанный на БСП, более стройный и лаконичный API. Если же БСП уже есть, то нет смысла плодить сущности.
ЗЫ. Упс, не обратил внимание на дату комментария. С тех пор БСП существенно допиливалась. На тот момент этого функционала могло и не быть.
5. webdimon 04.02.15 11:28 Сейчас в теме
Правильно я понимаю что данную схему можно будет реализовать в 8.2 и в 8.3, верно?
6. rtnm 614 04.02.15 12:29 Сейчас в теме
(5) webdimon, верно, зависимостей от платформы 8.3 нет (в демонстрационном примере есть - ПоказатьПредупреждение)
adhocprog; +1 Ответить
7. webdimon 04.02.15 18:43 Сейчас в теме
Хотел бы уточнить, к примеру, у меня есть некий рабочий стол на упр.формах., на котором информация обновляется каждые 30 секунд, получение данных для обновления занимает 5 секунд , и все это время , тоесть 5 секунд, пользователь не может работать так как форма висит.
С вашим методом, как я понял, получиться этого избежать, верно?
8. rtnm 614 04.02.15 22:35 Сейчас в теме
(7) webdimon, новых методов я не изобретал, я лишь показал одну из возможных реализаций асинхронных вызов скрывающую детали. Любая такая реализация так или иначе все равно будет использовать один и тот же подход - фоновые задания. Я думаю, что моя реализация или любая другая, можешь вам помочь. Но проще проверить, чем строить догадки. Пробуйте, а потом расскажите о результате :)
13. androgin 26.09.15 01:57 Сейчас в теме
(7) webdimon, тебе подойдут фоновые задания. они точно решат твою проблему.
На примере загрузки курсов валют посмотри )
10. ybatiaev 58 15.06.15 12:08 Сейчас в теме
Весьма наглядная конфигурация. И конкретно в помощь прямо сейчас! Автору респект!!!
11. ybatiaev 58 15.06.15 13:51 Сейчас в теме
сделал асинхронную функцию ЗапускПриложения() . Работает. Но никак не могу разораться как отследить её состояние :-(
в самой функции делаю архивацию баз данных с командной строки
12. rtnm 614 15.06.15 21:40 Сейчас в теме
(11) ybatiaev, нужно сделать следующие вещи:
1. в самой асинхронной функции/процедуре вызывать АсинхронныеВызовы.ОбновитьЗначениеХодаВыполнения и/или АсинхронныеВызовы.ДобавитьСообщениеХодаВыполнения
2. в форме реализовать экспортную процедуру обработчик хода выполнения
3. при запуске асинхронной функции/процедуры 3-им параметром передать ссылку на форму, а 5-ым имя обработчика хода выполнения

P.S. у всех функций программного интерфейса (т.е. находящихся в модуле АсинхронныеВызовы) есть описания, так что думаю разберетесь
ybatiaev; +1 Ответить
14. kozlovmv 24.01.16 16:13 Сейчас в теме
Уважаемый автор, испытывал ваши механизмы, запуском двух и более одновременных асинхронных вызовов. Мне показалось, что фактически они выполняются поочередно, в последовательности запуска.
Возможно ли достичь действительно параллельного выполнения?
15. rtnm 614 27.01.16 13:09 Сейчас в теме
(14) kozlovmv, у вас клиент-серверный или файловый вариант базы?
16. 1C_Extentions 56 23.01.17 17:32 Сейчас в теме
На вебклиенте такие асинхронные вызовы не проканают ?
18. starik-2005 3033 23.01.17 20:44 Сейчас в теме
Интересно, когда уже перестанут фоновое выполнение называть асинхронным? Да, оно, конечно, асинхронно, но т.к. callback-функцию приходится изображать с помощью обработчиков ожиданий, это не тру-асинхронность, которая подразумевается под самим этим понятием асинхронности. О как ))
TanyTany; +1 Ответить
19. baza1978 27.02.17 17:00 Сейчас в теме
Прикольная штука, реализовал на ней отправку всяческих почтовых уведомлений, когда чтото там не заполнено кем-то, от которых тащятся мои пользователи автору респект.

20. sorter1 50 31.10.17 10:59 Сейчас в теме
Добрый день коллеги
Никто не реализовывал закрытие всех фоновых заданий перед закрытием системы?

В том числе и зависших.
21. spezc 782 31.10.17 11:11 Сейчас в теме
(20) а что вы имеете ввиду под закрытием заданий? прерывание сессий? и перед каким закрытием системы - при любом случае, когда пользователь закрывает программу?
23. ybatiaev 58 01.11.17 01:04 Сейчас в теме
(20) Добрый день! Мы тоже боролись, боролись и пришли к выводу, что:
1. отключение, какое реализовано в 1С, работает только в клиент-серверном варианте, в файловом не работает вообще;
2. отключение в 1С 100% НЕ гарантирует прибитие сеансов. Не разобрались, но в консоли они видны. Скорее какой-то механизм стартуется на отключение;
3. прибитие сеансов в консоли, тоже не всегда приводит к нужному результату, поскольку фоновые задания настроены на определённое количество раз перезапуска;
4. Есть фоновые задания, которые запускаются вне описанных регламентных заданий со своим режимом перезапуска в случае аварийного завершения. Показалось, что индексируется данные порциями, т.е. даже если одна порция завершилась корректно, запускается следующая. Отключили полнотекстовый поиск и все, какие возможно, регламентные задания... пофигу... фоновые задания стартуются с завидным постоянством.

Что в итоге. написали некое расширение, которое завершает работу пользователя ИЗ ПОД САМОГО ПОЛЬЗОВАТЕЛЯ. Т.е. как бы сам пользователь себя закрывает. Ну вот кроме DefUser...
По крайней мере эта форма отключения корректнее, чем килять процессы в консоли.

P.S.
1. зависшие процессы не киляются;
2. Если у пользователя открылось окно с вопросом и висит, то корректно сам себя этот юзер закрыть не может;
3. Если у пользователя что-то выполняется, то закрытие произойдёт только после завершения выполнения какой-либо операции. Лучше, конечно, свои операции оборачивать в транзакцию.

Короче ещё тоже думаем.
adhocprog; +1 Ответить
22. sorter1 50 31.10.17 14:40 Сейчас в теме
да. закрытие всех открытых фоновых заданий.
в мобильном приложении - бывает зависает одно из заданий и грузит потом всю систему.
24. sorter1 50 01.11.17 09:31 Сейчас в теме
А у мобильного приложения (на текущей в данный момент версии)- оказывается вовсе - может одновременно выполняться только одно фоновое задание - и это официальная "фича". А остальные "встают в очередь". И наблюдаются бАльшие тормоза при запуске нескольких ФЗ
adhocprog; +1 Ответить
25. Алеся777 09.04.18 14:11 Сейчас в теме
Добрый день! Можете дать обработку скачать. Срочно нужно.
26. Алеся777 09.04.18 14:15 Сейчас в теме
Мне в пустой конфигурации, надо сделать обработку, которая будет делать запись в ркгистре сведений, не могу понять где это мне надо сделать, в общем модуле в фоне или на сервере до фона. Обработка должна быть асинхронной.
27. madonov 169 07.07.22 04:46 Сейчас в теме
ПодключитьОбработчикОжидания("ОбработчикПроверкиСостоянийАсинхронныхВызовов", ПериодичностьПроверкиСостоянийАсинхронныхВызовов);


В результате курсор на пол секунды моргает значком загрузки. И моргает каждую секунду до тех пор, пока асинхронный вызов не завершится.
Если операция длительная, то пользователя эти моргалки начинают раздражать. Есть способ обойтись без ПодключитьОбработчикОжидания?
28. ybatiaev 58 07.07.22 04:58 Сейчас в теме
(27) запустить фоновое задание. Это не приводит к периодическому морганию курсора и не мешает работе юзера. Так работают некоторые отчёты. Можно нажать копку [Сформировать] и делать другие дела. Сформированный ответ сам по себе будет делаться и встанет туда, куда надо. Его можно ПОТОМ посмотреть
29. madonov 169 07.07.22 05:09 Сейчас в теме
(28)

Я и вызываю фоновое задание через "АсинхронныеВызовы.ВызватьФункцию". Передаю в него название процедуры, которую нужно выполнить по его завершении - "ОбнаруженВходящийВызов". Фоновое задание может висеть и 10 минут и час, и даже весь день. Курсор при этом моргает, тк каждую секунду происходит проверка состояния фонового задания через обработчик ожидания:
ПодключитьОбработчикОжидания("ОбработчикПроверкиСостоянийАсинхронныхВызовов", ПериодичностьПроверкиСостоянийАсинхронныхВызовов);


&НаКлиенте
Процедура ПроверкаЗвонка()
	Параметрывызова = Новый Массив;
	Параметрывызова.Добавить(МойТелефон);
	Параметрывызова.Добавить(uniqueid);
	Параметрывызова.Добавить(АдресХранилищаРезультата_ПроверкаЗвонка);	
	
	Контекст = Новый Структура("ПроверкаВходящего", МойТелефон);
	ПоследнийАсинхронныйВызов = АсинхронныеВызовы.ВызватьФункцию("АсинхронныеОбработчики.ПроверкаЗвонкаНаСервереАсинхронно", 
																	Параметрывызова, 
																	ЭтаФорма, 
																	"ОбнаруженВходящийВызов",
																	,
																	Контекст);	
КонецПроцедуры


&НаКлиенте
Процедура ОбнаруженВходящийВызов(АсинхронныйВызов, Состояние, ВозвращенноеЗначение, ОписаниеОшибки) Экспорт
	
	Если Состояние = "Завершен" и не ВозвращенноеЗначение = Неопределено Тогда		
	МассивСтруктурЗвонки = ВозвращенноеЗначение.Массив;
	
	Если ЗначениеЗаполнено(МассивСтруктурЗвонки) Тогда
		Для Каждого Структура Из МассивСтруктурЗвонки Цикл			
			Если Не uniqueid = Структура.uniqueid Тогда
				uniqueid = Структура.uniqueid;
			Иначе
				Продолжить;
			КонецЕсли;
			
			Текст = "Входящий вызов " + Структура.connectedlinenum;
			ДействиеПриНажатии = Новый ОписаниеОповещения("НажатиеНаВходящийНомер", ЭтотОбъект, Структура.connectedlinenum);;
			Пояснение = "Нажмитие, чтобы открыть историю";
			КлючУникальности = Структура.uniqueid;		
			
			ПоказатьОповещениеПользователя(Текст, 
			ДействиеПриНажатии, 
			Пояснение, 
			БиблиотекаКартинок.ВызовВходящий, 
			СтатусОповещенияПользователя.Важное, 
			КлючУникальности);
					
		КонецЦикла;
	КонецЕсли;		
		
	ПроверкаЗвонка();
	
КонецПроцедуры
Показать
30. ybatiaev 58 07.07.22 05:14 Сейчас в теме
(29) вот прям сейчас не напишу точно, но подключитьОбработчикОжидания попробуйте заменить на оповещение. Тогда выполняемая процедура оповестит запускающую её только в момент окончания выполнения
31. madonov 169 07.07.22 05:24 Сейчас в теме
(30)
Спасибо. Пошел копать.
32. madonov 169 07.07.22 06:36 Сейчас в теме
(30)
Фоновое задание выполняется на сервере. Сервер не умеет "ВыполнитьОбработкуОповещения". Таким образом отловить завершение фонового задания через Оповещение невозможно =( .
33. ybatiaev 58 07.07.22 09:20 Сейчас в теме
(32) https://koder.by/asinhronnye_funkcii.php?ysclid=l5andcrri4403169354
Вот тут есть про ЖДАТЬ ещё. Думаю самое то. Но не проверял
34. madonov 169 08.07.22 02:34 Сейчас в теме
(33) Я уже это ковырял. И даже обновил платформу для проведения экспериментов.
Вся эта асинхронность работает только в рамках клиента. А проверка статуса фоновых заданий происходит на сервере.
Оставьте свое сообщение