Получить readonly-вид уже читающего потока

Учебные задачи

Второй readonly-вид разделяет данные и текущую позицию с исходным Поток. Он не создаёт независимую копию даже при неизменяемых двоичных данных.

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

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

Подготовка

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

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

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

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

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

  1. Получаем Вид методом самого базового Поток, не конструктором копии.

  2. Изменение позиции до 3 в виде видно в исходном потоке.

  3. Читаем оставшиеся три байта 123; до закрытия сравниваем общую позицию и размер исходных данных.

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

  1. Семь сравнений Истина, общая позиция после чтения 6.

  2. Ни один readonly-вид не получил доступ к записи, размер исходного значения не изменился.

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

Проверена общая позиция двух readonly-доступов к одним данным.

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

  1. Если нужен независимый курсор, вызовите Данные.ОткрытьПотокДляЧтения() отдельно.

  2. Закрытые виды больше не используйте; завершайте все чтения до освобождения связанных ресурсов.

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

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

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

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

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