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