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