ДвоичныеДанные.ОткрытьПотокДляЧтения

Методы · OpenStreamForRead

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

Синтаксис

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

ДвоичныеДанные.ОткрытьПотокДляЧтения (BinaryData.OpenStreamForRead)

ДвоичныеДанные (BinaryData)

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

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

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

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

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

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

Примечание:
С помощью данного метода можно открыть несколько независимых потоков для одного экземпляра объекта ДвоичныеДанные. При этом позиция каждого экземпляра потока не зависит от позиции других открытых потоков.
Использование в версии:

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

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

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

Сформировать архив как ДвоичныеДанные и прочитать его из потока

Упаковываем свой временный текст в двоичные данные, открываем поток архива и проверяем список файлов без распаковки.

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

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

Подготовка

  1. Современные объекты доступны с 8.3.26; пример предназначен для вашей платформы 8.5.1.1343.

  2. Добавить принимает путь к файлу, поэтому создаётся один уникальный временный источник. Сам архив остаётся в памяти.

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


ИсходныйФайл = ПолучитьИмяВременногоФайла("txt");
Поток = Неопределено;
Чтение = Неопределено;
Попытка
    Документ = Новый ТекстовыйДокумент;
    Документ.УстановитьТекст("Учебный пакет");
    Документ.Записать(ИсходныйФайл, КодировкаТекста.UTF8);
    Запись = Новый ЗаписьФайлаАрхива;
    Запись.Добавить(ИсходныйФайл);
    ДанныеАрхива = Запись.ПолучитьДвоичныеДанные();
    Сообщить(ДанныеАрхива.Размер());
    Поток = ДанныеАрхива.ОткрытьПотокДляЧтения();
    Чтение = Новый ЧтениеФайлаАрхива(Поток);
    Сообщить(Чтение.Элементы.Количество());
    Для Каждого Элемент Из Чтение.Элементы Цикл
        Сообщить(Элемент.Имя);
    КонецЦикла;
    Чтение.Закрыть();
    Чтение = Неопределено;
    Поток.Закрыть();
    Поток = Неопределено;
    // Второе открытие того же пакета через неинициализированное чтение.
    Поток = ДанныеАрхива.ОткрытьПотокДляЧтения();
    Чтение = Новый ЧтениеФайлаАрхива;
    Чтение.Открыть(Поток);
    Если Чтение.Элементы.Количество() <> 1 Тогда
        ВызватьИсключение "Повторное чтение пакета не совпало";
    КонецЕсли;
    Чтение.Закрыть();
    Чтение = Неопределено;
    Поток.Закрыть();
    Поток = Неопределено;
    УдалитьФайлы(ИсходныйФайл);
Исключение
    Если Чтение <> Неопределено Тогда
        Чтение.Закрыть();
    КонецЕсли;
    Если Поток <> Неопределено Тогда
        Поток.Закрыть();
    КонецЕсли;
    УчебныйФайл = Новый Файл(ИсходныйФайл);
    Если УчебныйФайл.Существует() Тогда
        УдалитьФайлы(ИсходныйФайл);
    КонецЕсли;
    ВызватьИсключение;
КонецПопытки;

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

  1. Сохраняем исходный текст в один собственный временный файл.

  2. Неинициализированная запись собирает пакет; ПолучитьДвоичныеДанные возвращает готовый архив и завершает запись.

  3. Открываем новый поток чтения двоичных данных и передаём его конструктору чтения архива.

  4. После проверки количества закрываем чтение и поток; повторяем проверку через Новый без параметров и Открыть. Удаляем источник.

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

  1. Размер пакета больше нуля; в коллекции ровно один элемент с расширением txt.

  2. Оба открытия возвращают количество 1. Исходный временный файл удалён.

  3. Не вызывайте ПолучитьДвоичныеДанные после конструктора записи по имени файла: это другой способ работы, запрещённый описанием данного метода.

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

Готовый архив хранится в ДвоичныеДанные; файловый архив не создаётся.

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

  1. Современные объекты доступны с 8.3.26; пример предназначен для вашей платформы 8.5.1.1343.

  2. Не закрывайте поток раньше объекта чтения архива. После завершения не используйте закрытые объекты.

  3. Для больших пакетов память ограничена; потоковый или файловый вариант выбирается исходя из объёма данных.

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

Показать собственный PDF в поле формы без временного файла

Из учебных ячеек формируем байты PDF в памяти, читаем их в ДокументPDF и связываем с полем. Проверяем масштаб и первую страницу, диагностически читаем состояние просмотра.

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

Модуль новой управляемой формы учебной внешней обработки. Код содержит готовые процедуры с директивами; вставляйте на уровне модуля, не внутрь другого обработчика. Каждую задачу запускайте в отдельной копии формы.

Подготовка

  1. В отдельной учебной базе 8.5.1.1343 создайте внешнюю обработку УчебныеПоляДокументов85 с пустой управляемой основной формой. Запускайте в тонком клиенте Windows; веб-клиент в этот урок не входит.

  2. Не создавайте вручную УчебныйДокумент, ПолеДокумента или учебную команду. Модуль программно добавляет их при открытии формы.

  3. В свойствах формы → События назначьте ПриСозданииНаСервере. Вставьте весь код одного урока на уровне модуля, сохраните свою EPF и откройте её в учебной базе.

  4. Поле связано с реквизитом УчебныйДокумент типа ДокументPDF. Объект документа содержит данные, элемент ПолеДокумента отвечает за отображение и пользовательские действия.

  5. Документ создаётся заново из собственных констант. Книга: 3 штуки по 250, сумма 750. Реальные документы, справочники, файлы, сертификаты и сетевые адреса не используются.

  6. Каждый урок запускайте в отдельной копии формы. Изменения текста и оформления живут в памяти открытой учебной формы; код не сохраняет документ в файл, не печатает и не пишет в базу.

  7. Размеры и ограничения элемента задаются на сервере создания формы. Кнопка выполняет клиентские проверки или явно описанное учебное изменение.

  8. Фактический вид и запуск в 1С не проверены. Настройки компоновки формы, масштаб интерфейса и версия клиента могут влиять на отображение; сверяйте его вручную.

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    НовыеРеквизиты = Новый Массив;
    НовыеРеквизиты.Добавить(Новый РеквизитФормы("УчебныйДокумент", Новый ОписаниеТипов("ДокументPDF")));
    ЭтаФорма.ИзменитьРеквизиты(НовыеРеквизиты);
    ЭтаФорма.УчебныйДокумент = ПрочитатьСобственныйДокумент(СоздатьСобственныеБайтыPDF());
    Поле = Элементы.Добавить("ПолеДокумента", Тип("ПолеФормы"));
    Поле.Вид = ВидПоляФормы.ПолеPDFДокумента;
    Поле.ПутьКДанным = "УчебныйДокумент";
    Поле.Масштаб = 100;
    Поле.НомерТекущейСтраницы = 1;
    Поле.Ориентация = 0;
    Поле.Вывод = ИспользованиеВывода.Запретить;

    КомандаДействия = ЭтаФорма.Команды.Добавить("УчебноеДействие");
    КомандаДействия.Действие = "УчебноеДействие";
    КомандаДействия.Заголовок = "Проверить учебный документ";
    КомандаДействия.Подсказка = "Действие только над данными учебной формы";
    КомандаДействия.ИзменяетСохраняемыеДанные = Ложь;
    Кнопка = Элементы.Добавить("КнопкаУчебноеДействие", Тип("КнопкаФормы"));
    Кнопка.ИмяКоманды = КомандаДействия.Имя;
    Кнопка.Заголовок = КомандаДействия.Заголовок;
КонецПроцедуры

&НаКлиенте
Процедура УчебноеДействие(Команда)
    Поле = Элементы.ПолеДокумента;
    Сообщить(ТипЗнч(УчебныйДокумент) = Тип("ДокументPDF"));
    Сообщить(Поле.Масштаб = 100);
    Сообщить(Поле.НомерТекущейСтраницы = 1);
    Сообщить(Поле.Ориентация = 0);
    Сообщить("Положение состояния просмотра: " + Строка(Поле.ПоложениеСостоянияПросмотра));
    Сообщить("Тип значения положения: " + Строка(ТипЗнч(Поле.ПоложениеСостоянияПросмотра)));
КонецПроцедуры

&НаСервереБезКонтекста
Функция СоздатьСобственныеБайтыPDF()
    Таблица = Новый ТабличныйДокумент;
    Таблица.КодЯзыка = "ru";
    Таблица.Область(1, 1).Текст = "СОБСТВЕННЫЙ УЧЕБНЫЙ ОБРАЗЕЦ";
    Таблица.Область(2, 1).Текст = "Книга";
    Таблица.Область(2, 2).Текст = "3";
    Таблица.Область(2, 3).Текст = "250";
    Таблица.Область(2, 4).Текст = "750";
    Таблица.Область(1, 1, 2, 4).ЦветФона = Новый Цвет(255, 255, 210);
    Таблица.Область(, 1, , 1).ШиринаКолонки = 45;
    Поток = Новый ПотокВПамяти;
    Попытка
        Таблица.Записать(Поток, ТипФайлаТабличногоДокумента.PDF);
        Данные = Поток.ЗакрытьИПолучитьДвоичныеДанные();
    Исключение
        Поток.Закрыть();
        ВызватьИсключение;
    КонецПопытки;
    Возврат Данные;
КонецФункции

&НаСервереБезКонтекста
Функция ПрочитатьСобственныйДокумент(Данные)
    Поток = Данные.ОткрытьПотокДляЧтения();
    Попытка
        Документ = Новый ДокументPDF;
        Документ.Прочитать(Поток);
        Поток.Закрыть();
    Исключение
        Поток.Закрыть();
        ВызватьИсключение;
    КонецПопытки;
    Возврат Документ;
КонецФункции

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

  1. Собственный ТабличныйДокумент экспортируется в ПотокВПамяти, а не на диск. Исключение закрывает поток и передаётся вызывающему коду.

  2. Второй поток открывается на полученных ДвоичныеДанные. ДокументPDF читает его и закрывает при успехе и ошибке.

  3. После назначения УчебныйДокумент создаём поле с ВидПоляФормы.ПолеPDFДокумента и правильным путём к данным.

  4. Масштаб 100 — дополнительный масштаб PDF относительно масштаба формы. Номер страницы начинается с 1; документ не пустой.

  5. В установленном описании ПоложениеСостоянияПросмотра тип не указан. Поэтому читаем реальное значение и тип, не назначая выдуманное перечисление.

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

  1. Ожидаются четыре Истина и две диагностические строки состояния. На форме должна быть учебная строка Книга / 3 / 250 / 750.

  2. Откройте поток в отладчике: чтение закрыто, а PDF остаётся в реквизите формы. Файл PDF этим кодом не создаётся.

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

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

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

  1. ДокументPDF и обычный элемент ПолеPDFДокумента — не одно и то же. Здесь управляемая форма использует ПолеФормы с соответствующим видом.

  2. НомерТекущейСтраницы — единичная нумерация; 0 не является первой страницей.

  3. Не выдавайте настройки просмотра за проверку электронной подписи или защиту PDF.

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

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

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

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

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