РезультатЧтенияДанных.ОткрытьПотокДляЧтения

Методы · OpenStreamForRead

Открывает поток для чтения данных.

Синтаксис

ОткрытьПотокДляЧтения()
Полное описание, параметры и ограничения

РезультатЧтенияДанных.ОткрытьПотокДляЧтения (ReadDataResult.OpenStreamForRead)

РезультатЧтенияДанных (ReadDataResult)

ОткрытьПотокДляЧтения (OpenStreamForRead)

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

Синтаксис:
ОткрытьПотокДляЧтения()
Возвращаемое значение:
Тип: Поток.

Описание:

Открывает поток для чтения данных.

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

Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение.

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

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

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

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

Открыть поток отдельной части и прочитать внутреннюю структуру

Из A-01|Книга#TAIL получаем часть до # и читаем её внутренние поля через отдельный поток. У оболочки и вложенного потока разные обязанности закрытия.

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

Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.

Подготовка

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

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

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

Данные = ПолучитьДвоичныеДанныеИзСтроки("A-01|Книга#TAIL", КодировкаТекста.UTF8, Ложь);
ВнешнееЧтение = Новый ЧтениеДанных(Данные, КодировкаТекста.UTF8);
Попытка
    Часть = ВнешнееЧтение.ПрочитатьДо("#", КодировкаТекста.UTF8);
    Если Не Часть.МаркерНайден Тогда
        ВызватьИсключение "Учебная часть не имеет конечной границы";
    КонецЕсли;
Исключение
    ВнешнееЧтение.Закрыть();
    ВызватьИсключение;
КонецПопытки;
ВнешнееЧтение.Закрыть();
ВнутреннийПоток = Часть.ОткрытьПотокДляЧтения();
ВнутреннееЧтение = Новый ЧтениеДанных(ВнутреннийПоток, КодировкаТекста.UTF8);
Попытка
    Код = ВнутреннееЧтение.ПрочитатьДо("|", КодировкаТекста.UTF8);
    Если Не Код.МаркерНайден Тогда
        ВызватьИсключение "Учебная часть не имеет границы кода";
    КонецЕсли;
    Сообщить(ПолучитьСтрокуИзДвоичныхДанных(Код.ПолучитьДвоичныеДанные(), КодировкаТекста.UTF8) = "A-01");
    Сообщить(ВнутреннееЧтение.ПрочитатьСимволы() = "Книга");
Исключение
    ВнутреннееЧтение.Закрыть();
    ВнутреннийПоток.Закрыть();
    ВызватьИсключение;
КонецПопытки;
ВнутреннееЧтение.Закрыть();
ВнутреннийПоток.Закрыть();

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

  1. Внешний читатель выделяет часть до # и проверяет её обязательную границу.

  2. РезультатЧтенияДанных открывает собственный поток для чтения этой части. TAIL в него не входит.

  3. Создаём новую оболочку ЧтениеДанных из потока, а не копируем всю часть в буфер.

  4. Во внутренней структуре | отделяет код A-01 от названия Книга.

  5. После использования закрываем сначала внутреннюю оболочку, затем переданный ей поток. Это поток, созданный нашим кодом, а не принадлежащий оболочке автоматически.

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

  1. Оба сравнения Истина: внутренний код A-01, внутреннее название Книга.

  2. Внутренний читатель не видит #TAIL и его ресурсы освобождаются также при исключении.

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

Разобрана вложенная структура части без полного промежуточного буфера.

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

  1. Не путайте ОткрытьПотокДляЧтения у ДвоичныеДанные и у РезультатЧтенияДанных: объекты разные.

  2. Этот приём не гарантирует автоматически малое потребление памяти всей цепочки: источник здесь уже создан в памяти.

  3. Не оставляйте самостоятельно открытый поток незакрытым после закрытия его оболочки.

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

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

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

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

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