Проверяем заголовок учебного PDF, затем ожидаем запись удаления имени. После закрытия писателя независимое чтение проверяет пустой перечень.
Где и как запускать
Модуль пустой управляемой формы учебной внешней обработки; тонкий или толстый клиент Windows. Вставьте весь модуль. Это не серверный код.
Подготовка
Создайте учебную внешнюю обработку с пустой управляемой основной формой. Создайте команду УчебныйПример и кнопку этой команды.
В свойстве команды Действие выберите процедуру УчебныйПример. Вставьте полный приведённый модуль формы.
Откройте EPF в тонком или толстом клиенте Windows и нажмите кнопку. Не переносите Ждать и Асинх в серверный общий модуль.
Пример работает только со своими данными в памяти; записи в базу, файлы и сеть нет.
Документ PDF строится из собственной ячейки Книга: 3 шт. Внешний PDF, установленный PDF-редактор, криптографический сертификат и реальные персональные данные не нужны.
Файловый путь нигде не используется. Для просмотра в 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.Перейти(0, ПозицияВПотоке.Начало);
Ждать Запись.ОткрытьАсинх(ПотокPDF);
Имена = Новый Массив;
Имена.Добавить("товар.json");
Ждать Запись.ЗаписатьУдалениеВложенийАсинх(Имена);
Ждать Запись.ЗакрытьАсинх();
Запись = Неопределено;
БайтыPDF = ПотокPDF.ЗакрытьИПолучитьДвоичныеДанные();
ПотокPDF = Неопределено;
ПотокЧтения = БайтыPDF.ОткрытьПотокДляЧтения();
Чтение = Новый ЧтениеPDF;
Ждать Чтение.ОткрытьАсинх(ПотокЧтения);
Прочитанные = Ждать Чтение.ПолучитьВложенияАсинх();
Сообщить(Прочитанные.Количество() = 0);
Сообщить(Прочитанные.Найти("товар.json") = Неопределено);
Исключение
Если Чтение <> Неопределено Тогда
Ждать Чтение.ЗакрытьАсинх();
КонецЕсли;
Если Запись <> Неопределено Тогда
Ждать Запись.ЗакрытьАсинх();
КонецЕсли;
Если ПотокЧтения <> Неопределено Тогда
ПотокЧтения.Закрыть();
КонецЕсли;
Если ПотокPDF <> Неопределено Тогда
ПотокPDF.Закрыть();
КонецЕсли;
ВызватьИсключение;
КонецПопытки;
Если Чтение <> Неопределено Тогда
Ждать Чтение.ЗакрытьАсинх();
КонецЕсли;
Если Запись <> Неопределено Тогда
Ждать Запись.ЗакрытьАсинх();
КонецЕсли;
Если ПотокЧтения <> Неопределено Тогда
ПотокЧтения.Закрыть();
КонецЕсли;
Если ПотокPDF <> Неопределено Тогда
ПотокPDF.Закрыть();
КонецЕсли;
КонецПроцедурыРазбор по шагам
В собственном исходном PDF одно JSON-вложение. Проверяем восемь байтов заголовка до изменения.
Неподдержанный учебной проверкой заголовок вызывает исключение, а не ложное сообщение об успехе.
ЗаписатьУдалениеВложенийАсинх принимает массив имён. Ждать ожидает удаление, затем отдельно ожидаем закрытие писателя.
Новый читатель получает итоговый перечень; сравниваем количество и отсутствие конкретного имени.
Как проверить результат
При принятом заголовке две проверки Истина. При другом — остановка до записи удаления.
Прежние байты могут физически оставаться внутри PDF: здесь доказано отсутствие имени в перечне, не уничтожение сведений.
Ожидаемый результат
Завершённое удаление собственного вложения проверено независимым читателем.
На что обратить внимание
Удаление вложения не означает безопасную очистку конфиденциальных данных.
Массив имён и КоллекцияВложенийPDF — разные типы аргумента.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.