Реализовано в версии 8.3.5.1383, 8.3.6.1977.
Содержание
Современные тенденции
Тенденции развития браузеров приводят к тому, что в платформе всё больше увеличивается процент «асинхронности». Первым шагом был отказ от модальности. Теперь появились асинхронные вызовы для работы с расширениями криптографии, работы с файлами и внешними компонентами.
Причиной очередного движения в сторону асинхронности явилось то, что разработчики браузера Google Chrome отказались от поддержки прежней технологии NPAPI (Netscape Plugin Application Programming Interface). Эта технология использовалась для подключения к браузеру внешних модулей — расширений.
Такие расширения как раз использует 1С:Предприятие для работы с криптографией, для работы с файлами и для подключения внешних компонентов. Это довольно важная функциональность. Криптография используется в электронном документообороте, а благодаря внешним компонентам приложения могут работать со сканерами штрих-кодов и другим торговым оборудованием.
И вот теперь, вместо прежней, синхронной технологии NPAPI, разработчики Google Chrome создали новую технологию Native Messaging. При этом они настоятельно рекомендовали всем разработчикам расширений не использовать старую технологию, потому что она поддерживаться не будет.
Если не вдаваться в подробности, то новая технология лучше и безопаснее. Это хорошо. Но одним из её значительных отличий является то, что она предусматривает исключительно асинхронное взаимодействие с расширениями браузера. А это требует кардинального изменения всех существующих в 1С:Предприятии методов работы с расширениями и внешними компонентами. Потому что все они основаны на синхронном взаимодействии.
Асинхронные методы
Мы решили эту проблему так же, как и проблему модальных вызовов. Для всех синхронных методов, использующих технологию NPAPI, мы создали их асинхронные аналоги. В основном они отличаются наличием приставки Начать и тем, что первым параметром им передаётся ОписаниеОповещения, с которого будет продолжено исполнение программного кода после завершения вызванного действия.
Например, вместо метода Зашифровать() теперь мы рекомендуем использовать метод НачатьШифрование():
Вместо метода ПолучитьФайлы() — НачатьПолучениеФайлов():
Вместо УстановитьВнешнююКомпоненту() — НачатьУстановкуВнешнейКомпоненты():
И так далее. Полный список новых асинхронных методов и их соответствие старым методам вы найдёте в файле V8Update.htm (который поставляется вместе с платформой), в документации и в синтакс-помощнике.
По сути, по большому счёту, всё очень похоже на то, что мы делали раньше, когда избавлялись от модальности. Но функционирование новых асинхронных методов имеет существенную особенность, которой нет у методов, вызывающих немодальные диалоги.
При асинхронном вызове немодального диалога мы ожидаем только некоторую реакцию пользователя, и больше ничего. В том смысле, что ничего непредвиденного случиться не может.
А в процессе вызова асинхронных методов работы с расширениями и компонентами могут возникать исключительные ситуации. Расширение не установилось, компонента не загрузилась и т.д.
Обработку таких исключительных ситуаций вы обычно предусматриваете в прикладном коде. С помощью оператора Попытка . Исключение. Но теперь это становится невозможным, потому что в момент асинхронного вызова код приложения не выполняется. Соответственно не работает оператор Попытка . Исключение.
Для решения этой проблемы мы добавили в объект ОписаниеОповещения два необязательных свойства:
- ИмяПроцедурыОбработкиОшибки;
- МодульОбработкиОшибки.
Если в процессе асинхронного вызова «что-то пойдёт не так» и возникнет исключительная ситуация, то будет выполнена процедура, на которую указывают эти свойства. Эти два свойства имеет смысл использовать только в асинхронных методах работы с расширениями. При вызове немодальных диалогов эти свойства вам не нужны.
Свойство конфигурации
Как и в случае отказа от модальности, всё прикладное решение в целом должно знать, «какое оно». Либо оно модальное, либо немодальное. Либо оно синхронное, либо асинхронное.
Раньше, для решения вопроса с модальностью, мы добавили конфигурации специальное свойство Режим использования модальности. Теперь, для решения вопроса с синхронностью, мы добавили ей аналогичное по смыслу свойство Режим использования синхронных вызовов расширений и внешних компонент.
Суть его использования заключается в следующем:
- Не использовать — это новый, асинхронный режим работы. Для новых конфигураций это стандартный режим. Использование старых, синхронных методов запрещено. Они не проходят синтаксический контроль, их нет в контекстной подсказке. Попытка выполнить синхронный метод вызывает исключение.
- Использовать с предупреждением — этот режим предназначен для разработчика. Он не препятствует использованию старых, синхронных методов. Но каждый раз, когда на клиенте вызывается синхронный метод, выдаёт предупреждающее сообщение. Этот режим мы рекомендуем использовать в «перерабатываемых» конфигурациях. Он удобен для визуального поиска синхронных вызовов и их контроля в процессе доработки.
- Использовать — режим, обеспечивающий совместимость новой версии платформы со старыми конфигурациями, использующими синхронные методы для работы с расширениями и внешними компонентами.
Все методы и свойства, о которых мы говорили до сих пор, реализованы в версии 8.3.5.1383. Вы можете использовать их в своих прикладных решениях. А разработчики БСП, например, переведут на асинхронную работу подсистемы, использующие средства криптографии, работы с файлами и внешние компоненты.
Естественно, как и в случае с модальными вызовами, у вас наверняка возникает вопрос. А надо ли мне переделывать своё прикладное решение? И вообще, надо ли мне использовать эти асинхронные методы в моём новом прикладном решении?
Когда это нужно?
Ответ на этот вопрос, по сути, такой же, какой мы давали раньше. Когда рассказывали об отказе от модальности.
Во-первых, не любая версия технологической платформы поддерживает режим асинхронных вызовов расширений и внешних компонентов. Этот режим работы существует, начиная с версии 8.3.5.1383. Поэтому, если вы работаете на младших версиях платформы, можете пока не озадачиваться отказом от синхронных методов.
Во-вторых, не все прикладные решения в обязательном порядке должны использовать этот режим. Критичными являются приложения, работа с которыми будет вестись с помощью веб-клиента в браузере Google Chrome. Такими приложениями, в большой массе, являются приложения, работающие в модели сервиса. Если ваше прикладное решение заведомо не будет использоваться в этом режиме, вы можете пока не отказываться от синхронных методов.
Однако, несмотря на первый и второй пункты, есть глобальные тенденции, которые могут повлиять на ваши планы. Мы, фирма 1С, разрабатываем все типовые решения исходя из того, что они могут использоваться любым из доступных способов. Поэтому новые прикладные решения, а так же все библиотеки, используемые в них, мы будем реализовывать в режиме без использования синхронных вызовов.
А значит, этот режим работы вам лучше начать осваивать уже сейчас. Даже если ваше приложение пока может его не использовать, мы рекомендуем, по возможности, начать перевод уже сейчас. При этом мы рекомендуем вам подходить к этому процессу творчески. В том же русле, что и при отказе от модальности. То есть не нужно механически заменять синхронные методы асинхронными. Сначала полезно подумать о том, а можно ли изменить алгоритм, сценарий так, чтобы в этом месте вообще отказаться от использования синхронных методов?
Рефакторинг
С одной стороны, если конфигурация большая и синхронных вызовов в ней много, то «ручная» переделка такой конфигурации может оказаться очень трудоёмкой задачей.
С другой стороны, начиная с версии 8.3.5.1068, в платформе существуют инструменты, позволяющие преобразовывать синхронные вызовы в их асинхронные аналоги.
Поэтому мы взяли эти, уже имеющиеся, инструменты, расширили их, и переориентировали с «ухода от модальности» на «переход к асинхронности». По своей сути переход на асинхронные методы аналогичен тем действиям, которые выполняются при отказе от модальности. Старые, «не модные», синхронные (модальные) вызовы нужно заменить новыми, «модными», асинхронными вызовами, использующими ОбработкуОповещения.
В таком, обновлённом виде инструменты рефакторинга стали доступны вам в версии 8.3.6.1977.
Поскольку «акцент» этих инструментов сместился в сторону асинхронности, мы переименовали некоторые команды. Вместо слова «немодальные» теперь используется фраза «нерекомендуемые синхронные»:
Кроме этого в настройки конфигуратора мы добавили новую закладку Рефакторинг. Стандартно на ней включены оба преобразования. Но, если вам это нужно, с её помощью вы можете выполнять только один из видов преобразований при автоматическом рефакторинге:
Для работы с объектами, реализующими функциональность определенного рода (работа с файлами, блокирующие окна, внешние компоненты и криптография), существует два метода работы — синхронный и асинхронный. В этой статье я попробую рассказать о том, что это за методы, для чего они нужны и как с этим работать.
Общая информация
Зачем это нужно?
Изначально расширения для работы с файлами и криптографией в веб-клиенте были реализованы по технологии NPAPI и работа с методами расширений была синхронной. Затем браузер Google Chrome отказался от поддержки этой технологии (полностью удалена в версии 45 от сентября 2015). Решением проблемы стал перевод расширений для работы с файлами и криптографией на асинхронные рельсы.
У конфигураций появилось новое свойство в разделе «Совместимость»:
Свойство конфигурации
А при использовании синхронных методов, там где это не разрешается, можно увидеть такое сообщение:
Использование синхронных методов запрещено
В чем разница?
В синхронном подходе при вызове какого-либо метода объекта управление передается этому методу, а вызвавший его код приостанавливается и терпеливо дожидается завершения работы метода (со всеми вложенными вызовами). Нужно отметить, что все процедуры и функции встроенного языка работают как синхронные вызовы.
При асинхронном подходе после вызова метода объекта управление возвращается вызывающему коду и его исполнение продолжается, параллельно с исполнением кода вызванного метода. При этом вызванный метод гарантирует, что оповестит о завершении своей работы «заинтересованное лицо», если такое оповещение требуется. Само оповещение осуществляется вызовом специального метода, который передается в вызываемый метод объекта. Асинхронный подход допустим только для тех методов, для которых заявлена поддержка асинхронной работы.
Названия асинхронных методов обычно начинаются со слов «Начать» (например, «ЭтоФайл» и «НачатьПроверкуЭтоФайл») или «Показать» (например, «Вопрос» и «ПоказатьВопрос»), это знание может помочь в поиске асинхронного аналога синхронного метода.
Напомню, что асинхронную технику можно использовать для работы с:
- блокирующими окнами;
- файлами;
- расширением криптографии;
- внешними компонентами.
Нужно отметить, что все асинхронные методы доступны только на стороне клиентского приложения. На сервере же по-прежнему доступны только синхронные методы (за исключением блокирующих окон — они на сервере вообще отсутствуют).
Соответствие синхронных методов асинхронным аналогам (на момент написания статьи) можно посмотреть тут.
Практические примеры
В качестве практических примеров рассмотрим работу с асинхронными методами и особенности работы в веб-клиенте. Работу с блокирующими окнами рассматривать не будем, так как про это у меня есть отдельная статья. Кроме это, напомню, что при переводе прикладных решений на асинхронный режим работы могут помочь инструменты рефакторинга, о которых также имеется отдельная статья.
Асинхронные методы
Рассмотрим на примере асинхронного метода глобального контекста — НачатьПоискФайлов.
В 1С есть возможность использования встроенных асинхронных вызовов с помощью описания оповещения. Мне необходимо "обернуть" несколько асинхронных вызовов в один свой, так чтобы со стороны основного кода выполнялся всего один такой вызов.
Можно ли создать свои асинхронные методы и как?
2 ответа 2
Доброго времени суток, платформа «1С:Предприятие 8» не дает возможности реализовывать свои асинхронные процедуры и функции. Реализовать асинхронную обработку ("обернуть"), все-таки, возможность есть, с помощью процедуры:
Этот метод используется для того, чтобы выполнить процедуру обработчика оповещения. Чтобы указать на этот обработчик, в метод передаётся описание оповещения.
Этот метод требуется в сложных «многоуровневых» алгоритмах асинхронных вызовов, так как описание оповещения может быть сконструировано в начале алгоритма, а реальное использование этого обработчика может понадобиться через несколько вложенных процедур. Пример:
Вопрос во вложенной процедуре, после которой есть код
Рассмотрим более сложный случай, когда после вызова вложенной функции выполнятся некоторый код. Например, так:
Казалось бы, следуя рекомендациям, надо просто заменить вложенную процедуру двумя процедурами:
Однако в этом случае алгоритм, следующий за вызовом вложенной процедуры, будет выполнен ещё до того, как пользователь ответит на вопрос. Ведь, как мы знаем, исполнение кода не останавливается после выполнения блокирующего метода (Сравнение модального и немодального режимов работы):
Поэтому в такой ситуации нужно не только использовать блокирующий метод с вызовом оповещения, но ещё и выполнять асинхронный вызов самой вложенной процедуры, также используя оповещение:
Здесь во вложенную процедуру мы сразу передаём описание оповещения, в котором содержится тот код, который должен быть выполнен после вложенной процедуры (последняя процедура). Вызывая блокирующий метод, мы передаём ему «его» описание оповещения (ВложеннаяПроцедураЗавершение), а также, через дополнительные параметры, то описание оповещения, которое нужно будет выполнить после того, как будут обработаны интерактивные действия пользователя (ОбработкаКомандыЗавершение).
P.S. Необходимо помнить, что при работе с синхронными вызовами значения передаются по Ссылке (в синхронные процедуры и функции), а при асинхронных вызовах по Значению . Пример:
Вопрос в обработчике формы ПередЗакрытием
Особенность диалога с пользователем в этом (и многих других) обработчиках заключается в том, что в зависимости от реакции пользователя принимается решение: продолжать дальнейшие действия, или отказаться от них. Для этого используется параметр процедуры Отказ. При одном ответе пользователя мы отказываемся от продолжения (Отказ = Истина). При другом ответе пользователя — продолжаем дальнейшие действия.
В данном случае сложность заключается в том, что ответ пользователя мы узнаем уже после того, как выйдем из контекста этого обработчика. В процедуре, обрабатывающей оповещение. А параметр Отказ нужно установить именно в этом обработчике.
Поэтому мы действуем в два приёма:
В первый раз безусловно отменяем дальнейшие действия (Отказ = Истина) и выводим вопрос пользователю; В обработчике оповещения, в зависимости от реакции пользователя, либо снова программно закрываем форму, либо ничего не делаем. Проблема заключается в том, что обработчик ПередЗакрытием будет выполнен два раза. И чтобы отличить первое его выполнение от второго (когда ответ пользователя уже известен) мы используем клиентскую переменную ВыполняетсяЗакрытие в качестве флага.
В первый проход её значение равно Ложь, и это значит, что нужно отказаться от закрытия и задать вопрос. Во второй проход её значение равно Истина, и это значит, что вопрос задавать не надо: