Поток.Перейти

Методы · Seek

Сдвигает текущую позицию потока на заданное количество байтов относительно начальной позиции. Если указано отрицательное смещение, позиция сдвигается в направлении к началу потока. Если изменение позиции недоступно (ДоступноИзменениеПозиции установлено в Ложь), будет сгенерировано исключение.

Синтаксис

Перейти(<Смещение>, <НачальнаяПозиция>)
Полное описание, параметры и ограничения

Поток.Перейти (Stream.Seek)

Поток (Stream)

Перейти (Seek)

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

Синтаксис:
Перейти(<Смещение>, <НачальнаяПозиция>)
Параметры:

<Смещение> (обязательный)
Тип: Число.
Количество байтов, на которое нужно передвинуть позицию в потоке.

<НачальнаяПозиция> (необязательный)
Тип: ПозицияВПотоке.
Начальная позиция, от которой отсчитывается смещение.
Возвращаемое значение:
Тип: Число.
Новая позиция в потоке.
Описание:

Сдвигает текущую позицию потока на заданное количество байтов относительно начальной позиции. Если указано отрицательное смещение, позиция сдвигается в направлении к началу потока.
Если изменение позиции недоступно (ДоступноИзменениеПозиции установлено в Ложь), будет сгенерировано исключение.

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

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

Примечание:
Если результирующая позиция меньше 0, будет сгенерировано исключение.
После записи в поток за пределами текущего размера, размер потока соответствующим образом увеличивается, а все байты после старого размера потока и до новой позиции остаются в неопределенном состоянии.
См. также:
Поток, метод НачатьПереход
Поток, метод ПерейтиАсинх

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

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

Описание изменено в версии 8.3.18.

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

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

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

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, шифрование и не глобальная блокировка файла.

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

Проверить запрет записи и изменения размера readonly-потока

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

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

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

Подготовка

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

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

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

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

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

  1. Получаем readonly-вид только уже созданного собственным уроком файла.

  2. Записать и УстановитьРазмер оборачиваем по отдельности, чтобы проверить оба отказа.

  3. Счётчик сравниваем после блоков перехвата; затем читаем фактический размер и весь исходный текст.

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

  1. Два сообщения об ожидаемых запретах; четыре финальных сравнения Истина.

  2. Размер 6 и содержимое ABC123 не изменились. Пойманная ошибка не называется успешной записью.

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

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

На настоящем readonly-виде проверены два запрета изменения.

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

  1. В рабочем коде сначала проверяйте ДоступнаЗапись, а не используйте исключение для обычного управления потоком.

  2. Readonly-вид не превращает изменяемые исходные данные в резервную копию.

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

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

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

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

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