ЗаписьPDF.ЗаписатьУдалениеВложений

Методы · WriteAttachmentsDeletion

Записывает в PDF-документ информацию о удалении вложения. Если в метод передан файл версии меньше 1.5, то генерируется исключение.

Синтаксис

ЗаписатьУдалениеВложений(<Вложения>)
Полное описание, параметры и ограничения

ЗаписьPDF.ЗаписатьУдалениеВложений (PDFWriter.WriteAttachmentsDeletion)

ЗаписьPDF (PDFWriter)

ЗаписатьУдалениеВложений (WriteAttachmentsDeletion)

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

Синтаксис:
ЗаписатьУдалениеВложений(<Вложения>)
Параметры:

<Вложения> (необязательный)
Тип: Массив.
Массив, содержащий имена файлов.
Описание:

Записывает в PDF-документ информацию о удалении вложения.
Если в метод передан файл версии меньше 1.5, то генерируется исключение.

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

Тонкий клиент, сервер, толстый клиент.

См. также:
ЗаписьPDF, метод ЗаписатьУдалениеВложенийАсинх
ЗаписьPDF, метод НачатьЗаписьУдаленияВложений

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

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

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

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

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

Удалить только собственное вложение с проверкой версии PDF

До записи удаления проверяем заголовок собственного PDF: метод требует версию не ниже 1.5. Другие документы и файлы не затрагиваются.

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

Серверная процедура отдельной учебной базы; собственный PDF и потоки в памяти.

Подготовка

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

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

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

  4. Документ PDF строится из собственной ячейки Книга: 3 шт. Внешний PDF, установленный PDF-редактор, криптографический сертификат и реальные персональные данные не нужны.

  5. Файловый путь нигде не используется. Для просмотра в PDF-программе сохраните только полученные собственные двоичные данные в отдельно выбранный новый учебный файл.

Вложения = Новый КоллекцияВложенийPDF;
ТекстJSON = "{""товар"":""Книга"",""количество"":3}";
БайтыJSON = ПолучитьДвоичныеДанныеИзСтроки(ТекстJSON, КодировкаТекста.UTF8, Ложь);
Вложения.Добавить("товар.json", БайтыJSON, "application/json", ТипСвязиВложенияPDF.Данные);
Чтение = Неопределено;
Запись = Неопределено;
ПотокЧтения = Неопределено;
ПотокPDF = Новый ПотокВПамяти;
Документ = Новый ТабличныйДокумент;
Документ.Область("A1").Текст = "Книга: 3 шт.";
Документ.Область("A1").ЦветТекста = Новый Цвет(30, 90, 180);
Попытка
    Документ.Записать(ПотокPDF, ТипФайлаТабличногоДокумента.PDF, Вложения);
    ПотокPDF.Перейти(0, ПозицияВПотоке.Начало);
    Заголовок = Новый БуферДвоичныхДанных(8);
    Если ПотокPDF.Прочитать(Заголовок, 0, 8) <> 8 Тогда
        ВызватьИсключение "Недостаточно байтов для учебного заголовка PDF";
    КонецЕсли;
    СтрокаЗаголовка = ПолучитьСтрокуИзБуфераДвоичныхДанных(Заголовок, КодировкаТекста.UTF8);
    Если СтрокаЗаголовка <> "%PDF-1.5" И СтрокаЗаголовка <> "%PDF-1.6" И СтрокаЗаголовка <> "%PDF-1.7" И СтрокаЗаголовка <> "%PDF-2.0" Тогда
        ВызватьИсключение "Этот учебный PDF не прошёл явную проверку поддерживаемого заголовка: удаление не выполняется";
    КонецЕсли;
    ПотокPDF.Перейти(0, ПозицияВПотоке.Начало);
    Запись = Новый ЗаписьPDF(ПотокPDF);
    ИменаУдаления = Новый Массив;
    ИменаУдаления.Добавить("товар.json");
    Запись.ЗаписатьУдалениеВложений(ИменаУдаления);
    Запись.Закрыть();
    Запись = Неопределено;
    БайтыPDF = ПотокPDF.ЗакрытьИПолучитьДвоичныеДанные();
    ПотокPDF = Неопределено;
    ПотокЧтения = БайтыPDF.ОткрытьПотокДляЧтения();
    Чтение = Новый ЧтениеPDF(ПотокЧтения);
    Прочитанные = Чтение.ПолучитьВложения();
    Сообщить(Прочитанные.Количество() = 0);
    Сообщить(Прочитанные.Найти("товар.json") = Неопределено);
Исключение
    Если Чтение <> Неопределено Тогда
        Чтение.Закрыть();
    КонецЕсли;
    Если Запись <> Неопределено Тогда
        Запись.Закрыть();
    КонецЕсли;
    Если ПотокЧтения <> Неопределено Тогда
        ПотокЧтения.Закрыть();
    КонецЕсли;
    Если ПотокPDF <> Неопределено Тогда
        ПотокPDF.Закрыть();
    КонецЕсли;
    ВызватьИсключение;
КонецПопытки;
Если Чтение <> Неопределено Тогда
    Чтение.Закрыть();
КонецЕсли;
Если Запись <> Неопределено Тогда
    Запись.Закрыть();
КонецЕсли;
Если ПотокЧтения <> Неопределено Тогда
    ПотокЧтения.Закрыть();
КонецЕсли;
Если ПотокPDF <> Неопределено Тогда
    ПотокPDF.Закрыть();
КонецЕсли;

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

  1. Исходный PDF принадлежит этому упражнению и содержит одно своё вложение.

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

  3. ЗаписатьУдалениеВложений получает массив имён, не коллекцию объектов ВложениеPDF.

  4. После закрытия записи проверяем отсутствие имени независимым чтением. Байты удалённого вложения могут физически сохраняться внутри истории PDF.

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

  1. Для поддержанного заголовка две проверки Истина; при неподдержанном — объяснимое исключение до изменения.

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

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

Удалено собственное вложение из перечня документа; предварительно проверено требование версии.

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

  1. Проверка восьми байтов — ограниченная учебная проверка своего экспорта, не полноценная валидация произвольного PDF.

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

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

Удалить только собственное вложение, не файл PDF

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

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

Полный серверный общий модуль УчебныеФайлыPDF; свой файл на серверной машине.

Подготовка

  1. Работайте только в отдельной своей конфигурации УчебнаяКонфигурацияСинтаксиса, 8.5.1.1343. Исходная таблица Книга / 3 / 250 / 750 создаётся полностью в коде.

  2. Для синхронных уроков вставьте полный модуль в серверный общий модуль УчебныеФайлыPDF и вызовите ВыполнитьПример() своей серверной командой. Новый временный файл будет на серверной машине, не обязательно на вашем ПК.

  3. Для асинхронного и callback-урока вставьте полный код в модуль управляемой формы внешней обработки. Создайте команду Выполнить, обработчик Выполнить, кнопку. Используйте толстый клиент Windows; файл создаётся на клиентской машине.

  4. Код сначала получает новое временное имя, проверяет отсутствие файла и выводит точный путь. Только после этого записывает собственные PDF-байты. Рабочий или выбранный пользователем PDF нигде не запрашивается.

  5. ЗаписьPDF изменяет именно созданный этим запуском файл. Чтение результата начинается после закрытия записи. Файл оставляется пользователю для просмотра и ручного удаления; автоматического удаления нет.

  6. Удаление вложений допустимо начиная с PDF 1.5. Пример проверяет первые восемь символов собственного файла перед этой операцией. Для PDF/A-1 или PDF/A-2 произвольные CSV-вложения не подходят.

  7. До завершения асинхронной цепочки форму не закрывайте и второй запуск не выполняйте. При ошибке начала шага успех не объявляется. Ни создание пособия, ни его Python-тесты этот код в 1С не выполняют.

Функция СоздатьСобственныеБайты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(Данные)
    Имя = ПолучитьИмяВременногоФайла("pdf");
    Проверка = Новый Файл(Имя);
    Если Проверка.Существует() Тогда
        ВызватьИсключение "Новое имя уже занято: перезапись запрещена";
    КонецЕсли;
    Сообщить("Создаётся только собственный PDF: " + Имя);
    Данные.Записать(Имя);
    Возврат Имя;
КонецФункции

Функция СоздатьСвоёВложение(Текст)
    Вложения = Новый КоллекцияВложенийPDF;
    Данные = ПолучитьДвоичныеДанныеИзСтроки(Текст, КодировкаТекста.UTF8, Ложь);
    Вложения.Добавить("guide-owned-book.csv", Данные, "text/csv", ТипСвязиВложенияPDF.Данные);
    Возврат Вложения;
КонецФункции

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

Процедура ПроверитьУчебнуюВерсию(Имя)
    Чтение = Новый ЧтениеДанных(Имя, КодировкаТекста.UTF8);
    Попытка
        Заголовок = Чтение.ПрочитатьСимволы(8);
        Чтение.Закрыть();
    Исключение
        Чтение.Закрыть();
        ВызватьИсключение;
    КонецПопытки;
    Если СтрДлина(Заголовок) <> 8 Или Лев(Заголовок, 5) <> "%PDF-" Или Сред(Заголовок, 7, 1) <> "." Тогда
        ВызватьИсключение "Учебный заголовок PDF не распознан";
    КонецЕсли;
    Старшая = Число(Сред(Заголовок, 6, 1));
    Младшая = Число(Сред(Заголовок, 8, 1));
    Если Старшая < 1 Или (Старшая = 1 И Младшая < 5) Тогда
        ВызватьИсключение "Удаление вложений требует PDF 1.5 или новее";
    КонецЕсли;
    Сообщить("Заголовок собственного файла: " + Заголовок);
КонецПроцедуры

Процедура ВыполнитьПример() Экспорт
    Имя = СоздатьСвойФайлPDF(СоздатьСобственныеБайтыPDF());
    ПроверитьУчебнуюВерсию(Имя);
    Запись = Новый ЗаписьPDF(Имя);
    Попытка
        Запись.ЗаписатьВложения(СоздатьСвоёВложение("Книга;3;250;750"));
        Запись.Закрыть();
    Исключение
        ОшибкаОперации = ОписаниеОшибки();
        Попытка
            Запись.Закрыть();
        Исключение
            ОшибкаОперации = ОшибкаОперации + Символы.ПС + "Ошибка закрытия: " + ОписаниеОшибки();
        КонецПопытки;
        ВызватьИсключение ОшибкаОперации;
    КонецПопытки;
    ДоУдаления = ПрочитатьСвоиВложения(Имя);
    Сообщить(ДоУдаления.Количество() = 1);
    Имена = Новый Массив;
    Имена.Добавить("guide-owned-book.csv");
    Запись = Новый ЗаписьPDF(Имя);
    Попытка
        Запись.ЗаписатьУдалениеВложений(Имена);
        Запись.Закрыть();
    Исключение
        ОшибкаОперации = ОписаниеОшибки();
        Попытка
            Запись.Закрыть();
        Исключение
            ОшибкаОперации = ОшибкаОперации + Символы.ПС + "Ошибка закрытия: " + ОписаниеОшибки();
        КонецПопытки;
        ВызватьИсключение ОшибкаОперации;
    КонецПопытки;
    ПослеУдаления = ПрочитатьСвоиВложения(Имя);
    Сообщить(ПослеУдаления.Количество() = 0);
    Сообщить("Собственный PDF сохранён без собственного вложения: " + Имя);
КонецПроцедуры

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

  1. Создать собственный PDF и прочитать только первые восемь ASCII-символов заголовка. PDF ниже 1.5 отвергается до удаления вложений.

  2. Добавить свой CSV и проверить наличие после закрытия записи.

  3. Создать Массив имён с одной строкой guide-owned-book.csv. Передать его ЗаписатьУдалениеВложений, не КоллекцияВложенийPDF.

  4. Закрыть писатель и повторно прочитать вложения. Сам PDF-файл остаётся для проверки.

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

  1. До удаления собственное вложение одно, после удаления их 0: две булевые проверки дают Истина.

  2. Удаляется ссылка на собственное вложение в PDF, а не весь файл. По выведенному пути свой PDF остаётся.

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

Удаление с точной границей владения и правильным типом аргумента.

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

  1. Поддержка удаления начинается с PDF 1.5. Проверка заголовка — условие этого упражнения, не полный валидатор PDF.

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

  3. Не формируйте список удаления из всех вложений чужого документа. В этом коде имя известно из собственного добавления.

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

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

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

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

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