ФайловыйПоток.ЗакрытьАсинх

Методы · CloseAsync

Асинхронная функция. Закрывает поток. Физический смысл зависит от конкретного типа потока.

Синтаксис

ЗакрытьАсинх()
Полное описание, параметры и ограничения

ФайловыйПоток.ЗакрытьАсинх (FileStream.CloseAsync)

ФайловыйПоток (FileStream)

ЗакрытьАсинх (CloseAsync)

Доступен, начиная с версии 8.3.18.

Синтаксис:
ЗакрытьАсинх()
Возвращаемое значение:
Тип: Обещание.
Результат выполнения обещания - Неопределено.
Описание:

Асинхронная функция. Закрывает поток.
Физический смысл зависит от конкретного типа потока.

Доступность:

Тонкий клиент, веб-клиент, толстый клиент.

См. также:
Поток, метод Закрыть
Поток, метод НачатьЗакрытие

Использование в версии:

Доступен, начиная с версии 8.3.18.

Методическая информация

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

Ожидать открытие своего файла через Асинх и Ждать

Повторяем путь ABC → ZBC → ZBCZ через обещания с отдельным ожиданием открытия, записи, чтения и закрытия.

Где и как запускать

Полный Асинх модуль собственной управляемой формы, тонкий/толстый клиент Windows.

Подготовка

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

  2. Это клиентский модуль, не серверный и не веб-клиентский: используются локальные файлы и операции потока, доступные этому окружению. Не отключайте профиль безопасности рабочей базы ради урока.

  3. Именованные уроки получают новое временное имя, резервируют его через СоздатьНовый и только после этого показывают методы, способные перезаписать собственный файл. Ни один путь не вводится пользователем.

  4. Автоматический временный поток создаётся менеджером без заданного имени. Не обещаем физический файл, его расположение или отсутствие файла на диске по одному свойству потока.

  5. Не закрывайте форму в середине асинхронной цепочки. После нормального завершения проверяйте сообщения очистки; при аварийном завершении клиента платформа может оставить временный файл до штатной уборки.

&НаКлиенте
Асинх Процедура Выполнить(Команда)
    Состояние = Новый Структура("Имя,Поток,СозданСвойФайл", ПолучитьИмяВременногоФайла("bin"), Неопределено, Ложь);
    ПроверкаИмени = Новый Файл(Состояние.Имя);
    Если ПроверкаИмени.Существует() Тогда
        ВызватьИсключение "Временное имя занято: чужой файл не открываем и не удаляем";
    КонецЕсли;
    ОшибкаОперации = "";
    Попытка
        Состояние.Поток = Новый ФайловыйПоток(Состояние.Имя, РежимОткрытияФайла.СоздатьНовый, ДоступКФайлу.ЧтениеИЗапись);
        Состояние.СозданСвойФайл = Истина;
        Состояние.Поток.Закрыть();
        Состояние.Поток = Неопределено;
        Состояние.Поток = Ждать ФайловыеПотоки.СоздатьАсинх(Состояние.Имя, 8192);
        Буфер = ПолучитьБуферДвоичныхДанныхИзСтроки("ABC", КодировкаТекста.UTF8, Ложь);
        Ждать Состояние.Поток.ЗаписатьАсинх(Буфер, 0, 3);
        Ждать Состояние.Поток.ЗакрытьАсинх();
        Состояние.Поток = Ждать ФайловыеПотоки.ОткрытьДляЗаписиАсинх(Состояние.Имя, 8192);
        Замена = ПолучитьБуферДвоичныхДанныхИзСтроки("Z", КодировкаТекста.UTF8, Ложь);
        Ждать Состояние.Поток.ЗаписатьАсинх(Замена, 0, 1);
        Ждать Состояние.Поток.ЗакрытьАсинх();
        Состояние.Поток = Ждать ФайловыеПотоки.ОткрытьДляЧтенияАсинх(Состояние.Имя);
        Сообщить(Состояние.Поток.ДоступноЧтение И НЕ Состояние.Поток.ДоступнаЗапись);
        Прочитанный = Новый БуферДвоичныхДанных(3);
        Сообщить((Ждать Состояние.Поток.ПрочитатьАсинх(Прочитанный, 0, 3)) = 3);
        Сообщить(Прочитанный.Получить(0) = 90 И Прочитанный.Получить(1) = 66 И Прочитанный.Получить(2) = 67);
        Ждать Состояние.Поток.ЗакрытьАсинх();
        Состояние.Поток = Ждать ФайловыеПотоки.ОткрытьДляДописыванияАсинх(Состояние.Имя);
        Ждать Состояние.Поток.ЗаписатьАсинх(Замена, 0, 1);
        Ждать Состояние.Поток.ЗакрытьАсинх();
        Состояние.Поток = Ждать ФайловыеПотоки.ОткрытьАсинх(Состояние.Имя, РежимОткрытияФайла.Открыть, 8192);
        Сообщить((Ждать Состояние.Поток.РазмерАсинх()) = 4);
        Сообщить(Состояние.Поток.ДоступноЧтение И Состояние.Поток.ДоступнаЗапись);
        Ждать Состояние.Поток.ЗакрытьАсинх();
        Состояние.Поток = Ждать ФайловыеПотоки.ОткрытьАсинх(Состояние.Имя, РежимОткрытияФайла.Открыть, ДоступКФайлу.Чтение, 8192);
        ЧетыреБайта = Новый БуферДвоичныхДанных(4);
        Сообщить((Ждать Состояние.Поток.ПрочитатьАсинх(ЧетыреБайта, 0, 4)) = 4);
        Сообщить(ЧетыреБайта.Получить(3) = 90);
        Сообщить(НЕ Состояние.Поток.ДоступнаЗапись);
    Исключение
        ОшибкаОперации = ОписаниеОшибки();
    КонецПопытки;
    ОшибкаОчистки = ОчиститьФайлУрока(Состояние);
    Если Не ПустаяСтрока(ОшибкаОперации) Или Не ПустаяСтрока(ОшибкаОчистки) Тогда
        ВызватьИсключение ОшибкаОперации + " " + ОшибкаОчистки;
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Функция ОчиститьФайлУрока(Состояние)
    ОшибкаЗакрытия = ЗакрытьПотокУрока(Состояние.Поток);
    Если Не ПустаяСтрока(ОшибкаЗакрытия) Тогда
        Возврат ОшибкаЗакрытия;
    КонецЕсли;
    Состояние.Поток = Неопределено;
    Если Состояние.СозданСвойФайл Тогда
        Попытка
            СвойФайл = Новый Файл(Состояние.Имя);
            Если СвойФайл.Существует() Тогда
                УдалитьФайлы(Состояние.Имя);
            КонецЕсли;
            Если СвойФайл.Существует() Тогда
                Возврат "Собственный временный файл остался после очистки";
            КонецЕсли;
            Сообщить("Точный собственный временный файл удалён");
        Исключение
            Возврат "Не удалось удалить собственный временный файл: " + ОписаниеОшибки();
        КонецПопытки;
    КонецЕсли;
    Возврат "";
КонецФункции

&НаКлиенте
Функция ЗакрытьПотокУрока(Поток)
    Если Поток = Неопределено Тогда
        Возврат "";
    КонецЕсли;
    Попытка
        Поток.Закрыть();
        Возврат "";
    Исключение
        Возврат "Не удалось закрыть собственный поток: " + ОписаниеОшибки();
    КонецПопытки;
КонецФункции

Разбор по шагам

  1. ПолучитьИмяВременногоФайла само не создаёт файл. Проверяем занятость и резервируем собственное имя через конструктор СоздатьНовый; чужое имя при конфликте не удаляется.

  2. Создать перезаписывает только уже созданный нами пустой файл. Записываем ASCII ABC без BOM — три байта 65, 66, 67.

  3. ОткрытьДляЗаписи пишет поверх начала: один байт Z=90 заменяет A. Ожидается ZBC, а не только Z; хвост не удаляется автоматически.

  4. ОткрытьДляЧтения возвращает поток без возможности записи. ОткрытьДляДописывания добавляет Z в конец: получается ZBCZ, четыре байта.

  5. Перед каждым повторным открытием предыдущий поток закрыт. Только собственный файл удаляется после успешного закрытия; ошибки операции и уборки сообщаются вместе.

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

  7. ОткрытьАсинх принимает ИмяФайла, РежимОткрытия, затем необязательный РазмерБуфера; вариант с доступом — ИмяФайла, РежимОткрытия, ДоступКФайлу, РазмерБуфера.

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

Как проверить результат

  1. Восемь сравнений ожидаются Истина; данные последовательно ABC → ZBC → ZBCZ.

  2. Последнее сообщение подтверждает удаление точного собственного временного файла. Нет такого сообщения при неудачной очистке.

  3. Не подставляйте пути ваших XML, HTML или рабочей базы вместо автоматически полученного имени.

Ожидаемый результат

Показан полный асинхронный путь с двумя вариантами открытия и сохранением ошибок очистки.

На что обратить внимание

  1. Нельзя переносить порядок параметров из синхронного Открыть в ОткрытьАсинх.

  2. Слово Асинх не означает, что операция уже завершилась: используйте Ждать.

  3. Урок содержит короткую синхронную резервацию и аварийное закрытие; это явно ограниченный локальный опыт.

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

Последовательно дождаться восьми файловых операций

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

Где и как запускать

Модуль пустой управляемой формы учебной внешней обработки; тонкий или толстый клиент Windows. Вставьте весь модуль. Это не серверный код.

Подготовка

  1. Создайте учебную внешнюю обработку с пустой управляемой основной формой. Создайте команду УчебныйПример и кнопку этой команды.

  2. В свойстве команды Действие выберите процедуру УчебныйПример. Вставьте полный приведённый модуль формы.

  3. Откройте EPF в тонком или толстом клиенте Windows и нажмите кнопку. Не переносите Ждать и Асинх в серверный общий модуль.

  4. Файл создаётся на компьютере клиента Windows во временном каталоге. Веб-клиент и сервер для данного модуля не используйте.

  5. Требуется разрешённый в учебной базе доступ к локальной файловой системе. Не отключайте профиль безопасности рабочей базы ради запуска.

  6. Создаётся только собственный временный файл с режимом СоздатьНовый. После ожидания операций ресурсы закрываются, точное собственное имя удаляется.

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

Разбор по шагам

  1. Код целиком вставляется в модуль учебной формы: &НаКлиенте и Асинх Процедура сохраняются.

  2. Ждать получает завершённый результат: размер/позицию/количество, а не сам объект Обещание.

  3. Буферы сохраняются в переменных до завершения своих операций; параллельных операций над одним курсором нет.

  4. Сокращение касается только данного нового файла. Закрытие также ожидается до удаления; при ошибке работает общий блок освобождения.

Как проверить результат

  1. Семь сравнений до очистки Истина: 6, 0, чтение 6/ABC123, копирование 3/C12, сокращённый размер 3.

  2. Поток закрывается ожидаемым ЗакрытьАсинх, а не удаляется во время незавершённой операции.

  3. Последнее сообщение Истина: точный собственный временный файл удалён после закрытия ресурсов.

Ожидаемый результат

Последовательно завершена небольшая клиентская цепочка обещаний для собственного файла.

На что обратить внимание

  1. Не переносите Асинх/Ждать в серверную процедуру из синхронных уроков.

  2. Асинхронность не означает безопасные параллельные записи в один поток. Общий курсор требует согласованной последовательности.

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

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.