Страницы: 1 2 След.
RSS
Функционирование асинхронной функции
 
.
Изменено: BIN - 24.03.2023 13:07:45
 
Понятно, что для вызова диалога выбора файла нужно использовать асинхронные методы. Но все же, какой метод лучше использовать: Диалог.Показать(Оповещение) или Диалог. ВыбратьАсинх()? Зачем столько методов для одного и того же?
 
Цитата
Екатерина написал:
Понятно, что для вызова диалога выбора файла нужно использовать асинхронные методы. Но все же, какой метод лучше использовать: Диалог.Показать(Оповещение) или Диалог. ВыбратьАсинх()? Зачем столько методов для одного и того же?
Исторически первыми в 1С появились асинхронные методы вида «Показать», которые используют оповещение. Их еще называют  методами «обратного вызова», где объект ОписаниеОповещения как раз и используется для организации обратного вызова. ОписаниеОповещения позволяет оповестить «основной» программный код (тот, который вызвал асинхронную функцию) о завершении вызова и предоставляет основному коду результаты этого вызова.

Относительно недавно (начиная с платформы 8.3.18) во встроенный язык были добавлены методы вида «Асинх». Их основное преимущество заключается в более простой структуре и наглядности самого программного кода. Если в методах обратного вызова программный код фрагментирован: есть Основная процедура, вызывающая асинхронный метод, а есть дополнительная, в которой этот асинхронный метод реализован. Это усложняет восприятие программного кода разработчиком, тем более, что асинхронная функция может располагаться по тексту далеко от основной функции и даже может быть вынесена в другой модуль. С этой точки зрения «Асинх» методы нагляднее: располагаются в одной процедуре, операторы выполняются последовательно – такая же простота восприятия кода, как и для синхронных методов.

Для пользователя никакой разницы не будет, от того, какой асинхронный методы вы используете: «Показать» или «Асинх».

 
Цитата
Игорь Борисенко написал:
Цитата
Екатерина написал:
Понятно, что для вызова диалога выбора файла нужно использовать асинхронные методы. Но все же, какой метод лучше использовать: Диалог.Показать(Оповещение) или Диалог. ВыбратьАсинх()? Зачем столько методов для одного и того же?
Исторически первыми в 1С появились асинхронные методы вида «Показать», которые используют оповещение. Их еще называют  методами «обратного вызова», где объект ОписаниеОповещения как раз и используется для организации обратного вызова. ОписаниеОповещения позволяет оповестить «основной» программный код (тот, который вызвал асинхронную функцию) о завершении вызова и предоставляет основному коду результаты этого вызова. Относительно недавно (начиная с платформы 8.3.18) во встроенный язык были добавлены методы вида «Асинх». Их основное преимущество заключается в более простой структуре и наглядности самого программного кода. Если в методах обратного вызова программный код фрагментирован: есть Основная процедура, вызывающая асинхронный метод, а есть дополнительная, в которой этот асинхронный метод реализован. Это усложняет восприятие программного кода разработчиком, тем более, что асинхронная функция может располагаться по тексту далеко от основной функции и даже может быть вынесена в другой модуль. С этой точки зрения «Асинх» методы нагляднее: располагаются в одной процедуре, операторы выполняются последовательно – такая же простота восприятия кода, как и для синхронных методов.  Для пользователя никакой разницы не будет, от того, какой асинхронный методы вы используете: «Показать» или «Асинх».

Т.е. методы «Показать» - это старая технология, сохраненная для совместимости, а «Асинх» новая, ее и следует далее использовать?

 
Цитата
Екатерина написал:
Цитата
Игорь Борисенко написал:
 
Цитата
Екатерина  написал:
Понятно, что для вызова диалога выбора файла нужно использовать асинхронные методы. Но все же, какой метод лучше использовать: Диалог.Показать(Оповещение) или Диалог. ВыбратьАсинх()? Зачем столько методов для одного и того же?
 Исторически первыми в 1С появились асинхронные методы вида «Показать», которые используют оповещение. Их еще называют  методами «обратного вызова», где объект ОписаниеОповещения как раз и используется для организации обратного вызова. ОписаниеОповещения позволяет оповестить «основной» программный код (тот, который вызвал асинхронную функцию) о завершении вызова и предоставляет основному коду результаты этого вызова. Относительно недавно (начиная с платформы 8.3.18) во встроенный язык были добавлены методы вида «Асинх». Их основное преимущество заключается в более простой структуре и наглядности самого программного кода. Если в методах обратного вызова программный код фрагментирован: есть Основная процедура, вызывающая асинхронный метод, а есть дополнительная, в которой этот асинхронный метод реализован. Это усложняет восприятие программного кода разработчиком, тем более, что асинхронная функция может располагаться по тексту далеко от основной функции и даже может быть вынесена в другой модуль. С этой точки зрения «Асинх» методы нагляднее: располагаются в одной процедуре, операторы выполняются последовательно – такая же простота восприятия кода, как и для синхронных методов.  Для пользователя никакой разницы не будет, от того, какой асинхронный методы вы используете: «Показать» или «Асинх».
 Т.е. методы «Показать» - это старая технология, сохраненная для совместимости, а «Асинх» новая, ее и следует далее использовать?

«Старая», «новая» - да.

Но я бы не стал списывать со счетов методы «Показать», они более универсальны. Например, у «Асинх» методов есть одно ограничение: если в такой асинхронной функции возникло исключение, то его нельзя будет перехватить и как-то обработать; оно сразу будет показано пользователю, например ошибка «Деление на 0». Или возможность методов вида «Показать» располагать обработчик оповещения в другом модуле в некоторых случаях может быть удобным.

 

Есть какой-нибудь способ поработать с исключениями в асинхронной функции?

 

Если используется используется функция с модификатором Асинх, то можно обернуть оператор «Ждать» в «Попытку»:

Попытка

              Результат = Ждать АсинхроннаяФункция();

Исключение

              //Обработка исключения

КонецПопытки;

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

Если же используете асинхронную функцию с обратным вызовом, то там нет никаких ограничений по перехвату и обработке исключений.

 

.

Изменено: BIN - 23.03.2023 18:14:37
 

Использую «Ждать» для выбора файла, код такой: «Ждать Диалог.ВыбратьАсинх();». Как из него получить результат выбора?

 
Цитата
Екатерина написал:
Использую «Ждать» для выбора файла, код такой: «Ждать Диалог.ВыбратьАсинх();». Как из него получить результат выбора?  

Оператор «Ждать» как раз и возвращает результат. Его нужно просто присвоить переменной, т.е. записать примерно так: масФайлов = Ждать Диалог.ВыбратьАсинх().

Результатом работы асинхронной функции, в вашем примере это Диалог.ВыбратьАсинх(), является объект типа «Обещание». Если асинхронная функция отработала штатно (обещание находится в состоянии «Завершено успешно»), то она вернет результат своей работы, в вашем примере это массив выбранных файлов, либо «Неопределено», если пользователь отказался от выбора файла. Если же при выполнении асинхронной функции возникла ошибка (обещание находится в состоянии “Завершено с ошибкой”), то эта функция вернет Исключение.

Оператор «Ждать» выполняет ожидание завершения работы асинхронной функции и принимает от нее результат ее работы, который можно присвоить переменной и использовать дальше в основном коде.

Страницы: 1 2 След.