1С 8.3 Асинхронные функции - Программист 1С Минск. Автоматизация бизнеса.

Перейти к контенту

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

Данные > Примеры кода 1С > 1С 8.3 Асинхронные функции
Реклама:
Асинхронные функции в 1С 8.3 - это работа конструкций кода в многопоточном режиме, которые не блокируют выполнение основного кода. Их необходимо использовать при наличии замедляющих (блокирующих) действий, для ускорения выполнения кода, например: при чтении или загрузке больших файлов из базы данных. При использовании асинхронных функций 1С Предприятие 8.3 продолжает реагировать на действия в пользовательском режиме и позволяет продолжать работу.

Части асинхронного функционала в 1С 8.3:
  • Обещание (получение результата выполнения асинхронной функции). Может находится в состоянии ожидания, нормального завершения или исключения.
  • Возвращающие Обещание - например КопироватьФайлАсинх(ИмяФайлаИсточника, ИмяФайлаПриемника)
  • Асинх - этот модификатор, который делает процедуру или функцию асинхронной.
  • Ждать - этот оператор выполняет ожидание завершения асинхронной функции, стоящей за объектом Обещание и может использоваться только внутри Асинх процедур/функций.

Примечание: Все параметры Асинх процедур и функций передаются только по значению. Ключевое слово "Знач" употреблять не нужно - оно подразумевается по умолчанию.
Обещание и Возвращающие Обещание в 1С 8.3:
Процедура ВыполнениеПримераСАсих()

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

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

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

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

КонецФункции
Обещание как аргумент оператора Ждать в 1С 8.3:
Асинх Процедура ВыполнениеПримераСАсих()

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

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

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

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

КонецФункции

// Асинх процедура не возвращает значения. А если при выполнении Асинх процедуры возникнет не перехваченное исключение,
// то это приведет к выдаче сообщения об ошибке.
Асинхронное копирование файлов в 1С 8.3:
&НаКлиенте
Асинх Процедура АсинхКопироватьФайлы(Команда)

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

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

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

   
// КопироватьФайлАсинх(<ИмяФайлаИсточника>, <ИмяФайлаПриемника>)
    // Параметры:
    // <ИмяФайлаИсточника> (обязательный). Тип: Строка //Полное имя файла источника
    // <ИмяФайлаПриемника> (обязательный). Тип: Строка //Полное имя файла приемника
    // Возвращаемое значение:
    // Тип: Обещание (путь к скопированному файлу. В случае ошибки Обещание будет содержать исключение)

   
ФайлыКаталога = Ждать НайтиФайлыАсинх(ОткудаКопируем, "*", Ложь); // Вернет или результат поиска файлов или ошибку

   
Для Каждого Файл Из ФайлыКаталога Цикл
       
ОткудаФайл = ОткудаКопируем + "/" + Файл.Имя;
       
КудаФайл = КудаКопируем + "/" + Файл.Имя;

       
Ждать КопироватьФайлАсинх(ОткудаФайл, КудаФайл); // Никуда не присваивается
   
КонецЦикла;

КонецФункции
Асинхронное копирование файлов с сообщением о количестве скопированных файлов в 1С 8.3:
&НаКлиенте
Асинх Процедура АсинхКопироватьФайлы(Команда)

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

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

&НаКлиенте
Асинх Функция КопироватьФайлАсинх(ОткудаКопируем, КудаКопируем) //Асинх Функция возвращает Обещание

    // КопироватьФайлАсинх(<ИмяФайлаИсточника>, <ИмяФайлаПриемника>)
    // Параметры:
    // <ИмяФайлаИсточника> (обязательный). Тип: Строка //Полное имя файла источника
    // <ИмяФайлаПриемника> (обязательный). Тип: Строка //Полное имя файла приемника
    // Возвращаемое значение:
    // Тип: Обещание (путь к скопированному файлу. В случае ошибки Обещание будет содержать исключение)

   
ФайлыКаталога = Ждать НайтиФайлыАсинх(ОткудаКопируем, "*", Ложь);   
   
А = 0;

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

       
А = А + 1;
    КонецЦикла;

    Возврат
А;

КонецФункции
Данные асинхронные методы работают начиная с версии платформы 1С 8.3.18 и используются на клиенте если это не запрещено. На сервере же по-прежнему доступны только синхронные методы. Иначе следует использовать аналоги, например: КопироватьФайл, НачатьКопированиеФайла.

При доработке кода 1С, в котором используются синхронные методы, на асинхронные вызовы (доступно с версии 8.3.6), рекомендуется использовать соответствующие аналоги. Полный список аналогов на момент публикации:
Справочно: синхронные методы (их аналоги асинхронные вызовы) в 1С 8.3:
Глобальный контекст:
  • ВвестиДату() → ПоказатьВводДаты()
  • ВвестиЗначение() → ПоказатьВводЗначения()
  • ВвестиСтроку() → ПоказатьВводСтроки()
  • ВвестиЧисло() → ПоказатьВводЧисла()
  • Вопрос() → ПоказатьВопрос()
  • ЗапроситьРазрешениеПользователя() → НачатьЗапросРазрешенияПользователя()
  • ЗапуститьПриложение() → НачатьЗапускПриложения()
  • КаталогВременныхФайлов() → НачатьПолучениеКаталогаВременныхФайлов()
  • КаталогДокументов() → НачатьПолучениеКаталогаДокументов()
  • КопироватьФайл() → НачатьКопированиеФайла()
  • НайтиФайлы() → НачатьПоискФайлов()
  • ОткрытьЗначение() → ПоказатьЗначение()
  • ОткрытьФормуМодально() → ОткрытьФорму()
  • ПереместитьФайл() → НачатьПеремещениеФайла()
  • ПодключитьРасширениеРаботыСКриптографией() → НачатьПодключениеРасширенияРаботыСКриптографией()
  • ПодключитьРасширениеРаботыСФайлами() → НачатьПодключениеРасширенияРаботыСФайлами()
  • ПолучитьФайлы() → НачатьПолучениеФайлов()
  • ПоместитьФайл() → НачатьПомещениеФайла()
  • ПоместитьФайлы() → НачатьПомещениеФайлов()
  • Предупреждение() → ПоказатьПредупреждение()
  • РабочийКаталогДанныхПользователя() → НачатьПолучениеРабочегоКаталогаДанныхПользователя()
  • СоздатьКаталог() → НачатьСозданиеКаталога()
  • УстановитьВнешнююКомпоненту() → НачатьУстановкуВнешнейКомпоненты()
  • УстановитьРасширениеРаботыСКриптографией() → НачатьУстановкуРасширенияРаботыСКриптографией()
  • УстановитьРасширениеРаботыСФайлами() → НачатьУстановкуРасширенияРаботыСФайлами()

Диалог выбора шрифта, Диалог выбора цвета, Диалог выбора файла:
  • Выбрать() Показать()

Диалог расписания регламентного задания:
  • ОткрытьМодально() Показать()

Менеджер криптографии:
  • Зашифровать() → НачатьШифрование()
  • Конструктор → НачатьИнициализацию()
  • Подписать() → НачатьПодписывание()
  • ПолучитьИнформациюМодуляКриптографии() → НачатьПолучениеИнформацииМодуляКриптографии()
  • ПолучитьСертификатыИзПодписи() → НачатьПолучениеСертификатовИзПодписи()
  • ПолучитьХранилищеСертификатов() → НачатьПолучениеХранилищаСертификатов()
  • ПроверитьПодпись() → НачатьПроверкуПодписи()
  • ПроверитьСертификат() → НачатьПроверкуСертификата()
  • Расшифровать() → НачатьРасшифровку()

Список значений:
  • ВыбратьЭлемент() ПоказатьВыборЭлемента()
  • ОтметитьЭлементы() ПоказатьОтметкуЭлементов()

Сертификат криптографии:
  • Выгрузка() НачатьВыгрузку()
  • Конструктор НачатьИнициализацию()

Средства криптографии:
  • Добавить() → НачатьДобавление()
  • НайтиПоОтпечатку() → НачатьПоискПоОтпечатку()
  • НайтиПоСерийномуНомеру() → НачатьПоискПоСерийномуНомеру()
  • НайтиПоСубъекту() → НачатьПоискПоСубъекту()
  • ПолучитьВсе() → НачатьПолучениеВсех()
  • ПолучитьИнформациюМодуляКриптографии() → НачатьПолучениеИнформацииМодуляКриптографии()
  • Удалить() → НачатьУдаление()
  • ХранилищеСертификатовКриптографии

Управляемая форма:
  • ВыбратьИзМеню() → ПоказатьВыборИзМеню()
  • ВыбратьИзСписка() → ПоказатьВыборИзСписка()
  • ОткрытьМодально() → Открыть()

Файл:
  • Записать → НачатьЗапись()
  • Конструктор → НачатьИнициализацию()
  • ПолучитьВремяИзменения() → НачатьПолучениеВремениИзменения()
  • ПолучитьНевидимость() → НачатьПолучениеНевидимости()
  • ПолучитьТолькоЧтение() → НачатьПолучениеТолькоЧтения()
  • ПолучитьУниверсальноеВремяИзменения() → НачатьПолучениеУниверсальногоВремниИзменения()
  • Размер() → НачатьПолучениеРазмера()
  • Существует() → НачатьПроверкуСуществования()
  • УстановитьВремяИзменения() → НачатьУстановкуВремениИзменения()
  • УстановитьНевидимость() → НачатьУстановкуНевидимости()
  • УстановитьТолькоЧтение() → НачатьУстановкуТолькоЧтения()
  • УстановитьУниверсальноеВремяИзменения() → НачатьУстановкуУниверсальногоВремениИзменения()
  • ЭтоКаталог() → НачатьПроверкуЭтоКаталог()
  • ЭтоФайл() → НачатьПроверкуЭтоФайл()
Поиск кода
6
комментарии
Болик
30 окт 2020
По функциям Асинх и ждать есть хороший ролик у Павла чистова. см. на Ютубе
Администратор
07 окт 2020
Скоро выйдет в работу. Актуальный релиз сей-час 8.3.17.1549. Для ознакомления на сайте ИТС доступна 8.3.18.1115.
qqqqqqq
07 окт 2020
8.3.18 уже вышла?
Siroga
15 май 2020
Почему "Асинх " Перед функцией, а не после, как например "Экспорт"?
Никита
30 апр 2020
До асинхронных функций .NET и Java (Promise и Await) еще как до луны
Leonid Yarcev
24 апр 2020
1С все больше становится похожим на нормальный язык программирования. Еще конечно есть над чем работать
____________________
Copyright by 1Cnik.by©, «Программист 1С в г.Минске», 20.04.2020
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник
Назад к содержимому