Возвращает поток, который разделяет данные и текущую позицию с данным потоком, но не разрешает запись.
Синтаксис
ПолучитьПотокТолькоДляЧтения()Полное описание, параметры и ограничения
ПотокВПамяти.ПолучитьПотокТолькоДляЧтения (MemoryStream.GetReadonlyStream)
ПотокВПамяти (MemoryStream)
ПолучитьПотокТолькоДляЧтения (GetReadonlyStream)
Доступен, начиная с версии 8.3.9.
Синтаксис:
ПолучитьПотокТолькоДляЧтения()
Возвращаемое значение:
Тип: Поток.
Описание:
Возвращает поток, который разделяет данные и текущую позицию с данным потоком, но не разрешает запись.
Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер, интеграция.
Использование в версии:
Доступен, начиная с версии 8.3.9.
Методическая информация
Практические примеры
Отличить поток только для чтения от независимой копии
Читающий поток разделяет данные и текущую позицию с исходным: запрет записи не создаёт неизменяемый снимок.
Где и как запускать
Модуль пустой управляемой формы учебной внешней обработки; тонкий или толстый клиент Windows. Вставьте весь модуль. Это не серверный код.
Подготовка
Создайте учебную внешнюю обработку с пустой управляемой основной формой. Создайте команду УчебныйПример и кнопку этой команды.
В свойстве команды Действие выберите процедуру УчебныйПример. Вставьте полный приведённый модуль формы.
Откройте EPF в тонком или толстом клиенте Windows и нажмите кнопку. Не переносите Ждать и Асинх в серверный общий модуль.
Пример работает только со своими данными в памяти; записи в базу, файлы и сеть нет.
Эти методы проверяются по установленной справке 8.5.1.1343, но фактический запуск в 1С здесь не подтверждён.
&НаКлиенте
Процедура УчебныйПример(Команда)
Источник = Неопределено;
ТолькоЧтение = Неопределено;
ОшибкаОперации = "";
Попытка
Источник = Новый ПотокВПамяти;
ИсходныйБуфер = Новый БуферДвоичныхДанных(5);
Для ИндексБайта = 0 По 4 Цикл
ИсходныйБуфер.Установить(ИндексБайта, (ИндексБайта + 1) * 10);
КонецЦикла;
Источник.Записать(ИсходныйБуфер, 0, 3);
Источник.Перейти(0, ПозицияВПотоке.Начало);
ТолькоЧтение = Источник.ПолучитьПотокТолькоДляЧтения();
Сообщить(Не ТолькоЧтение.ДоступнаЗапись);
БуферЧтения = Новый БуферДвоичныхДанных(3);
Сообщить(ТолькоЧтение.Прочитать(БуферЧтения, 0, 1) = 1);
Сообщить(Источник.ТекущаяПозиция() = 1);
Изменение = Новый БуферДвоичныхДанных(1);
Изменение.Установить(0, 42);
Источник.Записать(Изменение, 0, 1);
Сообщить(ТолькоЧтение.ТекущаяПозиция() = 2);
ТолькоЧтение.Перейти(0, ПозицияВПотоке.Начало);
Сообщить(Источник.ТекущаяПозиция() = 0);
Сообщить(ТолькоЧтение.Прочитать(БуферЧтения, 0, 3) = 3);
Сообщить(БуферЧтения.Получить(0) = 10);
Сообщить(БуферЧтения.Получить(1) = 42);
Сообщить(БуферЧтения.Получить(2) = 30);
Исключение
ОшибкаОперации = ОписаниеОшибки();
КонецПопытки;
ОшибкиЗакрытия = ЗакрытьСобственныеПотоки(ТолькоЧтение, Источник);
Если Не ПустаяСтрока(ОшибкаОперации) Или Не ПустаяСтрока(ОшибкиЗакрытия) Тогда
ВызватьИсключение ОшибкаОперации + " " + ОшибкиЗакрытия;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Функция ЗакрытьСобственныеПотоки(Первый, Второй)
Ошибки = "";
Если Первый <> Неопределено Тогда
Попытка
Первый.Закрыть();
Исключение
Ошибки = "Первый поток не закрыт: " + ОписаниеОшибки();
КонецПопытки;
КонецЕсли;
Если Второй <> Неопределено Тогда
Попытка
Второй.Закрыть();
Исключение
Ошибки = Ошибки + " Второй поток не закрыт: " + ОписаниеОшибки();
КонецПопытки;
КонецЕсли;
Возврат Ошибки;
КонецФункцииРазбор по шагам
Создаём собственный поток 10/20/30 и устанавливаем позицию 0. ПолучитьПотокТолькоДляЧтения возвращает обёртку типа Поток, не отдельный ПотокВПамяти с копией байтов.
После чтения одного байта через обёртку текущая позиция исходного потока тоже 1.
Через исходный записывающий поток заменяем второй байт на 42. Текущая позиция обёртки становится 2, потому что позиция общая.
Переход обёртки к началу меняет позицию исходного. Чтение снова получает 10/42/30, то есть видит изменения общего содержимого.
После опыта больше не используем ни один поток; отдельно пытаемся закрыть обе принадлежащие примеру ссылки и сообщаем ошибки закрытия.
Как проверить результат
Девять сравнений дают Истина; фактически прочитан пакет 10/42/30.
Не было попытки записи через поток только для чтения и не было изменения внешних данных.
Ожидаемый результат
На конкретных байтах показано общее содержимое и общая позиция читающей обёртки.
На что обратить внимание
Только чтение защищает этот интерфейс записи, а не исходный поток от другого владельца.
Для независимого снимка нужно отдельно копировать данные; данный метод такого обещания не даёт.
Не используйте потоки после завершения очистки и не выводите из этого примера неподтверждённые гарантии многопоточности.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.