4.7.8 Синхронные и асинхронные методы работы

Печать (Ctrl+P)

Общая информация

При работе с объектами, которые реализуют некоторую, достаточно специфичную (работа с файлами, блокирующими окнами, криптографией и внешними компонентами), функциональность, можно выделить два различных подхода: синхронный и асинхронный. Отличие в этих подходах определяется их названиями.
При синхронном подходе вызов какого-либо метода объекта приведет к тому, что работа вызывающего кода будет остановлена до тех пор, пока не завершится вызов метода объекта (со всеми вложенными вызовами). Обычный вызов процедуры или функции встроенного языка является синхронным вызовом.
При асинхронном подходе вызов метода объекта выполняется как обычно, но управление сразу возвращается вызывающему коду и его исполнение продолжается. При этом вызванный метод гарантирует, что после завершения своей работы он оповестит о своем завершении заинтересованное «лицо» (если такое оповещение требуется). Оповещение выполняется с помощью вызова специального метода, который передается в вызываемый
метод объекта. Все вышеописанное верно только для тех методов, для которых заявлена поддержка асинхронной работы.
В системе «1С:Предприятие» асинхронную технику можно использовать для работы:
1. С блокирующими окнами ;
2. Расширением работы с файлами ;
3. Расширением криптографии ;
4. Внешними компонентами .
Все варианты предполагают асинхронное использование только на стороне клиентского приложения. На стороне сервера по-прежнему доступны синхронные техники работы, за исключением работы с блокирующими окнами (по причинам их отсутствия на стороне сервера).
С точки зрения имен методов встроенного языка, асинхронные методы отличаются от синхронных тем, что имя асинхронного метода (как правило) начинается со слов Начать или Показать. Знание этой особенности позволит упростить поиск аналогов синхронных методов.
Рассмотрим организацию асинхронного вызова на примере отображения предупреждения. Для асинхронного вывода предупреждения используется метод ПоказатьПредупреждение(). Для того, чтобы сообщить о том, что диалог предупреждения закрыт, в этот метод передается описание оповещения. Описание оповещения содержит имя и месторасположения процедуры, которая будет вызвана системой после закрытия диалога.
Соответственно, метод ПоказатьПредупреждение() отличается от метода Предупреждение() тем, что в методе ПоказатьПредупреждение() существует еще
один параметр, через который и передается описание оповещения. Эта разница означает, что метод поддерживает асинхронную работу.
Пример:

&НаКлиенте
Процедура ВыполнитьКоманду(Команда)
ОбратныйВызов = Новый ОписаниеОповещения(“ПредупреждениеЗавершение”, ЭтотОбъект);
ПоказатьПредупреждение(ОбратныйВызов, “Закрытие формы обрабатывается отдельно”);
КонецПроцедуры
&НаКлиенте
Процедура ПредупреждениеЗавершение(ДополнительныеПараметры) Экспорт
// какие-то действия
КонецПроцедуры

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

&НаКлиенте
Процедура УдалитьВсеФайлыКаталога(ПутьККаталогу)
ОбратныйВызов = Новый ОписаниеОповещения(“УдалитьЗавершение”, ЭтотОбъект, , “УдалитьОшибка”, ЭтотОбъект);
НачатьУдалениеФайлов(ОбратныйВызов, ПутьККаталогу, ПолучитьМаскуВсеФайлыКлиента());
КонецПроцедуры
&НаКлиенте
Процедура УдалитьЗавершение(ДополнительныеПараметры) Экспорт
Сообщить(“Удаление успешно завершено”);
КонецПроцедуры
&НаКлиенте
Процедура УдалитьОшибка(ИнформацияОбОшибке, СтандартнаяОбработка, ДополнительныеПараметры) Экспорт
Сообщить(“При удалении обнаружена ошибка: ” + КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
КонецПроцедуры
В приведенной реализации есть одна особенность: если во время удаления файлов произойдет ошибка, то наряду с сообщением об ошибке в окне сообщений платформы, пользователь увидит также и системный диалог с сообщением об ошибке. В том случае, если системный диалог не нужен – следует в обработчике УдалитьОшибка() установить параметр СтандартнаяОбработка в значение Ложь.
Также следует учитывать, что указание обработчика ошибок в описании оповещения игнорируется при использовании асинхронных методов работы с блокирующими окнами.
Еще одной особенностью работы с асинхронными вызовами является их отладка. В данный момент отладчик умеет отлаживать действия, которые синхронно выполняются в предмете отладки (фактически, по инициативе отладчика).
В случае использования асинхронных вызовов асинхронный вызов выполняется в момент времени, отличный от фактического выполнения строки кода на встроенном языке, которая инициирует данный вызов. В связи с этим, если во время фактического исполнения асинхронного вызова в этом вызове случается ошибка, отладчик не может корректно определить состояние отлаживаемого приложения. Поэтому недоступна текущая строка исполнения, стек вызовов и так далее.

 Работа в веб-клиенте

Работа в веб-клиенте имеет некоторые особенности. Эти отличия вызваны особенностями реализации веб-браузеров (отсутствие поддержки модальных окон, синхронных вызовов, особенности модели безопасности).
Использование любой техники работы с файлами и криптографией  требует специальных расширений, установленных в используемом веб-браузере. Расширения для работы синхронной и асинхронных техник различаются. При использования веб-браузера Google Chrome, перед установкой расширений платформы, необходимо выполнить установку расширения веб-браузера Расширение для работы с 1С:Предприятием, которое устанавливается из Интернет-магазина Chrome (переход на страницу установки будет выполнен автоматически, при необходимости). Без установки этого расширения будет невозможно использование расширений платформы, предназначенных для использования асинхронных способов работы.
Необходимо помнить, что поддержка синхронных вызовов в веб-браузере Google Chrome по умолчанию отключена в версии 42 (апрель 2015 года), а в версии 45 (сентябрь 2015 года) будет полностью удалена. Веб-браузер Mozilla Firefox не поддерживает синхронные вызовы в веб-браузере начиная с версии 43 (декабрь 2015 года). При этом синхронные методы во встроенном языке (в веб-клиенте) также перестанут работать, несмотря на то, что сама платформа поддерживает эти вызовы.
При разработке прикладных решений рекомендуется использовать асинхронные способы работы с блокирующими диалогами, файлами, криптографией и внешними компонентами, т. к. использование синхронных методов (даже с использованием соответствующих расширений) может приводить к проблемам при работе в современных веб-браузерах.
Для работы с расширениями необходимо:

  1. Соответствующим образом настроить веб-браузер
  2. Расширение работы с файлами:
    ● Установить расширение – с помощью метода начатьУстановкуРасширенияРаботыСФайлами() или УстановитьРасширениеРаботыСФайлами(). Это интерактивное действие, которое необходимо выполнить один раз для каждого пользователя локального компьютера, использующего
    ● Подключить расширение – с помощью метода НачатьПодключениеРасширенияРаботыСФайлами() или ПодключитьРасширениеРаботыСФайлами().
  3. Расширение работы с криптографией:
    ● Установить расширение – с помощью метода НачатьУстановкуРасширенияРаботыСКриптографией() или
    УстановитьРасширениеРаботыСКриптографией(). Это интерактивное действие, которое необходимо выполнить один раз для каждого пользователя локального компьютера, использующего расширение.
    ● Подключить расширение – с помощью метода НачатьПодключениеРасширенияРаботыСКриптографией() или
    ПодключитьРасширениеРаботыСКриптографией().
  4. Внешние компоненты – более подробно о работе с внешними компонентами написано в другой главе.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *