ПотокВПамяти.Закрыть

Методы · Close

Вызов данного метода завершает работу с потоком. При попытке вызвать любой метод объекта, кроме метода Закрыть, будет вызвано исключение. При повторном вызове данного метода никаких действий выполняться не будет. Выполняемое действие зависит от используемого типа потока.

Синтаксис

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

ПотокВПамяти.Закрыть (MemoryStream.Close)

ПотокВПамяти (MemoryStream)

Закрыть (Close)

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

Синтаксис:
Закрыть()
Описание:

Вызов данного метода завершает работу с потоком. При попытке вызвать любой метод объекта, кроме метода Закрыть, будет вызвано исключение.
При повторном вызове данного метода никаких действий выполняться не будет.
Выполняемое действие зависит от используемого типа потока.

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

Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер, интеграция.

См. также:
Поток, метод ЗакрытьАсинх
Поток, метод НачатьЗакрытие

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

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

Описание изменено в версии 8.3.18.

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

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

Выгрузить сертификат в собственный поток

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

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

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

Подготовка

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

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

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

  4. В пример встроен отдельный публичный учебный X.509-сертификат Syntax Guide Training Only. Его закрытый ключ не сохранён, сертификат не установлен в хранилище ОС и не признан доверенным.

  5. Используйте Windows-клиент или Windows-сервер 1С 8.5.1.1343. Проверка других ОС, веб-клиента и расширений криптографии этим уроком не подтверждена.

  6. Не заменяйте учебный сертификат рабочим для первого запуска. Код ничего не подписывает, не импортирует в хранилища, не обращается к OCSP/CRL и не просит пароль.

ИсходныеДанные = Base64Значение("MIIC+jCCAeKgAwIBAgIBVTANBgkqhkiG9w0BAQsFADAlMSMwIQYDVQQDDBpTeW50YXggR3VpZGUgVHJhaW5pbmcgT25seTAeFw0yMDAxMDEwMDAwMDBaFw0zNTEyMzEwMDAwMDBaMCUxIzAhBgNVBAMMGlN5bnRheCBHdWlkZSBUcmFpbmluZyBPbmx5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkraGtF6mSMHQWI0lIdDxzNjLTB0VHmtLUYEIxXFFJepQtyMGWZ9rfpbTglFp8wpsw+Wc09FQyDFuKsNz3cBcBBx7fTmJVuYzfrXjhDECNqEoKMEf+Qrim3WsVKA/Qr8IMnzq1qdnA1pLgaaKyscfCJkw9W1yoTlLV3PmGs6h6gP1/KXwe+zKN5r3Jl0IVk8RXTLAeyqN01lCuyzaeSYm/v2YS88LdaJ/nkdFqy5QjRXfm7EOCW7eCZlCBwW0EvGhUarZxWlq04lPs9qu3aC3/6gY/scE2vY1jeZV2VpV0lLQpU5gVdjVGI4YQmfgkb8jYtV5U7FQ1KQ6Poji/ort6wIDAQABozUwMzAMBgNVHRMBAf8EAjAAMA4GA1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcDAjANBgkqhkiG9w0BAQsFAAOCAQEARoo1FJJKKkaZXyFl1tlYj8K7xvryXwhb+tCaFvdXuON27YC3/YIHLUT9sCF9o76VIT8dsVMpK0Qo+VV0FIvqRcB+u6SmyJ+Y7590mzd5P1CSt8Y/4BNV2LosYxhcdVczs26PWHL5GXyBMWRxtBjNsnTeMKh4/WIMrplAr0IOJCmjIeKhv0JbQacsNqhmpe7JdgtBYC4Rrn3ajdD99HZREmyLR/iJrh6W4IGqSN0MGT0xL/mLI0GsTp9JhHDF3o8bmC1yMDlLOoAZp7M072bzfDsKFPg4ATQp/hhbtsTdS/LXrd9cLehZ7ThH6ljL8y2JbALD+6HPnT6Sv+Mg0Wq0MA==");
Сертификат = Новый СертификатКриптографии(ИсходныеДанные);
Поток = Новый ПотокВПамяти;
Попытка
    Сертификат.Выгрузить(Поток);
    Выгруженные = Поток.ЗакрытьИПолучитьДвоичныеДанные();
Исключение
    Поток.Закрыть();
    ВызватьИсключение;
КонецПопытки;
Сообщить(Base64Строка(Выгруженные) = Base64Строка(ИсходныеДанные));
Сообщить(Выгруженные.Размер() = ИсходныеДанные.Размер());

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

  1. Создаём свой поток, не открываем произвольный путь и не получаем файл из хранилища ОС.

  2. Выгрузить получает объект потока. В этом варианте результат берём из потока, а не считаем возвращаемое значение байтами.

  3. ЗакрытьИПолучитьДвоичныеДанные завершает поток и возвращает его содержимое; при исключении поток также закрывается.

  4. Проверяем размер и полное содержимое собственного публичного образца.

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

  1. Два сравнения Истина; размер равен исходным DER-данным.

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

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

Публичный сертификат выгружен в поток и проверен побайтово.

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

  1. Потоковый вариант не импортирует сертификат в ОС.

  2. Нельзя закрыть поток до вызова выгрузки или использовать его после ЗакрытьИПолучитьДвоичныеДанные.

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

Показать собственный 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С» и не аффилирован с ней.