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 Тогда
ВызватьИсключение "Выброшено в ВыполнениеКода()";
Иначе
Возврат ПеремП;
КонецЕсли;
КонецФункции
// Асинх процедура не возвращает значения. А если при выполнении Асинх процедуры возникнет не перехваченное исключение,
// то это приведет к выдаче сообщения об ошибке.
Попытка
// Для того, чтобы узнать как завершилась Асинх функция – это использовать возвращенное ею Обещание как аргумент оператора Ждать.
Ждать ВыполнениеКода(Null);
Исключение
// Исключение из НеNull() будет перехвачено здесь
Сообщить("Передали Null");
КонецПопытки
КонецПроцедуры
Асинх Функция ВыполнениеКода(ПеремП) // Всегда возвращает Обещание
Если ПеремП = Null Тогда
ВызватьИсключение "Выброшено в ВыполнениеКода()";
Иначе
Возврат ПеремП;
КонецЕсли;
КонецФункции
// Асинх процедура не возвращает значения. А если при выполнении Асинх процедуры возникнет не перехваченное исключение,
// то это приведет к выдаче сообщения об ошибке.
Асинхронное копирование файлов в 1С 8.3:
&НаКлиенте
Асинх Процедура АсинхКопироватьФайлы(Команда)
Попытка
Ждать КопироватьФайлАсинх("//Server1C/base", "//BackUp/AvtoArhivBuh"); // Никуда не присваивается
Исключение
ОшибкаКопирования = ИнформацияОбОшибке();
ПредупреждениеАсинх("При копировании произошла ошибка: " + ОшибкаКопирования.Описание);
КонецПопытки
КонецПроцедуры
&НаКлиенте
Асинх Функция КопироватьФайлАсинх(ОткудаКопируем, КудаКопируем)
// КопироватьФайлАсинх(<ИмяФайлаИсточника>, <ИмяФайлаПриемника>)
// Параметры:
// <ИмяФайлаИсточника> (обязательный). Тип: Строка //Полное имя файла источника
// <ИмяФайлаПриемника> (обязательный). Тип: Строка //Полное имя файла приемника
// Возвращаемое значение:
// Тип: Обещание (путь к скопированному файлу. В случае ошибки Обещание будет содержать исключение)
ФайлыКаталога = Ждать НайтиФайлыАсинх(ОткудаКопируем, "*", Ложь); // Вернет или результат поиска файлов или ошибку
Для Каждого Файл Из ФайлыКаталога Цикл
ОткудаФайл = ОткудаКопируем + "/" + Файл.Имя;
КудаФайл = КудаКопируем + "/" + Файл.Имя;
Ждать КопироватьФайлАсинх(ОткудаФайл, КудаФайл); // Никуда не присваивается
КонецЦикла;
КонецФункции
Асинх Процедура АсинхКопироватьФайлы(Команда)
Попытка
Ждать КопироватьФайлАсинх("//Server1C/base", "//BackUp/AvtoArhivBuh"); // Никуда не присваивается
Исключение
ОшибкаКопирования = ИнформацияОбОшибке();
ПредупреждениеАсинх("При копировании произошла ошибка: " + ОшибкаКопирования.Описание);
КонецПопытки
КонецПроцедуры
&НаКлиенте
Асинх Функция КопироватьФайлАсинх(ОткудаКопируем, КудаКопируем)
// КопироватьФайлАсинх(<ИмяФайлаИсточника>, <ИмяФайлаПриемника>)
// Параметры:
// <ИмяФайлаИсточника> (обязательный). Тип: Строка //Полное имя файла источника
// <ИмяФайлаПриемника> (обязательный). Тип: Строка //Полное имя файла приемника
// Возвращаемое значение:
// Тип: Обещание (путь к скопированному файлу. В случае ошибки Обещание будет содержать исключение)
ФайлыКаталога = Ждать НайтиФайлыАсинх(ОткудаКопируем, "*", Ложь); // Вернет или результат поиска файлов или ошибку
Для Каждого Файл Из ФайлыКаталога Цикл
ОткудаФайл = ОткудаКопируем + "/" + Файл.Имя;
КудаФайл = КудаКопируем + "/" + Файл.Имя;
Ждать КопироватьФайлАсинх(ОткудаФайл, КудаФайл); // Никуда не присваивается
КонецЦикла;
КонецФункции
Асинхронное копирование файлов с сообщением о количестве скопированных файлов в 1С 8.3:
&НаКлиенте
Асинх Процедура АсинхКопироватьФайлы(Команда)
Попытка
КоличествоФайлов = Ждать КопироватьФайлАсинх("//Server1C/base", "//BackUp/AvtoArhivBuh"); // Никуда не присваивается
Сообщить("Скопировано файлов: " + КоличествоФайлов);
Исключение
ОшибкаКопирования = ИнформацияОбОшибке();
ПредупреждениеАсинх("При копировании произошла ошибка: " + ОшибкаКопирования.Описание);
КонецПопытки
КонецПроцедуры
&НаКлиенте
Асинх Функция КопироватьФайлАсинх(ОткудаКопируем, КудаКопируем) //Асинх Функция возвращает Обещание
// КопироватьФайлАсинх(<ИмяФайлаИсточника>, <ИмяФайлаПриемника>)
// Параметры:
// <ИмяФайлаИсточника> (обязательный). Тип: Строка //Полное имя файла источника
// <ИмяФайлаПриемника> (обязательный). Тип: Строка //Полное имя файла приемника
// Возвращаемое значение:
// Тип: Обещание (путь к скопированному файлу. В случае ошибки Обещание будет содержать исключение)
ФайлыКаталога = Ждать НайтиФайлыАсинх(ОткудаКопируем, "*", Ложь);
А = 0;
Для Каждого Файл Из ФайлыКаталога Цикл
ОткудаФайл = ОткудаКопируем + "/" + Файл.Имя;
КудаФайл = КудаКопируем + "/" + Файл.Имя;
Ждать КопироватьФайлАсинх(ОткудаФайл, КудаФайл); // Никуда не присваивается
А = А + 1;
КонецЦикла;
Возврат А;
КонецФункции
Асинх Процедура АсинхКопироватьФайлы(Команда)
Попытка
КоличествоФайлов = Ждать КопироватьФайлАсинх("//Server1C/base", "//BackUp/AvtoArhivBuh"); // Никуда не присваивается
Сообщить("Скопировано файлов: " + КоличествоФайлов);
Исключение
ОшибкаКопирования = ИнформацияОбОшибке();
ПредупреждениеАсинх("При копировании произошла ошибка: " + ОшибкаКопирования.Описание);
КонецПопытки
КонецПроцедуры
&НаКлиенте
Асинх Функция КопироватьФайлАсинх(ОткудаКопируем, КудаКопируем) //Асинх Функция возвращает Обещание
// КопироватьФайлАсинх(<ИмяФайлаИсточника>, <ИмяФайлаПриемника>)
// Параметры:
// <ИмяФайлаИсточника> (обязательный). Тип: Строка //Полное имя файла источника
// <ИмяФайлаПриемника> (обязательный). Тип: Строка //Полное имя файла приемника
// Возвращаемое значение:
// Тип: Обещание (путь к скопированному файлу. В случае ошибки Обещание будет содержать исключение)
ФайлыКаталога = Ждать НайтиФайлыАсинх(ОткудаКопируем, "*", Ложь);
А = 0;
Для Каждого Файл Из ФайлыКаталога Цикл
ОткудаФайл = ОткудаКопируем + "/" + Файл.Имя;
КудаФайл = КудаКопируем + "/" + Файл.Имя;
Ждать КопироватьФайлАсинх(ОткудаФайл, КудаФайл); // Никуда не присваивается
А = А + 1;
КонецЦикла;
Возврат А;
КонецФункции
Методы асинхронной отправки НТТР-запросов в 1С 8.3.21:
//В веб-клиенте будут поддержаны типы HTTPСоединение, HTTPЗапрос, HTTPОтвет и ЗащищенноеСоединениеOpenSSL
ВызватьHTTPМетодАсинх
ЗаписатьАсинх
ИзменитьАсинх
ОтправитьДляОбработкиАсинх
ПолучитьАсинх
ПолучитьЗаголовкиАсинх
УдалитьАсинх
Данные асинхронные методы работают начиная с версии платформы 1С 8.3.18 и используются на клиенте если это не запрещено. На сервере же по-прежнему доступны только синхронные методы. Иначе следует использовать аналоги, например: КопироватьФайл, НачатьКопированиеФайла.
При доработке кода 1С, в котором используются синхронные методы, на асинхронные вызовы (доступно с версии 8.3.6), рекомендуется использовать соответствующие аналоги. Полный список аналогов на момент публикации:
Справочно: синхронные методы (их аналоги асинхронные вызовы) в 1С 8.3:
Глобальный контекст:
- ВвестиДату() → ПоказатьВводДаты()
- ВвестиЗначение() → ПоказатьВводЗначения()
- ВвестиСтроку() → ПоказатьВводСтроки()
- ВвестиЧисло() → ПоказатьВводЧисла()
- Вопрос() → ПоказатьВопрос()
- ЗапроситьРазрешениеПользователя() → НачатьЗапросРазрешенияПользователя()
- ЗапуститьПриложение() → НачатьЗапускПриложения()
- КаталогВременныхФайлов() → НачатьПолучениеКаталогаВременныхФайлов()
- КаталогДокументов() → НачатьПолучениеКаталогаДокументов()
- КопироватьФайл() → НачатьКопированиеФайла()
- НайтиФайлы() → НачатьПоискФайлов()
- ОткрытьЗначение() → ПоказатьЗначение()
- ОткрытьФормуМодально() → ОткрытьФорму()
- ПереместитьФайл() → НачатьПеремещениеФайла()
- ПодключитьРасширениеРаботыСКриптографией() → НачатьПодключениеРасширенияРаботыСКриптографией()
- ПодключитьРасширениеРаботыСФайлами() → НачатьПодключениеРасширенияРаботыСФайлами()
- ПолучитьФайлы() → НачатьПолучениеФайлов()
- ПоместитьФайл() → НачатьПомещениеФайла()
- ПоместитьФайлы() → НачатьПомещениеФайлов()
- Предупреждение() → ПоказатьПредупреждение()
- РабочийКаталогДанныхПользователя() → НачатьПолучениеРабочегоКаталогаДанныхПользователя()
- СоздатьКаталог() → НачатьСозданиеКаталога()
- УстановитьВнешнююКомпоненту() → НачатьУстановкуВнешнейКомпоненты()
- УстановитьРасширениеРаботыСКриптографией() → НачатьУстановкуРасширенияРаботыСКриптографией()
- УстановитьРасширениеРаботыСФайлами() → НачатьУстановкуРасширенияРаботыСФайлами()
Диалог выбора шрифта, Диалог выбора цвета, Диалог выбора файла:
- Выбрать() → Показать()
Диалог расписания регламентного задания:
- ОткрытьМодально() → Показать()
Менеджер криптографии:
- Зашифровать() → НачатьШифрование()
- Конструктор → НачатьИнициализацию()
- Подписать() → НачатьПодписывание()
- ПолучитьИнформациюМодуляКриптографии() → НачатьПолучениеИнформацииМодуляКриптографии()
- ПолучитьСертификатыИзПодписи() → НачатьПолучениеСертификатовИзПодписи()
- ПолучитьХранилищеСертификатов() → НачатьПолучениеХранилищаСертификатов()
- ПроверитьПодпись() → НачатьПроверкуПодписи()
- ПроверитьСертификат() → НачатьПроверкуСертификата()
- Расшифровать() → НачатьРасшифровку()
Список значений:
- ВыбратьЭлемент() → ПоказатьВыборЭлемента()
- ОтметитьЭлементы() → ПоказатьОтметкуЭлементов()
Сертификат криптографии:
- Выгрузка() → НачатьВыгрузку()
- Конструктор → НачатьИнициализацию()
Средства криптографии:
- Добавить() → НачатьДобавление()
- НайтиПоОтпечатку() → НачатьПоискПоОтпечатку()
- НайтиПоСерийномуНомеру() → НачатьПоискПоСерийномуНомеру()
- НайтиПоСубъекту() → НачатьПоискПоСубъекту()
- ПолучитьВсе() → НачатьПолучениеВсех()
- ПолучитьИнформациюМодуляКриптографии() → НачатьПолучениеИнформацииМодуляКриптографии()
- Удалить() → НачатьУдаление()
- ХранилищеСертификатовКриптографии
Управляемая форма:
- ВыбратьИзМеню() → ПоказатьВыборИзМеню()
- ВыбратьИзСписка() → ПоказатьВыборИзСписка()
- ОткрытьМодально() → Открыть()
Файл:
- Записать → НачатьЗапись()
- Конструктор → НачатьИнициализацию()
- ПолучитьВремяИзменения() → НачатьПолучениеВремениИзменения()
- ПолучитьНевидимость() → НачатьПолучениеНевидимости()
- ПолучитьТолькоЧтение() → НачатьПолучениеТолькоЧтения()
- ПолучитьУниверсальноеВремяИзменения() → НачатьПолучениеУниверсальногоВремниИзменения()
- Размер() → НачатьПолучениеРазмера()
- Существует() → НачатьПроверкуСуществования()
- УстановитьВремяИзменения() → НачатьУстановкуВремениИзменения()
- УстановитьНевидимость() → НачатьУстановкуНевидимости()
- УстановитьТолькоЧтение() → НачатьУстановкуТолькоЧтения()
- УстановитьУниверсальноеВремяИзменения() → НачатьУстановкуУниверсальногоВремениИзменения()
- ЭтоКаталог() → НачатьПроверкуЭтоКаталог()
- ЭтоФайл() → НачатьПроверкуЭтоФайл()
📰 Актуальные новости с тегом #Асинх:
- В версии 8.3.27 реализованы асинхронные конструкторы объектов внешних компонент.
8
комментарии
Ceh
11 ноя 2021
GetNight, попробуй повысить релиз платформы. Что-то подсказывает, что пропадёт баг. Или фича:)
GetNight
11 ноя 2021
1С:Предприятие 8.3 (8.3.19.1264)
ни ТД.НачатьЗапись() ни ТД.ЗаписатьАсинх() - файл не появляется (записываю два файла)
однако, если поставить на первой записи точку останова и через Shift+F9 просмотреть содержимое ТД.Параметры (просто развернуть плюсиком) - то происходит запись обеих (!!!) файлов
так же запись происходит, если ставлю точку останова, где присваиваю параметру значение себя самого
ИспользуемоеИмяФайла = ИспользуемоеИмяФайла
то есть под отладкой, если в отладке идёт присвоение любому параметру даже себя самого - запись происходит, как ни в чём ни бывало - без проблем и ошибок
однако, если в коде присваиваю - ничего не записывается
фича? ;) скорее, баг... пока не поборол
ни ТД.НачатьЗапись() ни ТД.ЗаписатьАсинх() - файл не появляется (записываю два файла)
однако, если поставить на первой записи точку останова и через Shift+F9 просмотреть содержимое ТД.Параметры (просто развернуть плюсиком) - то происходит запись обеих (!!!) файлов
так же запись происходит, если ставлю точку останова, где присваиваю параметру значение себя самого
ИспользуемоеИмяФайла = ИспользуемоеИмяФайла
то есть под отладкой, если в отладке идёт присвоение любому параметру даже себя самого - запись происходит, как ни в чём ни бывало - без проблем и ошибок
однако, если в коде присваиваю - ничего не записывается
фича? ;) скорее, баг... пока не поборол
Болик
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С все больше становится похожим на нормальный язык программирования. Еще конечно есть над чем работать
____________________
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник