Полный клиентский модуль создаёт свой файл, пишет ABC123, читает, копирует и сокращает его. Каждое обещание ожидается до следующего действия.
Где и как запускать
Модуль пустой управляемой формы учебной внешней обработки; тонкий или толстый клиент Windows. Вставьте весь модуль. Это не серверный код.
Подготовка
Создайте учебную внешнюю обработку с пустой управляемой основной формой. Создайте команду УчебныйПример и кнопку этой команды.
В свойстве команды Действие выберите процедуру УчебныйПример. Вставьте полный приведённый модуль формы.
Откройте EPF в тонком или толстом клиенте Windows и нажмите кнопку. Не переносите Ждать и Асинх в серверный общий модуль.
Файл создаётся на компьютере клиента Windows во временном каталоге. Веб-клиент и сервер для данного модуля не используйте.
Требуется разрешённый в учебной базе доступ к локальной файловой системе. Не отключайте профиль безопасности рабочей базы ради запуска.
Создаётся только собственный временный файл с режимом СоздатьНовый. После ожидания операций ресурсы закрываются, точное собственное имя удаляется.
&НаКлиенте
Асинх Процедура УчебныйПример(Команда)
ИмяФайла = ПолучитьИмяВременногоФайла("bin");
УчебныйФайл = Новый Файл(ИмяФайла);
Если УчебныйФайл.Существует() Тогда
ВызватьИсключение "Временное имя уже занято: чужой файл не открываем";
КонецЕсли;
Поток = Неопределено;
Вид = Неопределено;
Копия = Неопределено;
СозданСвойФайл = Ложь;
Попытка
Поток = Новый ФайловыйПоток(ИмяФайла, РежимОткрытияФайла.СоздатьНовый, ДоступКФайлу.ЧтениеИЗапись);
СозданСвойФайл = Истина;
Буфер = ПолучитьБуферДвоичныхДанныхИзСтроки("ABC123", КодировкаТекста.UTF8, Ложь);
Ждать Поток.ЗаписатьАсинх(Буфер, 0, Буфер.Размер);
Ждать Поток.СброситьБуферыАсинх();
Размер = Ждать Поток.РазмерАсинх();
Сообщить(Размер = 6);
Позиция = Ждать Поток.ПерейтиАсинх(0, ПозицияВПотоке.Начало);
Сообщить(Позиция = 0);
Прочитанный = Новый БуферДвоичныхДанных(6);
Количество = Ждать Поток.ПрочитатьАсинх(Прочитанный, 0, 6);
Сообщить(Количество = 6);
Сообщить(ПолучитьСтрокуИзБуфераДвоичныхДанных(Прочитанный, КодировкаТекста.UTF8) = "ABC123");
Ждать Поток.ПерейтиАсинх(2, ПозицияВПотоке.Начало);
Копия = Новый ПотокВПамяти;
Скопировано = Ждать Поток.КопироватьВАсинх(Копия, 3);
Сообщить(Скопировано = 3);
ДанныеКопии = Копия.ЗакрытьИПолучитьДвоичныеДанные();
Копия = Неопределено;
Сообщить(ПолучитьСтрокуИзДвоичныхДанных(ДанныеКопии, КодировкаТекста.UTF8) = "C12");
Ждать Поток.УстановитьРазмерАсинх(3);
Размер = Ждать Поток.РазмерАсинх();
Сообщить(Размер = 3);
Ждать Поток.ЗакрытьАсинх();
Поток = Неопределено;
Исключение
Если Вид <> Неопределено Тогда
Вид.Закрыть();
КонецЕсли;
Если Копия <> Неопределено Тогда
Копия.Закрыть();
КонецЕсли;
Если Поток <> Неопределено Тогда
Поток.Закрыть();
КонецЕсли;
Если СозданСвойФайл И УчебныйФайл.Существует() Тогда
УдалитьФайлы(ИмяФайла);
КонецЕсли;
ВызватьИсключение;
КонецПопытки;
Если Вид <> Неопределено Тогда
Вид.Закрыть();
КонецЕсли;
Если Копия <> Неопределено Тогда
Копия.Закрыть();
КонецЕсли;
Если Поток <> Неопределено Тогда
Поток.Закрыть();
КонецЕсли;
Если СозданСвойФайл Тогда
УдалитьФайлы(ИмяФайла);
КонецЕсли;
Сообщить(Не УчебныйФайл.Существует());
КонецПроцедурыРазбор по шагам
Код целиком вставляется в модуль учебной формы: &НаКлиенте и Асинх Процедура сохраняются.
Ждать получает завершённый результат: размер/позицию/количество, а не сам объект Обещание.
Буферы сохраняются в переменных до завершения своих операций; параллельных операций над одним курсором нет.
Сокращение касается только данного нового файла. Закрытие также ожидается до удаления; при ошибке работает общий блок освобождения.
Как проверить результат
Семь сравнений до очистки Истина: 6, 0, чтение 6/ABC123, копирование 3/C12, сокращённый размер 3.
Поток закрывается ожидаемым ЗакрытьАсинх, а не удаляется во время незавершённой операции.
Последнее сообщение Истина: точный собственный временный файл удалён после закрытия ресурсов.
Ожидаемый результат
Последовательно завершена небольшая клиентская цепочка обещаний для собственного файла.
На что обратить внимание
Не переносите Асинх/Ждать в серверную процедуру из синхронных уроков.
Асинхронность не означает безопасные параллельные записи в один поток. Общий курсор требует согласованной последовательности.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.