1с открыть форму асинхронно

SearchSiteYes

1С 8.3 Асинхронные функции

Попытка
ВыполнениеКода ();
Исключение
// Исключение из ВыполнениеКода() не будет перехвачено здесь
КонецПопытки

Асинх Функция ВыполнениеКода () // Всегда возвращает Обещание

ВызватьИсключение «Выброшено в ВыполнениеКода()» ;
//При успешном завершении в Обещание будет завернуто значение, которое было аргументом оператора Возврат.
//Если при выполнении Асинх функции произошло исключение, то в Обещание будет завернуто это исключение.

Асинх Процедура ВыполнениеПримераСАсих ()

Попытка
// Для того, чтобы узнать как завершилась Асинх функция – это использовать возвращенное ею Обещание как аргумент оператора Ждать.
Ждать ВыполнениеКода (Null);
Исключение
// Исключение из НеNull() будет перехвачено здесь
Сообщить ( «Передали Null» );
КонецПопытки

Асинх Функция ВыполнениеКода ( ПеремП ) // Всегда возвращает Обещание

Если ПеремП = Null Тогда
ВызватьИсключение «Выброшено в ВыполнениеКода()» ;
Иначе
Возврат ПеремП ;
КонецЕсли;

// Асинх процедура не возвращает значения. А если при выполнении Асинх процедуры возникнет не перехваченное исключение,
// то это приведет к выдаче сообщения об ошибке.

&НаКлиенте
Асинх Процедура АсинхКопироватьФайлы ( Команда )

&НаКлиенте
Асинх Процедура АсинхКопироватьФайлы ( Команда )

Источник

Асинхронные методы, Обещания, Асинх/Ждать, ОписаниеОповещения в 1С

reklama http

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

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

Пример синхронного выполнения:

Сообщение «Окончание процедуры» выведется только после выполнения процедуры СинхронныйМетод, потому что при вызове данной процедуры основной поток был заблокирован, пока не будет выполнена вызванная процедура.

Асинхронные методы не блокируют основной поток. Асинхронность в 1С реализуется с помощью очереди асинхронных задач. Основной поток выполняет задачи из этой очереди, как только сможет это сделать. Важно понимать, что асинхронность это не многопоточность. Многопоточность в 1С реализуется с помощью других механизмов.

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

Пример асинхронного выполнения в 1С:

В примере выше сначала будет выведено сообщение «Окончание процедуры», а только потом сообщение «асинхронный метод». Так происходит, потому что сразу после вызова функции АсинхронныйМетод продолжилось выполнение кода.

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

В нашем примере использовать асинхронность через Обещания, но 1С поддерживает два варианта асинхронности:

ОписаниеОповещения

Асинхронность через обратные вызовы реализована в 1С с помощью объекта встроенного языка ОписаниеОповещения. Сам термин обратный вызов (call back) называется так, потому что мы сначала передаем ссылку на метод в асинхронную процедуру или функцию, а после выполнения асинхронной процедуры выполняется обратный вызов переданного метода.

Процедуры обратного вызова могут быть только на клиенте, обязательно со словом Экспорт, только в модуле формы, модуле команды или в общем модуле.

В данном примере мы сначала создаем объект встроенного языка ОписаниеОповещения. Первым параметром передаем название процедуры, которая будет вызвана после завершения асинхронного метода. Вторым — модуль, где находится данная процедура. Так как мы находимся в модуле формы и процедура обратного вызова будет расположена здесь же, то нужно указать ЭтотОбъект. Затем методом ПоказатьПредупреждение показываем пользователю предупреждение с кнопкой «ОК»:

predupregdenie

Сразу после показа окна с предупреждением внизу будет показано сообщение «Завершение процедуры», а после нажатия на кнопку «ОК» будет выполнен обратный вызов процедуры ОбратныйВызов, которая покажет сообщение «Нажали ОК».

При использовании синхронного аналога Предупреждение основной поток был бы заблокирован до нажатия на кнопку «ОК».

Асинхронность через обещания

Обещание

Обещание — это обертка над результатом асинхронной функции. Асинхронная функция всегда возвращает объект Обещание. Обещание — это обычный объект встроенного языка 1С, его можно присвоить какой-то переменной, можно передать через параметры в другую процедуру или функцию. Но обещание нельзя передавать на сервер. Также обещание нельзя создать через конструктор, его можно получить только как результат асинхронной функции.

Объект обещание может иметь 3 состояния:

Оператор Ждать

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

Источник

Заметки из Зазеркалья

Данная статья является анонсом новой функциональности.
Не рекомендуется использовать содержание данной статьи для освоения новой функциональности.
Полное описание новой функциональности будет приведено в документации к соответствующей версии.
Полный список изменений в новой версии приводится в файле v8Update.htm.

Реализовано в версии 8.3.18.1128

Спустя некоторое время после появления в платформе 1С:Предприятие веб-клиента возникла необходимость в поддержке асинхронной модели работы, которая в то время появилась в браузерах. Эта поддержка была реализована с использованием типа ОписаниеОповещения (NotifyDescription ) и новых на то время асинхронных процедур.

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

Наиболее близким аналогом того, что добавлено по части асинхронности в 1С:Предприятие, является тип Promise и конструкции async/await языка JavaScript, введенные в стандартах ECMAScript 6 и ECMASript 2017, соответственно.

Асинх ронные методы остаются доступными только там, где они были доступны и раньше. Сама суть асинхронности, как она уже реализована в 1С:Предприятии, не меняется. Речь идет о новой форме работы с асинхронностью.

Далее будут рассмотрены составные части новой механики, а кроме того некоторые особенности и типовые приемы.

Составные части

Можно сказать, что новая форма работы с асинхронностью включает три составные части:

Рассмотрим эти составляющие.

Тип Promise/Обещание

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

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

В соответствии с этим объект типа Обещание может находиться в одном из трех состояний:

Практически любое Обещание начинает свое существование в состоянии Pending. Затем, в зависимости от того, как завершится асинхронная функция, Обещание может перейти в состояние Success или Failure. И, если Обещание перешло в состояние Success или Failure, то в этом состоянии оно и останется до конца жизни.

«Новые» асинхронные функции платформы

У «старых» асинхронных процедур зачастую имелись прототипы в виде синхронных процедур или функций, на основании которых они были созданы.

Рассмотрим на примере.

В платформе 1С:Предприятие 8 имеется синхронная функция КопироватьФайл (СоpyFile), описание которой выглядит следующим образом:

Данный метод доступен повсеместно. Но на клиенте использование синхронных методов может быть запрещено. Начиная с версии 8.3.6, в платформе появилась асинхронная процедура НачатьКопированиеФайла (BeginCopyingFile) со следующим описанием:

И, наконец, в версии 8.3.18 добавляется «новая» асинхронная функция КопироватьФайлАсинх / CopyFileAsync) :

После успешного завершения копирования файла Обещание будет содержать путь к скопированному файлу. В случае ошибки Обещание будет содержать исключение.

На приведенном примере заметно, что по ряду признаков «новая» асинхронная функция имеет больше сходства с синхронным аналогом, чем со «старой» асинхронной процедурой. В частности, у «новой» асинхронной функции тот же список параметров, что и у синхронной процедуры. Да и имя новой асинхронной процедуры образовано простым добавлением суффикса Асинх / Async к имени синхронной процедуры.

Асинх и Ждать

Асинх / Async представляет собой модификатор, который может применяться к процедуре или функции, написанной на встроенном языке. Использование данного модификатора делает процедуру или функцию асинхронной. Важной особенностью является также то, что оператор Ждать может использоваться только внутри Асинх процедур/функций.

Таким образом, в результате выполнения

Рез = Ждать Об; // Об имеет тип Обещание

может получиться одно из двух:

Рассмотрим некоторые особенности Асинх процедур и функций.

Передача параметров по значению

Таким образом, заголовки функции

Асинх Функция КопироватьФайлыАсинх(ИсхКаталог, ЦелКаталог)
Асинх Функция КопироватьФайлыАсинх(Знач ИсхКаталог, Знач ЦелКаталог)

Асинх Функция всегда возвращает Обещание

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

Процедура П()
Попытка
Функ1();
Исключение
// Исключение из Функ1() не будет перехвачено здесь
КонецПопытки
КонецПроцедуры

Асинх Функция Функ1()
ВызватьИсключение «Выброшено в Функ1()»;
КонецФункции

Асинх Процедура П()
Попытка
Ждать НеNull(Null);
Исключение
// Исключение из НеNull() будет перехвачено здесь
Сообщить(«Передали Null»);
КонецПопытки
КонецПроцедуры

Асинх Функция НеNull(П)
Если П = Null Тогда
ВызватьИсключение «Выброшено в Функ1()»;
Иначе
Возврат П;
КонецЕсли;
КонецФункции

Асинх Процедура ничего не возвращает

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

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

Пример применения

Теперь посмотрим, как использование новых возможностей работы с асинхронностью может выглядеть на практике. Представим, что нам надо разработать форму для копирования файлов из одного каталога на клиентском компьютере в другой. Для простоты полагаем, что копироваться должны только файлы, непосредственно находящиеся в исходном каталоге. Для хранения и редактирования путей к каталогам форма включает два реквизита типа Строка : ИсходныйКаталог и ЦелевойКаталог. Выполнение копирования вызывается командой КопироватьФайлы.

Для начала напишем модуль формы с использованием синхронных методов платформы, в расчете на то, что использование синхронных методов на клиенте не запрещено.

&НаКлиенте
Процедура КопироватьФайлы(Команда)
Попытка
КопироватьФайлыСинх(ИсходныйКаталог, ЦелевойКаталог);
Исключение
Инф = ИнформацияОбОшибке();
ПредупреждениеАсинх(«Произошла ошибка: » + Инф.Описание);
КонецПопытки
КонецПроцедуры

Для Каждого Файл Из Файлы Цикл
ИсхФайл = ИсхКаталог + «/» + Файл.Имя;
ЦелФайл = ЦелКаталог + «/» + Файл.Имя;
КопироватьФайл(ИсхФайл, ЦелФайл);
КонецЦикла;
КонецПроцедуры

В приведенном фрагменте модуля процедура КопироватьФайлы() является обработчиком команды КопироватьФайлы. Само копирование файлов выполняется процедурой КопироватьФайлыСинх(). Для поиска копируемых файлов используется синхронная функция платформы НайтиФайлы(), а для копирования каждого из найденных файлов – процедура платформы КопироватьФайл(). В процедуре КопироватьФайлы() производится перехват и обработка исключений, которые могут вылететь из КопироватьФайлыСинх().

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

&НаКлиенте
Асинх Процедура КопироватьФайлы(Команда)
Попытка
Ждать КопироватьФайлыАсинх(ИсходныйКаталог, ЦелевойКаталог); //1
Исключение
Инф = ИнформацияОбОшибке();
ПредупреждениеАсинх(«Произошла ошибка: » + Инф.Описание);
КонецПопытки
КонецПроцедуры

Для Каждого Файл Из Файлы Цикл
ИсхФайл = ИсхКаталог + «/» + Файл.Имя;
ЦелФайл = ЦелКаталог + «/» + Файл.Имя;
Ждать КопироватьФайлАсинх(ИсхФайл, ЦелФайл); //3
КонецЦикла;
КонецФункции

Внешнее сходство между «синхронным» и «асинхронным» модулями трудно не заметить. Сосредоточимся на различиях. В асинхронном варианте фактическое копирование файлов выполняет

Асинх Функция КопироватьФайлыАсинх(ИсхКаталог, ЦелКаталог)
Ждать КопироватьФайлыАсинх(ИсходныйКаталог, ЦелевойКаталог); //1
Файлы = Ждать НайтиФайлыАсинх(ИсхКаталог, «*», Ложь); //2
Ждать КопироватьФайл Асинх (ИсхФайл, ЦелФайл); //3

также никуда не присваивается. В данной точке кода надо просто дождаться завершения копирования файла и выбросить исключение, если при выполнении КопироватьФайлАсинх() произошла ошибка.

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

Усовершенствованный модуль формы может выглядеть следующим образом:

&НаКлиенте
Асинх Процедура КопироватьФайлы(Команда)
Попытка
Сч = Ждать КопироватьФайлы Асинх (ИсходныйКаталог, ЦелевойКаталог); //1
Сообщить(«Скопировано файлов: » + Сч);
Исключение
Инф = ИнформацияОбОшибке();
Предупреждение Асинх («Произошла ошибка: » + Инф.Описание);
КонецПопытки
КонецПроцедуры

Для Каждого Файл Из Файлы Цикл
ИсхФайл = ИсхКаталог + «/» + Файл.Имя;
ЦелФайл = ЦелКаталог + «/» + Файл.Имя;
Ждать КопироватьФайлАсинх(ИсхФайл, ЦелФайл); //3
Счетчик = Счетчик + 1;
КонецЦикла;

Возврат Счетчик;
КонецФункции

В функции КопироватьФайлыАсинх() появилась локальная переменная Счетчик для подсчета числа скопированных файлов. Значение этой переменной в явном виде возвращается из функции.

&НаКлиенте
Асинх Процедура КопироватьФайлы(Команда)
Сч = Ждать КопироватьФайлы Асинх (ИсходныйКаталог, ЦелевойКаталог); //1
Сообщить(«Скопировано файлов: » + Сч);
КонецПроцедуры

Как это работает

Выше мы рассмотрели, как может выглядеть «новый» асинхронный код. Теперь настало время разобраться, как это работает.

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

Таким образом, выполнение оператора Ждать выглядит следующим образом:

Можно попробовать провести параллель между «новой» и «старой» асинхронностью. Рассмотрим небольшой фрагмент, выполняющий копирования файла с применением старой техники работы с асинхронностью.

&НаКлиенте
Процедура СкопироватьФайл(ИсхФайл, ЦелФайл)
Описание = Новый ОписаниеОповещения(«ПослеКопирования», ЭтотОбъект);
НачатьКопированиеФайла(Описание, ИсхФайл, ЦелФайл);
КонецПроцедуры

Процедура ПослеКопирования(Файл, ДопПарам) Экспорт
Сообщить(«Скопирован файл: » + Файл);
КонецПроцедуры

Глядя на этот пример, можно сказать, что приостановка выполнения происходит на время выполнения «старой» асинхронной процедуры НачатьКопированиеФайла(), а возобновление выполнения происходит при завершении ее выполнения и заключается в вызове процедуры ПослеКопирования().

Теперь тот же фрагмент, написанный по-новому.

&НаКлиенте
Асинх Функция СкопироватьФайл(ИсхФайл, ЦелФайл)
Об = КопироватьФайлАсинх(ИсхФайл, ЦелФайл);
Ждать Об;
Сообщить(«Скопирован файл: » + ЦелФайл);
КонецФункции

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

&НаКлиенте
Асинх Процедура КопироватьФайлы(Команда)
Об = КопироватьФайлыАсинх(ИсходныйКаталог, ЦелевойКаталог); //(1)
Сч = Ждать Об; //(4) (10)
Сообщить(«Скопировано файлов: » + Сч);
Возврат; //(11)
КонецПроцедуры

Для Каждого Файл Из Файлы Цикл
ИсхФайл = ИсхКаталог + «/» + Файл.Имя;
ЦелФайл = ЦелКаталог + «/» + Файл.Имя;
Об2 = КопироватьФайл Асинх (ИсхФайл, ЦелФайл); //(6)
Ждать Об2; //(7) (8)
Счетчик = Счетчик + 1;
КонецЦикла;

Возврат Счетчик; //(9)
КонецФункции

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

Понятно, что шаги (6), (7) и (8) могут быть выполнены несколько раз, в зависимости от числа копируемых файлов.

Заключение

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

Источник

Синхронные и асинхронные вызовы в 1С

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

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

Зачем это нужно?

Изначально расширения для работы с файлами и криптографией в веб-клиенте были реализованы по технологии NPAPI и работа с методами расширений была синхронной. Затем браузер Google Chrome отказался от поддержки этой технологии (полностью удалена в версии 45 от сентября 2015). Решением проблемы стал перевод расширений для работы с файлами и криптографией на асинхронные рельсы.

У конфигураций появилось новое свойство в разделе «Совместимость»:

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

В чем разница?

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

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

Названия асинхронных методов обычно начинаются со слов «Начать» (например, «ЭтоФайл» и «НачатьПроверкуЭтоФайл») или «Показать» (например, «Вопрос» и «ПоказатьВопрос»), это знание может помочь в поиске асинхронного аналога синхронного метода.

Напомню, что асинхронную технику можно использовать для работы с:

Нужно отметить, что все асинхронные методы доступны только на стороне клиентского приложения. На сервере же по-прежнему доступны только синхронные методы (за исключением блокирующих окон — они на сервере вообще отсутствуют).

Соответствие синхронных методов асинхронным аналогам (на момент написания статьи) можно посмотреть тут.

Практические примеры

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

Асинхронные методы

Рассмотрим на примере асинхронного метода глобального контекста — НачатьПоискФайлов.

Источник

Выбор файла в 1С в асинхронном режиме

Рассмотрим как асинхронно (а в управляемых формах необходимо только так) программно обработать выбор пользователем пути к файлу.

Постановка задачи

Предположим, что на форме создан реквизит ПутьКФайлу. Этот реквизит имеет тип Строка и выведен на форму. Пользователь должен указывать в этом поле путь к файлу Excel.

Решение

Для удобства свойство КнопкаВыбора элемента формы установим в значение Да и будем обрабатывать событие НачалоВыбора этого элемента.

В процедуре начала выбора элемента ПутьКФайлу необходимо написать код:

// Отказываемся от стандартной обработки процедуры
СтандартнаяОбработка = Ложь;

содержит описание процедуры, которая будет вызвана после закрытия диалога выбора. В этой процедуре должно быть два параметра:

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

Если ВыбранныеФайлы <> Неопределено Тогда

ПутьКФайлу = ВыбранныеФайлы [ 0 ];

Внимание!

Процедура, указанная в объекте ОписаниеОповещения должна иметь ключевое слово Экспорт.

Приведенный пример можно немного усовершенствовать: передать в третий параметр конструктора ОписаниеОповещения переменную Диалог.

Тогда в процедуре ВыборФайлаЗавершение будет доступно немного больше информации: из параметра ДополнительныеПараметры можно будет узнать каталог, в котором хранится выбранный файл, и фильтр, которому соответствует файл.

В конструкторе объекта ДиалогВыбораФайла в параметре указывается для чего будет открыт диалог. Возможные значения системного перечисления РежимДиалогаВыбораФайла:

Приведу еще несколько свойств объекта ДиалогВыбораФайла:

Решение средствами БСП

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

общего модуля ОбменДаннымиКлиент. При помощи этого метода приведенную выше задачу можно решить так:

Остались вопросы?
Спросите в комментариях к статье.

Источник

Понравилась статья? Поделить с друзьями:
Добавить комментарий
  • Как сделать успешный бизнес на ритуальных услугах
  • Выездной кейтеринг в России
  • Риски бизнеса: без чего не обойтись на пути к успеху
  • 1с открыть файл управляемые формы
  • 1с открыть страницу формы программно