Асинхронная функция. Открывает существующий файл для записи в конец. Если файл не существует, то создается новый файл. Запись в существующий файл производится с конца файла. Файл открывается в режиме разделяемого чтения.
Синтаксис
ОткрытьДляДописыванияАсинх(<ИмяФайла>)Полное описание, параметры и ограничения
МенеджерФайловыхПотоков.ОткрытьДляДописыванияАсинх (FileStreamsManager.OpenForAppendAsync)
МенеджерФайловыхПотоков (FileStreamsManager)
ОткрытьДляДописыванияАсинх (OpenForAppendAsync)
Доступен, начиная с версии 8.3.18.
Синтаксис:
ОткрытьДляДописыванияАсинх(<ИмяФайла>)
Параметры:
<ИмяФайла> (обязательный)
Тип: Строка.
Имя открываемого файла.
Возвращаемое значение:
Тип: Обещание.
Результат выполнения обещания - объект типа ФайловыйПоток для файла с указанным именем.
Описание:
Асинхронная функция. Открывает существующий файл для записи в конец. Если файл не существует, то создается новый файл. Запись в существующий файл производится с конца файла. Файл открывается в режиме разделяемого чтения.
Доступность:
Тонкий клиент, толстый клиент.
См. также:
МенеджерФайловыхПотоков, метод НачатьОткрытиеДляДописывания
МенеджерФайловыхПотоков, метод ОткрытьДляДописывания
Использование в версии:
Доступен, начиная с версии 8.3.18.
Методическая информация
Практические примеры
Ожидать открытие своего файла через Асинх и Ждать
Повторяем путь ABC → ZBC → ZBCZ через обещания с отдельным ожиданием открытия, записи, чтения и закрытия.
Где и как запускать
Полный Асинх модуль собственной управляемой формы, тонкий/толстый клиент Windows.
Подготовка
Собственная учебная база 8.5.1.1343, тонкий или толстый клиент Windows с разрешённой локальной файловой системой. Создайте внешнюю обработку с управляемой формой, командой Выполнить и кнопкой; вставьте весь модуль одного урока.
Это клиентский модуль, не серверный и не веб-клиентский: используются локальные файлы и операции потока, доступные этому окружению. Не отключайте профиль безопасности рабочей базы ради урока.
Именованные уроки получают новое временное имя, резервируют его через СоздатьНовый и только после этого показывают методы, способные перезаписать собственный файл. Ни один путь не вводится пользователем.
Автоматический временный поток создаётся менеджером без заданного имени. Не обещаем физический файл, его расположение или отсутствие файла на диске по одному свойству потока.
Не закрывайте форму в середине асинхронной цепочки. После нормального завершения проверяйте сообщения очистки; при аварийном завершении клиента платформа может оставить временный файл до штатной уборки.
&НаКлиенте
Асинх Процедура Выполнить(Команда)
Состояние = Новый Структура("Имя,Поток,СозданСвойФайл", ПолучитьИмяВременногоФайла("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);
Сообщить(НЕ Состояние.Поток.ДоступнаЗапись);
Исключение
ОшибкаОперации = ОписаниеОшибки();
КонецПопытки;
ОшибкаОчистки = ОчиститьФайлУрока(Состояние);
Если Не ПустаяСтрока(ОшибкаОперации) Или Не ПустаяСтрока(ОшибкаОчистки) Тогда
ВызватьИсключение ОшибкаОперации + " " + ОшибкаОчистки;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Функция ОчиститьФайлУрока(Состояние)
ОшибкаЗакрытия = ЗакрытьПотокУрока(Состояние.Поток);
Если Не ПустаяСтрока(ОшибкаЗакрытия) Тогда
Возврат ОшибкаЗакрытия;
КонецЕсли;
Состояние.Поток = Неопределено;
Если Состояние.СозданСвойФайл Тогда
Попытка
СвойФайл = Новый Файл(Состояние.Имя);
Если СвойФайл.Существует() Тогда
УдалитьФайлы(Состояние.Имя);
КонецЕсли;
Если СвойФайл.Существует() Тогда
Возврат "Собственный временный файл остался после очистки";
КонецЕсли;
Сообщить("Точный собственный временный файл удалён");
Исключение
Возврат "Не удалось удалить собственный временный файл: " + ОписаниеОшибки();
КонецПопытки;
КонецЕсли;
Возврат "";
КонецФункции
&НаКлиенте
Функция ЗакрытьПотокУрока(Поток)
Если Поток = Неопределено Тогда
Возврат "";
КонецЕсли;
Попытка
Поток.Закрыть();
Возврат "";
Исключение
Возврат "Не удалось закрыть собственный поток: " + ОписаниеОшибки();
КонецПопытки;
КонецФункцииРазбор по шагам
ПолучитьИмяВременногоФайла само не создаёт файл. Проверяем занятость и резервируем собственное имя через конструктор СоздатьНовый; чужое имя при конфликте не удаляется.
Создать перезаписывает только уже созданный нами пустой файл. Записываем ASCII ABC без BOM — три байта 65, 66, 67.
ОткрытьДляЗаписи пишет поверх начала: один байт Z=90 заменяет A. Ожидается ZBC, а не только Z; хвост не удаляется автоматически.
ОткрытьДляЧтения возвращает поток без возможности записи. ОткрытьДляДописывания добавляет Z в конец: получается ZBCZ, четыре байта.
Перед каждым повторным открытием предыдущий поток закрыт. Только собственный файл удаляется после успешного закрытия; ошибки операции и уборки сообщаются вместе.
Ждать возвращает фактический ФайловыйПоток из обещания; без Ждать переменная содержит Обещание, у которого нет файловых методов.
ОткрытьАсинх принимает ИмяФайла, РежимОткрытия, затем необязательный РазмерБуфера; вариант с доступом — ИмяФайла, РежимОткрытия, ДоступКФайлу, РазмерБуфера.
Нормальные закрытия ожидаются через ЗакрытьАсинх. Аварийная уборка использует доступный локальному клиенту синхронный Закрыть, не выдаётся за полностью неблокирующий код.
Как проверить результат
Восемь сравнений ожидаются Истина; данные последовательно ABC → ZBC → ZBCZ.
Последнее сообщение подтверждает удаление точного собственного временного файла. Нет такого сообщения при неудачной очистке.
Не подставляйте пути ваших XML, HTML или рабочей базы вместо автоматически полученного имени.
Ожидаемый результат
Показан полный асинхронный путь с двумя вариантами открытия и сохранением ошибок очистки.
На что обратить внимание
Нельзя переносить порядок параметров из синхронного Открыть в ОткрытьАсинх.
Слово Асинх не означает, что операция уже завершилась: используйте Ждать.
Урок содержит короткую синхронную резервацию и аварийное закрытие; это явно ограниченный локальный опыт.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.