Тип: Булево. Признак доступности записи в поток.
Полное описание, параметры и ограничения
ФайловыйПоток.ДоступнаЗапись (FileStream.CanWrite)
ФайловыйПоток (FileStream)
ДоступнаЗапись (CanWrite)
Доступен, начиная с версии 8.3.9.
Использование:
Только чтение.
Описание:
Тип: Булево.
Признак доступности записи в поток.
Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер, интеграция.
Использование в версии:
Доступен, начиная с версии 8.3.9.
Методическая информация
Практические примеры
Ожидать открытие своего файла через Асинх и Ждать
Повторяем путь 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 или рабочей базы вместо автоматически полученного имени.
Ожидаемый результат
Показан полный асинхронный путь с двумя вариантами открытия и сохранением ошибок очистки.
На что обратить внимание
Нельзя переносить порядок параметров из синхронного Открыть в ОткрытьАсинх.
Слово Асинх не означает, что операция уже завершилась: используйте Ждать.
Урок содержит короткую синхронную резервацию и аварийное закрытие; это явно ограниченный локальный опыт.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Открывать собственный файл цепочкой Начать… и оповещений
Пять отдельных операций открывают файл последовательно; каждый callback получает поток и состояние собственного опыта.
Где и как запускать
Полный модуль собственной управляемой формы: callback-цепочка, локальный клиент Windows.
Подготовка
Собственная учебная база 8.5.1.1343, тонкий или толстый клиент Windows с разрешённой локальной файловой системой. Создайте внешнюю обработку с управляемой формой, командой Выполнить и кнопкой; вставьте весь модуль одного урока.
Это клиентский модуль, не серверный и не веб-клиентский: используются локальные файлы и операции потока, доступные этому окружению. Не отключайте профиль безопасности рабочей базы ради урока.
Именованные уроки получают новое временное имя, резервируют его через СоздатьНовый и только после этого показывают методы, способные перезаписать собственный файл. Ни один путь не вводится пользователем.
Автоматический временный поток создаётся менеджером без заданного имени. Не обещаем физический файл, его расположение или отсутствие файла на диске по одному свойству потока.
Не закрывайте форму в середине асинхронной цепочки. После нормального завершения проверяйте сообщения очистки; при аварийном завершении клиента платформа может оставить временный файл до штатной уборки.
&НаКлиенте
Перем ВыполняетсяЦепочкаФайла;
&НаКлиенте
Процедура Выполнить(Команда)
Если ВыполняетсяЦепочкаФайла = Истина Тогда
ВызватьИсключение "Дождитесь завершения собственной цепочки";
КонецЕсли;
Состояние = Новый Структура("Имя,Поток,СозданСвойФайл", ПолучитьИмяВременногоФайла("bin"), Неопределено, Ложь);
ПроверкаИмени = Новый Файл(Состояние.Имя);
Если ПроверкаИмени.Существует() Тогда
ВызватьИсключение "Временное имя занято: чужой файл не открываем и не удаляем";
КонецЕсли;
Состояние.Вставить("Шаг", 0);
Состояние.Вставить("Замена", Неопределено);
Попытка
Состояние.Поток = Новый ФайловыйПоток(Состояние.Имя, РежимОткрытияФайла.СоздатьНовый, ДоступКФайлу.ЧтениеИЗапись);
Состояние.СозданСвойФайл = Истина;
Состояние.Поток.Закрыть();
Состояние.Поток = Неопределено;
ВыполняетсяЦепочкаФайла = Истина;
ФайловыеПотоки.НачатьСоздание(ОповещениеФайла(Состояние), Состояние.Имя, 8192);
Исключение
ВыполняетсяЦепочкаФайла = Ложь;
ОшибкаЗапуска = ОписаниеОшибки();
ОшибкаОчистки = ОчиститьФайлУрока(Состояние);
ВызватьИсключение ОшибкаЗапуска + " " + ОшибкаОчистки;
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Функция ОповещениеФайла(Состояние)
Возврат Новый ОписаниеОповещения("ПослеОткрытияФайла", ЭтаФорма, Состояние, "ОшибкаЦепочкиФайла", ЭтаФорма);
КонецФункции
&НаКлиенте
Процедура ПослеОткрытияФайла(Поток, Состояние) Экспорт
Состояние.Поток = Поток;
Попытка
Если Состояние.Шаг = 0 Тогда
Буфер = ПолучитьБуферДвоичныхДанныхИзСтроки("ABC", КодировкаТекста.UTF8, Ложь);
Поток.Записать(Буфер, 0, 3);
Состояние.Замена = ПолучитьБуферДвоичныхДанныхИзСтроки("Z", КодировкаТекста.UTF8, Ложь);
ИначеЕсли Состояние.Шаг = 1 Тогда
Поток.Записать(Состояние.Замена, 0, 1);
ИначеЕсли Состояние.Шаг = 2 Тогда
Прочитанный = Новый БуферДвоичныхДанных(3);
Сообщить(Поток.Прочитать(Прочитанный, 0, 3) = 3);
Сообщить(Прочитанный.Получить(0) = 90 И Прочитанный.Получить(1) = 66 И Прочитанный.Получить(2) = 67);
Сообщить(Поток.ДоступноЧтение И НЕ Поток.ДоступнаЗапись);
ИначеЕсли Состояние.Шаг = 3 Тогда
Поток.Записать(Состояние.Замена, 0, 1);
ИначеЕсли Состояние.Шаг = 4 Тогда
Сообщить(Поток.Размер() = 4);
Сообщить(Поток.ДоступноЧтение И Поток.ДоступнаЗапись);
Иначе
ВызватьИсключение "Неожиданный шаг собственной цепочки";
КонецЕсли;
Поток.Закрыть();
Состояние.Поток = Неопределено;
Состояние.Шаг = Состояние.Шаг + 1;
Если Состояние.Шаг = 1 Тогда
ФайловыеПотоки.НачатьОткрытиеДляЗаписи(ОповещениеФайла(Состояние), Состояние.Имя);
ИначеЕсли Состояние.Шаг = 2 Тогда
ФайловыеПотоки.НачатьОткрытиеДляЧтения(ОповещениеФайла(Состояние), Состояние.Имя);
ИначеЕсли Состояние.Шаг = 3 Тогда
ФайловыеПотоки.НачатьОткрытиеДляДописывания(ОповещениеФайла(Состояние), Состояние.Имя);
ИначеЕсли Состояние.Шаг = 4 Тогда
ФайловыеПотоки.НачатьОткрытие(ОповещениеФайла(Состояние), Состояние.Имя, РежимОткрытияФайла.Открыть, 8192);
Иначе
ОшибкаОчистки = ОчиститьФайлУрока(Состояние);
ВыполняетсяЦепочкаФайла = Ложь;
Если Не ПустаяСтрока(ОшибкаОчистки) Тогда
ВызватьИсключение ОшибкаОчистки;
КонецЕсли;
Сообщить("Собственная цепочка завершена");
КонецЕсли;
Исключение
ВыполняетсяЦепочкаФайла = Ложь;
ОшибкаОперации = ОписаниеОшибки();
ОшибкаОчистки = ОчиститьФайлУрока(Состояние);
ВызватьИсключение ОшибкаОперации + " " + ОшибкаОчистки;
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура ОшибкаЦепочкиФайла(Ошибка, СтандартнаяОбработка, Состояние) Экспорт
ВыполняетсяЦепочкаФайла = Ложь;
ОшибкаОчистки = ОчиститьФайлУрока(Состояние);
Если Не ПустаяСтрока(ОшибкаОчистки) Тогда
Сообщить(ОшибкаОчистки);
КонецЕсли;
СтандартнаяОбработка = Истина;
КонецПроцедуры
&НаКлиенте
Функция ОчиститьФайлУрока(Состояние)
ОшибкаЗакрытия = ЗакрытьПотокУрока(Состояние.Поток);
Если Не ПустаяСтрока(ОшибкаЗакрытия) Тогда
Возврат ОшибкаЗакрытия;
КонецЕсли;
Состояние.Поток = Неопределено;
Если Состояние.СозданСвойФайл Тогда
Попытка
СвойФайл = Новый Файл(Состояние.Имя);
Если СвойФайл.Существует() Тогда
УдалитьФайлы(Состояние.Имя);
КонецЕсли;
Если СвойФайл.Существует() Тогда
Возврат "Собственный временный файл остался после очистки";
КонецЕсли;
Сообщить("Точный собственный временный файл удалён");
Исключение
Возврат "Не удалось удалить собственный временный файл: " + ОписаниеОшибки();
КонецПопытки;
КонецЕсли;
Возврат "";
КонецФункции
&НаКлиенте
Функция ЗакрытьПотокУрока(Поток)
Если Поток = Неопределено Тогда
Возврат "";
КонецЕсли;
Попытка
Поток.Закрыть();
Возврат "";
Исключение
Возврат "Не удалось закрыть собственный поток: " + ОписаниеОшибки();
КонецПопытки;
КонецФункцииРазбор по шагам
ПолучитьИмяВременногоФайла само не создаёт файл. Проверяем занятость и резервируем собственное имя через конструктор СоздатьНовый; чужое имя при конфликте не удаляется.
Создать перезаписывает только уже созданный нами пустой файл. Записываем ASCII ABC без BOM — три байта 65, 66, 67.
ОткрытьДляЗаписи пишет поверх начала: один байт Z=90 заменяет A. Ожидается ZBC, а не только Z; хвост не удаляется автоматически.
ОткрытьДляЧтения возвращает поток без возможности записи. ОткрытьДляДописывания добавляет Z в конец: получается ZBCZ, четыре байта.
Перед каждым повторным открытием предыдущий поток закрыт. Только собственный файл удаляется после успешного закрытия; ошибки операции и уборки сообщаются вместе.
В ПослеОткрытияФайла ровно два аргумента: полученный Поток и ДополнительныеПараметры. Они передаются платформой, не конструируются из выдуманного исходного объекта.
Состояние.Шаг задаёт пять этапов: создать, запись начала, чтение, дописывание, общее открытие. Следующий этап запускается только после закрытия предыдущего.
ОписаниеОповещения содержит отдельный обработчик ошибки с тремя аргументами. СтандартнаяОбработка=Истина сохраняет штатное отображение ошибки.
Флаг формы запрещает повторный старт во время цепочки; он сбрасывается при нормальном окончании и ошибке. Короткие операции самого потока здесь синхронные, это не веб-клиентский пример.
Как проверить результат
Пять сравнений ожидаются Истина: прочитано три байта ZBC, чтение без записи, затем размер четыре и доступность чтения/записи.
Затем подтверждены удаление собственного временного файла и завершение цепочки. Повторный старт возможен только после её окончания.
Ожидаемый результат
Получена полная callback-цепочка пяти методов менеджера с реальным состоянием и очисткой.
На что обратить внимание
Не запускать все Начать… подряд вне callback: порядок завершения не будет гарантирован.
Веб-клиент имеет другие ограничения локальных операций; наличие Начать… в справке не делает этот полный модуль веб-совместимым.
НачатьСоздание перезаписывает файл; здесь он получает только имя, уже принадлежащее этому опыту.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.