Вызов данного метода завершает работу с потоком. При попытке вызвать любой метод объекта, кроме метода Закрыть, будет вызвано исключение. При повторном вызове данного метода никаких действий выполняться не будет. Выполняемое действие зависит от используемого типа потока.
Синтаксис
Закрыть()Полное описание, параметры и ограничения
Поток.Закрыть (Stream.Close)
Поток (Stream)
Закрыть (Close)
Доступен, начиная с версии 8.3.9.
Синтаксис:
Закрыть()
Описание:
Вызов данного метода завершает работу с потоком. При попытке вызвать любой метод объекта, кроме метода Закрыть, будет вызвано исключение.
При повторном вызове данного метода никаких действий выполняться не будет.
Выполняемое действие зависит от используемого типа потока.
Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер, интеграция.
См. также:
Поток, метод ЗакрытьАсинх
Поток, метод НачатьЗакрытие
Использование в версии:
Доступен, начиная с версии 8.3.9.
Описание изменено в версии 8.3.18.
Методическая информация
Практические примеры
Получить поток только для чтения и увидеть общую позицию
Readonly-вид разделяет данные и позицию с файловым потоком. Это не независимая копия файла и не запрет изменения файла всеми процессами.
Где и как запускать
Серверная процедура отдельной учебной базы; локальный временный файл сервера.
Подготовка
Каждый фрагмент запускайте отдельно в серверной процедуре своей учебной базы. Файл создаётся во временном каталоге сервера, не на компьютере клиента.
Пример получает новое временное имя и использует СоздатьНовый, не Создать. Чужой существующий файл никогда не открывается для перезаписи.
После завершения/ошибки закрываются только созданные потоки и удаляется только точное собственное имя. Это не резервная копия и не операция над вашими XML.
ИмяФайла = ПолучитьИмяВременногоФайла("bin");
УчебныйФайл = Новый Файл(ИмяФайла);
Если УчебныйФайл.Существует() Тогда
ВызватьИсключение "Временное имя уже занято: чужой файл не открываем";
КонецЕсли;
Поток = Неопределено;
Вид = Неопределено;
Копия = Неопределено;
СозданСвойФайл = Ложь;
Попытка
Поток = Новый ФайловыйПоток(ИмяФайла, РежимОткрытияФайла.СоздатьНовый, ДоступКФайлу.ЧтениеИЗапись);
СозданСвойФайл = Истина;
Буфер = ПолучитьБуферДвоичныхДанныхИзСтроки("ABC123", КодировкаТекста.UTF8, Ложь);
Поток.Записать(Буфер, 0, Буфер.Размер);
Поток.Перейти(0, ПозицияВПотоке.Начало);
Вид = Поток.ПолучитьПотокТолькоДляЧтения();
Сообщить(Вид.ДоступноЧтение);
Сообщить(Не Вид.ДоступнаЗапись);
Сообщить(Вид.ДоступноИзменениеПозиции);
Сообщить(Вид.Размер() = 6);
Сообщить(Вид.Перейти(2, ПозицияВПотоке.Начало) = 2);
Сообщить(Поток.ТекущаяПозиция() = 2);
Часть = Новый БуферДвоичныхДанных(2);
Сообщить(Вид.Прочитать(Часть, 0, 2) = 2);
Сообщить(ПолучитьСтрокуИзБуфераДвоичныхДанных(Часть, КодировкаТекста.UTF8) = "C1");
Сообщить(Вид.ТекущаяПозиция() = 4);
Сообщить(Поток.ТекущаяПозиция() = 4);
Исключение
Если Вид <> Неопределено Тогда
Вид.Закрыть();
КонецЕсли;
Если Копия <> Неопределено Тогда
Копия.Закрыть();
КонецЕсли;
Если Поток <> Неопределено Тогда
Поток.Закрыть();
КонецЕсли;
Если СозданСвойФайл И УчебныйФайл.Существует() Тогда
УдалитьФайлы(ИмяФайла);
КонецЕсли;
ВызватьИсключение;
КонецПопытки;
Если Вид <> Неопределено Тогда
Вид.Закрыть();
КонецЕсли;
Если Копия <> Неопределено Тогда
Копия.Закрыть();
КонецЕсли;
Если Поток <> Неопределено Тогда
Поток.Закрыть();
КонецЕсли;
Если СозданСвойФайл Тогда
УдалитьФайлы(ИмяФайла);
КонецЕсли;
Сообщить(Не УчебныйФайл.Существует());Разбор по шагам
Заполняем собственный файл и возвращаемся в начало до получения readonly-вида.
Читаем реальные возможности Вид, полученного как Поток. ДоступнаЗапись ложна, но изменение позиции допускается.
Переход в виде меняет общую позицию источника; чтение C1 передвигает оба до 4.
Все операции выполняем до закрытия любого из связанных потоков; после этого оба больше не используем.
Как проверить результат
Десять сравнений Истина: возможности, размеры, обе общие позиции и C1.
Данные не копировались во второй файл. Чтение вида не изменяло содержимое ABC123.
Последнее сообщение Истина: точный собственный временный файл удалён после закрытия ресурсов.
Ожидаемый результат
Показано разделение данных и позиции между потоком и readonly-видом.
На что обратить внимание
Если нужен независимый курсор, создайте отдельную копию/поток, а не ещё один readonly-вид.
Readonly относится к данному API доступа. Это не ACL, шифрование и не глобальная блокировка файла.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Дождаться записи и чтения карты через оповещения
Запись и чтение выполняются последовательно через два callback. Имя принадлежит только этому уроку; успешный callback сам по себе не подменяет проверку содержимого.
Где и как запускать
Полный модуль управляемой формы учебной обработки Windows: серверная функция, два callback, обработчик ошибки и ПередЗакрытием. Не вставляйте внутрь другого обработчика.
Подготовка
Создайте НОВУЮ пустую файловую учебную базу, не копию рабочего каталога. В Конфигураторе задайте корню имя Учебная85. Не добавляйте эти объекты в рабочую УТ/КА2/УНФ/БП.
Справочники → Добавить: имя УчебныеТовары. Длина кода 10, тип кода Строка, автонумерация и контроль уникальности включены, длина наименования 100.
Для УчебныеТовары включите иерархию групп и элементов. Добавьте реквизиты Артикул (Строка, длина 20) и Цена (Число, 12 цифр, 2 дробных, неотрицательное). Проверка заполнения для этих учебных реквизитов не устанавливается.
Добавьте табличную часть Штрихкоды: Штрихкод (Строка, длина 20) и Основной (Булево). Обновите конфигурацию базы данных. Модули объектов оставьте пустыми.
Создайте серверный общий модуль УчебныеЗадачи и команду учебной обработки, вызывающую ВыполнитьПример() Экспорт. Каждый фрагмент выполняйте отдельно, не склеивайте их в одну процедуру.
В этой отдельной пустой конфигурации Учебная85 добавьте Задачи → УчебнаяЗадача: длина номера 9, тип Строка, автонумерация; наименование длиной 100. Добавьте реквизит Комментарий (Строка, 100), без проверки заполнения.
Добавьте Бизнес-процессы → УчебныйПроцесс: длина номера 9, тип Строка, автонумерация, реквизит Комментарий (Строка, 100), без проверки заполнения. В свойстве Задача выберите УчебнаяЗадача.
Карта маршрута: одна точка старта Старт → одна одиночная точка действия ПодготовитьКнигу → одна точка завершения Финиш. Соедините их стрелками; в представлении точки действия укажите Подготовить учебную книгу.
Адресацию задач, групповые/условные/вложенные точки и обработчики маршрута для этой задачи не добавляйте. Модули задачи и процесса, подписки и внешние действия должны быть пустыми. Обновите конфигурацию базы данных.
Все имена здесь относятся к новым учебным объектам, не к рабочей КА2/УНФ/УТ/БП. Каждый фрагмент запускайте отдельно на сервере в ВыполнитьПример() Экспорт общего модуля УчебныеЗадачи.
В этих упражнениях процесс не записывается и не запускается. Исследуется копия карты маршрута в памяти; печать на физический принтер не вызывается.
Полный код этого урока вставьте в модуль управляемой формы учебной внешней обработки в Windows, без помещения процедур внутрь другого обработчика. Сервер возвращает только свои двоичные данные; новый процесс не записывает и не запускает.
Сделайте команду ВыполнитьУрок и назначьте соответствующий клиентский обработчик из кода. Этот вариант предназначен для тонкого или толстого клиента Windows, не для веб-клиента.
В свойствах управляемой формы назначьте её событие ПередЗакрытием приведённой процедуре. Сигнатура содержит четыре штатных параметра; не заменяйте её сигнатурой обычной формы.
Не завершайте процесс 1С принудительно и не выбирайте выход вопреки предупреждению. При принудительном завершении callback и очистка не гарантируются; собственное имя для отдельной ручной очистки сообщается при ошибке удаления.
Перем КартаОперация;
&НаСервереБезКонтекста
Функция ПолучитьСвоюКартуБайтами()
Если Метаданные.БизнесПроцессы.Найти("УчебныйПроцесс") = Неопределено
Или Метаданные.Задачи.Найти("УчебнаяЗадача") = Неопределено Тогда
ВызватьИсключение "Сначала создайте учебные процесс, задачу и карту маршрута";
КонецЕсли;
Процесс = БизнесПроцессы.УчебныйПроцесс.СоздатьБизнесПроцесс();
Схема = Процесс.ПолучитьКартуМаршрута();
Если ТипЗнч(Схема) <> Тип("ГрафическаяСхема") Тогда
ВызватьИсключение "Учебный процесс не вернул графическую схему";
КонецЕсли;
Поток = Новый ПотокВПамяти;
Попытка
Схема.Записать(Поток);
Байты = Поток.ЗакрытьИПолучитьДвоичныеДанные();
Исключение
Поток.Закрыть();
ВызватьИсключение;
КонецПопытки;
Возврат Байты;
КонецФункции
&НаКлиенте
Процедура ВыполнитьУрок(Команда)
Если КартаОперация = Истина Тогда
Сообщить("Дождитесь завершения собственной записи или чтения");
Возврат;
КонецЕсли;
ИсходныеДанные = ПолучитьСвоюКартуБайтами();
ПотокЧтения = ИсходныеДанные.ОткрытьПотокДляЧтения();
Схема = Новый ГрафическаяСхема;
Попытка
Схема.Прочитать(ПотокЧтения);
Исключение
ПотокЧтения.Закрыть();
ВызватьИсключение;
КонецПопытки;
ПотокЧтения.Закрыть();
Схема.ПолеСлева = 15;
Состояние = Новый Структура("Схема,ИмяФайла,СвойФайл,ИсходноеКоличество", Схема, ПолучитьИмяВременногоФайла("grs"), Ложь, Схема.ЭлементыГрафическойСхемы.Количество());
ПотокФайла = Неопределено;
КартаОперация = Истина;
Попытка
ПотокФайла = Новый ФайловыйПоток(Состояние.ИмяФайла, РежимОткрытияФайла.СоздатьНовый);
Состояние.СвойФайл = Истина;
ПотокФайла.Закрыть();
ПотокФайла = Неопределено;
Оповещение = Новый ОписаниеОповещения("КартаЗаписана", ЭтотОбъект, Состояние, "ОшибкаКарты", ЭтотОбъект);
Состояние.Схема.НачатьЗапись(Оповещение, Состояние.ИмяФайла);
Исключение
Если ПотокФайла <> Неопределено Тогда
ПотокФайла.Закрыть();
КонецЕсли;
ЗавершитьСвоюКарту(Состояние);
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура КартаЗаписана(Результат, Состояние) Экспорт
Попытка
Если Результат = Ложь Тогда
ВызватьИсключение "Запись собственной схемы не завершена";
КонецЕсли;
ПроверкаФайла = Новый Файл(Состояние.ИмяФайла);
Если Не ПроверкаФайла.Существует() Тогда
ВызватьИсключение "Собственного файла карты нет";
КонецЕсли;
Сообщить("Результат callback записи: " + Строка(Результат) + "; содержимое будет проверено чтением");
Состояние.Вставить("Копия", Новый ГрафическаяСхема);
Оповещение = Новый ОписаниеОповещения("КартаПрочитана", ЭтотОбъект, Состояние, "ОшибкаКарты", ЭтотОбъект);
Состояние.Копия.НачатьЧтение(Оповещение, Состояние.ИмяФайла);
Исключение
ЗавершитьСвоюКарту(Состояние);
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура КартаПрочитана(Результат, Состояние) Экспорт
Попытка
Сообщить("Результат callback чтения: " + Строка(Результат));
Если Состояние.Копия.ЭлементыГрафическойСхемы.Количество() <> Состояние.ИсходноеКоличество
Или Состояние.Копия.ПолеСлева <> 15 Тогда
ВызватьИсключение "Содержимое собственной копии не совпало";
КонецЕсли;
Если Не ЗавершитьСвоюКарту(Состояние) Тогда
ВызватьИсключение "Карта прочитана, но свой временный файл не удалён";
КонецЕсли;
Сообщить("Собственная карта прочитана, структура и поле проверены, файл удалён");
Исключение
ЗавершитьСвоюКарту(Состояние);
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура ОшибкаКарты(ИнформацияОбОшибке, Состояние, СтандартнаяОбработка) Экспорт
Сообщить("Ошибка собственной операции карты: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
ЗавершитьСвоюКарту(Состояние);
СтандартнаяОбработка = Истина;
КонецПроцедуры
&НаКлиенте
Функция ЗавершитьСвоюКарту(Состояние)
КартаОперация = Ложь;
Попытка
Если Состояние.СвойФайл Тогда
УдалитьФайлы(Состояние.ИмяФайла);
ПроверкаФайла = Новый Файл(Состояние.ИмяФайла);
Если ПроверкаФайла.Существует() Тогда
ВызватьИсключение "Свой файл остался после удаления";
КонецЕсли;
Состояние.СвойФайл = Ложь;
КонецЕсли;
Исключение
Сообщить("Не удалось убрать только собственный файл " + Состояние.ИмяФайла + ": " + ОписаниеОшибки());
Возврат Ложь;
КонецПопытки;
Возврат Истина;
КонецФункции
&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
Если КартаОперация = Истина Тогда
Отказ = Истина;
ТекстПредупреждения = "Дождитесь завершения своей операции и очистки файла карты";
Сообщить(ТекстПредупреждения);
КонецЕсли;
КонецПроцедурыРазбор по шагам
Сервер возвращает собственные байты карты; клиент читает их в отдельную схему и задаёт поле 15.
Флаг КартаОперация защищает от повторного запуска. СвойФайл становится Истина только после эксклюзивного создания, резервирующий поток закрывается до НачатьЗапись.
КартаЗаписана получает результат записи и дополнительные параметры. Ложь означает отказ; Неопределено не выдаётся за подтверждённую запись, содержимое проверяется чтением.
НачатьЧтение вызывается только из callback завершившейся записи и получает новый пустой объект Копия.
КартаПрочитана сравнивает число элементов и поле, после чего удаляет только свой файл и проверяет его отсутствие.
Ошибки операции и очистки сообщаются отдельно. Итоговое сообщение успеха не появляется при неудаче удаления.
ПередЗакрытием препятствует обычному закрытию при активной операции. Принудительный выход всё равно требует отдельного внимания.
Как проверить результат
Повторное нажатие во время операции сообщает ожидание, не открывает второй писатель.
При успешном завершении есть сообщение о проверенной карте и удалённом собственном файле; бизнес-процесс не записан и не запущен.
При отказе или ошибке нет сообщения успеха; стандартная обработка ошибки включена, проблемы очистки не скрыты.
Ожидаемый результат
Проверена последовательность двух callback и точная очистка собственного файла.
На что обратить внимание
НачатьЧтение не вызывается сразу после НачатьЗапись: запись могла ещё выполняться.
Эта файловая цепочка Windows не переносится напрямую в веб-клиент, где НачатьЧтение недоступен.
Callback записи может иметь Неопределено; результат чтения и проверки содержимого важнее объявления успешной записи по одному флагу.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.