Поток.ДоступноИзменениеПозиции

Свойства · CanSeek

Тип: Булево. Признак доступности произвольного изменения позиции чтения/записи в потоке.

Полное описание, параметры и ограничения

Поток.ДоступноИзменениеПозиции (Stream.CanSeek)

Поток (Stream)

ДоступноИзменениеПозиции (CanSeek)

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

Использование:
Только чтение.
Описание:
Тип: Булево.
Признак доступности произвольного изменения позиции чтения/записи в потоке.
Доступность:

Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер, интеграция.

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

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

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

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

Получить поток только для чтения и увидеть общую позицию

Readonly-вид разделяет данные и позицию с файловым потоком. Это не независимая копия файла и не запрет изменения файла всеми процессами.

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

Серверная процедура отдельной учебной базы; локальный временный файл сервера.

Подготовка

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

  2. Пример получает новое временное имя и использует СоздатьНовый, не Создать. Чужой существующий файл никогда не открывается для перезаписи.

  3. После завершения/ошибки закрываются только созданные потоки и удаляется только точное собственное имя. Это не резервная копия и не операция над вашими XML.

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

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

  1. Заполняем собственный файл и возвращаемся в начало до получения readonly-вида.

  2. Читаем реальные возможности Вид, полученного как Поток. ДоступнаЗапись ложна, но изменение позиции допускается.

  3. Переход в виде меняет общую позицию источника; чтение C1 передвигает оба до 4.

  4. Все операции выполняем до закрытия любого из связанных потоков; после этого оба больше не используем.

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

  1. Десять сравнений Истина: возможности, размеры, обе общие позиции и C1.

  2. Данные не копировались во второй файл. Чтение вида не изменяло содержимое ABC123.

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

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

Показано разделение данных и позиции между потоком и readonly-видом.

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

  1. Если нужен независимый курсор, создайте отдельную копию/поток, а не ещё один readonly-вид.

  2. Readonly относится к данному API доступа. Это не ACL, шифрование и не глобальная блокировка файла.

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

Открыть собственные двоичные данные как поток чтения

ОткрытьПотокДляЧтения возвращает Поток с позицией в начале данных. Размер шесть байтов не означает, что курсор автоматически возвращается в начало перед копированием.

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

Серверная процедура учебной базы; собственные двоичные данные в памяти, без файлов.

Подготовка

  1. Используйте отдельную учебную базу. Фрагмент без директив вставьте в тело серверной процедуры ВыполнитьПример() Экспорт общего модуля УчебныеЗадачи.

  2. Все исходные байты создаются самим примером в памяти. Файлы, сеть, справочники и документы не нужны.

  3. Запускайте задачи отдельно. После закрытия ЧтениеДанных/ЗаписьДанных не используйте этот экземпляр повторно.

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

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

  1. Кодирование ASCII без BOM создаёт неизменяемые шесть байтов в памяти.

  2. Проверяем доступность чтения/изменения позиции и отсутствие доступа к записи.

  3. Прочитать забирает AB, КопироватьВ без количества копирует только оставшийся C123.

  4. После копирования курсор 6; возвращаем его в начало отдельным Перейти. Оба потока закрываются.

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

  1. Одиннадцать сравнений Истина; прочитано 2, скопировано 4.

  2. На диске не появился файл, исходные ДвоичныеДанные по-прежнему ABC123.

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

Разобран реальный базовый Поток, полученный из своих ДвоичныеДанные.

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

  1. КопироватьВ не возвращает ДвоичныеДанные: результат — количество скопированных байтов.

  2. Для кириллицы два байта не обязательно равны двум символам. Здесь намеренно ASCII.

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

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

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

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

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