ЗаписьPDF.НачатьЗаписьОтображаемогоОбъекта

Методы · BeginWriteRepresentationObject

Инициирует отображение объекта (штамп) на указанной странице по указанным координатам.

Синтаксис

НачатьЗаписьОтображаемогоОбъекта(<ОписаниеОповещения>, <ОписаниеОтображаемогоОбъекта>)
Полное описание, параметры и ограничения

ЗаписьPDF.НачатьЗаписьОтображаемогоОбъекта (PDFWriter.BeginWriteRepresentationObject)

ЗаписьPDF (PDFWriter)

НачатьЗаписьОтображаемогоОбъекта (BeginWriteRepresentationObject)

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

Синтаксис:
НачатьЗаписьОтображаемогоОбъекта(<ОписаниеОповещения>, <ОписаниеОтображаемогоОбъекта>)
Параметры:

<ОписаниеОповещения> (необязательный)
Тип: ОписаниеОповещения.
Содержит описание процедуры, которая будет вызвана после завершения операции со следующими параметрами:
<ДополнительныеПараметры> - значение, которое было указано при создании объекта ОписаниеОповещенияОЗакрытии.

<ОписаниеОтображаемогоОбъекта> (необязательный)
Тип: ОписаниеОтображаемогоОбъектаPDF.
Объект, содержащий описание отображения объекта в PDF-документе.
Описание:

Инициирует отображение объекта (штамп) на указанной странице по указанным координатам.

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

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

См. также:
ЗаписьPDF, метод ЗаписатьОтображаемыйОбъект
ЗаписьPDF, метод ЗаписатьОтображаемыйОбъектАсинх

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

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

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

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

Записать штамп цепочкой оповещений

Открытие писателя, запись отображаемого объекта и закрытие выполняются в отдельных обработчиках. Читатель запускается только после закрытия писателя.

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

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

Подготовка

  1. В отдельной учебной базе создайте внешнюю обработку с пустой управляемой формой, командой УчебныйПример и кнопкой. В Действие команды выберите процедуру УчебныйПример.

  2. Вставьте полный приведённый модуль формы. Функция ПодготовитьСвойPDF находится на сервере, обработчики оповещений — на клиенте и обязательно Экспорт.

  3. Запускайте в тонком или толстом клиенте Windows 8.5.1.1343. Веб-клиент и расширения браузера не входят в подготовку этого урока.

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

Перем Выполняется;

&НаКлиенте
Процедура УчебныйПример(Команда)
    Если Выполняется = Истина Тогда
        Сообщить("Дождитесь завершения своего предыдущего PDF-примера");
        Возврат;
    КонецЕсли;
    Данные = ПодготовитьСвойPDF(Ложь);
    Буфер = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(Данные);
    Состояние = Новый Структура("Поток,Чтение,Запись", Новый ПотокВПамяти(Буфер), Неопределено, Неопределено);
    Выполняется = Истина;
    Попытка
        Состояние.Запись = Новый ЗаписьPDF;
        Состояние.Запись.НачатьОткрытие(ОповещениеДля("ПослеОткрытияЗаписи", Состояние), Состояние.Поток);
    Исключение
        ОсвободитьРесурсы(Состояние);
        Выполняется = Ложь;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Функция ОповещениеДля(Обработчик, Состояние)
    Возврат Новый ОписаниеОповещения(Обработчик, ЭтотОбъект, Состояние, "ОшибкаОперации", ЭтотОбъект);
КонецФункции

&НаКлиенте
Процедура ОшибкаОперации(Ошибка, СтандартнаяОбработка, Состояние) Экспорт
    ОсвободитьРесурсы(Состояние);
    Выполняется = Ложь;
    СтандартнаяОбработка = Истина;
КонецПроцедуры

&НаКлиенте
Процедура ОсвободитьРесурсы(Состояние)
    Если Состояние.Чтение <> Неопределено Тогда
        Попытка
            Состояние.Чтение.Закрыть();
        Исключение
            Сообщить("Не удалось закрыть свой объект чтения PDF: " + ОписаниеОшибки());
        КонецПопытки;
        Состояние.Чтение = Неопределено;
    КонецЕсли;
    Если Состояние.Запись <> Неопределено Тогда
        Попытка
            Состояние.Запись.Закрыть();
        Исключение
            Сообщить("Не удалось закрыть свой объект записи PDF: " + ОписаниеОшибки());
        КонецПопытки;
        Состояние.Запись = Неопределено;
    КонецЕсли;
    Если Состояние.Поток <> Неопределено Тогда
        Попытка
            Состояние.Поток.Закрыть();
        Исключение
            Сообщить("Не удалось закрыть свой поток PDF: " + ОписаниеОшибки());
        КонецПопытки;
        Состояние.Поток = Неопределено;
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПослеОткрытияЗаписи(Состояние) Экспорт
    Попытка
        Штамп = Новый ТабличныйДокумент;
        Штамп.Область("A1").Текст = "УЧЕБНЫЙ ОБРАЗЕЦ";
        ОписаниеШтампа = Новый ОписаниеОтображаемогоОбъектаPDF;
        ОписаниеШтампа.Объект = Штамп;
        ОписаниеШтампа.Имя = "УчебныйШтамп";
        ОписаниеШтампа.НомерСтраницы = 1;
        ОписаниеШтампа.Лево = 20;
        ОписаниеШтампа.Верх = 30;
        ОписаниеШтампа.Ширина = 60;
        ОписаниеШтампа.Высота = 12;
        Сообщить(ОписаниеШтампа.Объект = Штамп);
        Сообщить(ОписаниеШтампа.Имя = "УчебныйШтамп");
        Сообщить(ОписаниеШтампа.НомерСтраницы = 1);
        Сообщить(ОписаниеШтампа.Лево = 20 И ОписаниеШтампа.Верх = 30);
        Сообщить(ОписаниеШтампа.Ширина = 60 И ОписаниеШтампа.Высота = 12);
        Состояние.Запись.НачатьЗаписьОтображаемогоОбъекта(ОповещениеДля("ПослеИзмененияPDF", Состояние), ОписаниеШтампа);
    Исключение
        ОсвободитьРесурсы(Состояние);
        Выполняется = Ложь;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура ПослеИзмененияPDF(Состояние) Экспорт
    Попытка
        Состояние.Запись.НачатьЗакрытие(ОповещениеДля("ПослеЗакрытияЗаписи", Состояние));
    Исключение
        ОсвободитьРесурсы(Состояние);
        Выполняется = Ложь;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗакрытияЗаписи(Состояние) Экспорт
    Попытка
        Состояние.Запись = Неопределено;
        БайтыPDF = Состояние.Поток.ЗакрытьИПолучитьДвоичныеДанные();
        Состояние.Поток = Неопределено;
        Состояние.Вставить("ИтогPDF", БайтыPDF);
        Состояние.Поток = Новый ПотокВПамяти(ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(Состояние.ИтогPDF));
        Состояние.Поток.Перейти(0, ПозицияВПотоке.Начало);
        Состояние.Чтение = Новый ЧтениеPDF;
        Состояние.Чтение.НачатьОткрытие(ОповещениеДля("ПослеОткрытияЧтения", Состояние), Состояние.Поток);
    Исключение
        ОсвободитьРесурсы(Состояние);
        Выполняется = Ложь;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура ПослеОткрытияЧтения(Состояние) Экспорт
    Попытка
        Состояние.Чтение.НачатьПолучениеВложений(ОповещениеДля("ПослеПолученияВложений", Состояние));
    Исключение
        ОсвободитьРесурсы(Состояние);
        Выполняется = Ложь;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура ПослеПолученияВложений(Прочитанные, Состояние) Экспорт
    Попытка
        Сообщить(Прочитанные.Количество() = 0);
        Состояние.Чтение.НачатьЗакрытие(ОповещениеДля("ПослеЗакрытияЧтения", Состояние));
    Исключение
        ОсвободитьРесурсы(Состояние);
        Выполняется = Ложь;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗакрытияЧтения(Состояние) Экспорт
    Попытка
        Состояние.Чтение = Неопределено;
        ОсвободитьРесурсы(Состояние);
        Выполняется = Ложь;
        Сообщить("Собственная цепочка PDF завершена, ресурсы освобождены");
    Исключение
        ОсвободитьРесурсы(Состояние);
        Выполняется = Ложь;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПодготовитьСвойPDF(СВложением)
    Вложения = Новый КоллекцияВложенийPDF;
    ТекстJSON = "{""товар"":""Книга"",""количество"":3}";
    БайтыJSON = ПолучитьДвоичныеДанныеИзСтроки(ТекстJSON, КодировкаТекста.UTF8, Ложь);
    Вложения.Добавить("товар.json", БайтыJSON, "application/json", ТипСвязиВложенияPDF.Данные);
    Если Не СВложением Тогда
        Вложения.Очистить();
    КонецЕсли;
    Документ = Новый ТабличныйДокумент;
    Документ.Область("A1").Текст = "Книга: 3 шт.";
    Поток = Новый ПотокВПамяти;
    Попытка
        Документ.Записать(Поток, ТипФайлаТабличногоДокумента.PDF, Вложения);
        Возврат Поток.ЗакрытьИПолучитьДвоичныеДанные();
    Исключение
        Поток.Закрыть();
        ВызватьИсключение;
    КонецПопытки;
КонецФункции

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

  1. Сервер строит собственный PDF без вложений, клиент открывает собственный поток для записи.

  2. ПослеОткрытияЗаписи создаёт описание штампа в миллиметрах и вызывает НачатьЗаписьОтображаемогоОбъекта: сначала оповещение, затем описание.

  3. ПослеИзмененияPDF запускает закрытие писателя. Только ПослеЗакрытияЗаписи запускает читателя с позицией в начале.

  4. После закрытия писателя итоговые байты сохраняются в Состояние.ИтогPDF. Для независимого читателя создаётся новый поток на основании этих байтов.

  5. Читатель проверяет корректное открытие и отсутствие вложений. Сам штамп проверяется отдельно визуально.

  6. Повторный запуск заблокирован флагом; ошибки запуска следующего шага и ошибки операции освобождают ресурсы.

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

  1. Шесть сравнений Истина: пять свойств штампа и ноль вложений. В конце сообщение об освобождении ресурсов.

  2. Поставьте точку останова в ПослеЗакрытияЗаписи: до чтения писатель уже обнулён, Состояние.ИтогPDF содержит самостоятельные байты. Для вида штампа сохраните только эти собственные данные в новый учебный файл и посмотрите его в PDF-программе.

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

Штамп записан оповещением с правильным порядком завершения и независимым чтением.

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

  1. Отображаемый объект не является вложением или криптографической подписью.

  2. Номер страницы начинается с 1; нельзя использовать индекс 0 как первую страницу.

  3. Пример рассчитан на Windows-клиент, аварийное освобождение веб-клиента отдельно не проверялось.

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

Записать свой PDF пятью callback-шагами и прочитать результат после закрытия

Открытие → вложение → штамп → удаление собственного вложения → закрытие. Все завершения писателя принимают только Состояние, не выдуманный Результат.

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

Полный модуль управляемой формы внешней обработки, толстый клиент Windows; свой файл на клиенте.

Подготовка

  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;

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

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

&НаКлиенте
Процедура ПроверитьСвоюСтраницу(Данные)
    Поток = Данные.ОткрытьПотокДляЧтения();
    Попытка
        Документ = Новый ДокументPDF;
        Документ.Прочитать(Поток);
        Поток.Закрыть();
    Исключение
        Поток.Закрыть();
        ВызватьИсключение;
    КонецПопытки;
    Если Документ.КоличествоСтраниц() = 0 Тогда
        ВызватьИсключение "Нет собственной страницы для штампа";
    КонецЕсли;
    Первая = Документ.Страницы.Получить(0);
    Если Первая.Ширина < 80 Или Первая.Высота < 65 Тогда
        ВызватьИсключение "Собственная страница меньше прямоугольника штампа";
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Функция СоздатьСобственныйШтамп()
    ТаблицаШтампа = Новый ТабличныйДокумент;
    ТаблицаШтампа.КодЯзыка = "ru";
    ТаблицаШтампа.Область(1, 1).Текст = "ОБРАЗЕЦ — НЕ ДОКУМЕНТ";
    ТаблицаШтампа.Область(1, 1).ЦветФона = Новый Цвет(210, 240, 255);
    Описание = Новый ОписаниеОтображаемогоОбъектаPDF;
    Описание.Имя = "guide-owned-stamp";
    Описание.Объект = ТаблицаШтампа;
    Описание.НомерСтраницы = 1;
    Описание.Лево = 10;
    Описание.Верх = 45;
    Описание.Ширина = 60;
    Описание.Высота = 10;
    Возврат Описание;
КонецФункции

&НаКлиенте
Функция ОповещениеЗаписиPDF(Имя, Состояние)
    Возврат Новый ОписаниеОповещения(Имя, ЭтотОбъект, Состояние, "ОшибкаЗаписиPDF", ЭтотОбъект);
КонецФункции

&НаКлиенте
Процедура ПроверитьСостояниеЗаписи(Состояние)
    Если Состояние <> СобственноеСостояние Или Состояние.Маркер <> "guide-owned-writer" Тогда
        ВызватьИсключение "Неизвестное состояние PDF-писателя";
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура НачатьСледующийШаг(Состояние, Шаг)
    ПроверитьСостояниеЗаписи(Состояние);
    Попытка
        Если Шаг = 1 Тогда
            Состояние.Запись.НачатьЗаписьВложений(ОповещениеЗаписиPDF("ПослеВложения", Состояние), Состояние.Вложения);
        ИначеЕсли Шаг = 2 Тогда
            Состояние.Запись.НачатьЗаписьОтображаемогоОбъекта(ОповещениеЗаписиPDF("ПослеШтампа", Состояние), Состояние.Описание);
        ИначеЕсли Шаг = 3 Тогда
            Состояние.Запись.НачатьЗаписьУдаленияВложений(ОповещениеЗаписиPDF("ПослеУдаления", Состояние), Состояние.Имена);
        ИначеЕсли Шаг = 4 Тогда
            Состояние.Запись.НачатьЗакрытие(ОповещениеЗаписиPDF("ПослеЗакрытияЗаписи", Состояние));
        Иначе
            ВызватьИсключение "Неизвестный номер учебного шага";
        КонецЕсли;
    Исключение
        Сообщить("Начало шага не подтверждено: " + ОписаниеОшибки());
        Сообщить("Повтор запрещён; закройте только собственную учебную форму. Свой путь: " + Состояние.Имя);
    КонецПопытки;
КонецПроцедуры

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

&НаКлиенте
Процедура ПослеОткрытияЗаписи(Состояние) Экспорт
    НачатьСледующийШаг(Состояние, 1);
КонецПроцедуры

&НаКлиенте
Процедура ПослеВложения(Состояние) Экспорт
    НачатьСледующийШаг(Состояние, 2);
КонецПроцедуры

&НаКлиенте
Процедура ПослеШтампа(Состояние) Экспорт
    НачатьСледующийШаг(Состояние, 3);
КонецПроцедуры

&НаКлиенте
Процедура ПослеУдаления(Состояние) Экспорт
    НачатьСледующийШаг(Состояние, 4);
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗакрытияЗаписи(Состояние) Экспорт
    ПроверитьСостояниеЗаписи(Состояние);
    Итог = ПрочитатьСвоиВложения(Состояние.Имя);
    Сообщить(Итог.Количество() = 0);
    СобственныйPDF = Новый ДокументPDF;
    СобственныйPDF.Прочитать(Состояние.Имя);
    СобственныйPDF.Показать("guide-owned: запись PDF завершена callback", "");
    СобственноеСостояние = Неопределено;
    Занято = Ложь;
КонецПроцедуры

&НаКлиенте
Процедура ОшибкаЗаписиPDF(ИнформацияОбОшибке, Состояние, СтандартнаяОбработка) Экспорт
    ПроверитьСостояниеЗаписи(Состояние);
    СтандартнаяОбработка = Ложь;
    Сообщить("Ошибка своей записи PDF: " + ИнформацияОбОшибке.Описание);
    Попытка
        Состояние.Запись.Закрыть();
    Исключение
        Сообщить("Закрытие не подтверждено: " + ОписаниеОшибки());
        Сообщить("Повтор запрещён; закройте только собственную учебную форму. Свой путь: " + Состояние.Имя);
        Возврат;
    КонецПопытки;
    СобственноеСостояние = Неопределено;
    Занято = Ложь;
КонецПроцедуры

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

  1. Создать только свой PDF-файл и подготовить собственное вложение, штамп и точное имя удаления.

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

  3. Все пять экспортных callback писателя имеют один аргумент Состояние. Три аргумента отдельно используются обработчиком ошибки.

  4. Читать итоговые вложения и открывать документ только в callback подтверждённого закрытия писателя.

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

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

  1. После подтверждённого закрытия итоговая коллекция вложений пуста: проверка Истина.

  2. В своём окне видны книга и штамп; путь выведен до создания и принадлежит только этому запуску. Визуальный результат проверяется вручную в 1С.

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

Полная цепочка callback PDF-писателя с правильной границей жизненного цикла и владения файлом.

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

  1. У callback записи нет Булево результата: подтверждение приходит фактом завершения либо отдельным обработчиком ошибки.

  2. НачатьЗаписьУдаленияВложений принимает массив имён, не коллекцию объектов вложений.

  3. Файл остаётся для ручного просмотра и удаления. Не выполняйте очистку всего временного каталога или всех вложений чужого PDF.

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

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

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

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

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