ЧтениеPDF.На основании имени файла

Конструкторы

Создает объект ЧтениеPDF из заданного файла. При этом будет файл, указанный в параметре ИмяФайла, будет автоматически открыт на чтение. Если файл с таким именем не существует, будет сгенерировано исключение.

Синтаксис

Новый ЧтениеPDF(<ИмяФайла>)
Полное описание, параметры и ограничения

ЧтениеPDF.На основании имени файла

ЧтениеPDF (PDFReader)

На основании имени файла

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

Синтаксис:
Новый ЧтениеPDF(<ИмяФайла>)
Параметры:

<ИмяФайла> (обязательный)
Тип: Строка.
Имя файла, из которого будет выполнено чтение данных.
Описание:

Создает объект ЧтениеPDF из заданного файла.
При этом будет файл, указанный в параметре ИмяФайла, будет автоматически открыт на чтение.
Если файл с таким именем не существует, будет сгенерировано исключение.

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

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

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

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

Прочитать и дополнить собственный временный PDF по имени файла

Конструкторы ЧтениеPDF и ЗаписьPDF на основании имени файла показаны на новом уникальном учебном PDF. После проверки удаляется только этот файл, не каталог и не пользовательский документ.

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

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

Подготовка

  1. В отдельной учебной базе создайте серверную процедуру общего модуля УчебныеЗадачи. Вставьте фрагмент в тело своей экспортной процедуры.

  2. Серверному процессу нужны обычные права на свой временный каталог. КаталогВременныхФайлов на сервере относится к серверу, не к диску тонкого клиента.

  3. Имя создаётся из нового UUID внутри урока. Не заменяйте его путём к важному PDF: упражнение изменяет и затем удаляет только созданный им файл.

  4. Учебные данные: ячейка Книга: 3 шт. и вложение товар.json. Сертификатов, подписей и сети нет.

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

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

  1. ФайловыйПоток с СоздатьНовый атомарно требует нового имени. Если файл уже существует, открытие не заменяет его и флаг собственности не устанавливается.

  2. Через собственный поток экспортируем PDF и закрываем поток. ЧтениеPDF(ИмяPDF) автоматически открывает файл для чтения.

  3. Закрываем читателя до открытия писателя. ЗаписьPDF(ИмяPDF) дописывает JSON в этот же собственный документ.

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

  5. Очистка закрывает PDF-объекты и поток, затем удаляет точное имя только при подтверждённом флаге создания. Последняя проверка убеждается, что файл больше не существует.

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

  1. Четыре сравнения Истина: до записи вложений 0, после 1, JSON совпадает, свой временный PDF удалён.

  2. В отладчике путь ИмяPDF относится к временному каталогу процесса выполнения, а не обязательно к папке вашего компьютера.

  3. Если возникло исключение открытия, чужой файл не должен удаляться: флаг СозданСвойФайл остаётся Ложь.

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

Отработаны оба файловых конструктора, отдельное открытие и точная очистка собственного ресурса.

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

  1. Нельзя менять имя на присланный документ: этот урок предназначен только для собственных тестовых данных.

  2. Удаление временного PDF не является гарантией уничтожения данных на носителе.

  3. Ошибка освобождения или удаления должна быть разобрана отдельно; отсутствие файла не обещается при исключении файловой системы.

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

Добавить вложение и заменить его по тому же собственному имени

Сначала в своём файле сохраняем CSV с количеством 1. Второй записью заменяем именно guide-owned-book.csv на количество 3; количество вложений остаётся 1.

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

Полный серверный общий модуль УчебныеФайлы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(Имя);
    Попытка
        Вложения = Чтение.ПолучитьВложения();
        Чтение.Закрыть();
    Исключение
        Чтение.Закрыть();
        ВызватьИсключение;
    КонецПопытки;
    Возврат Вложения;
КонецФункции

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

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

  1. Создать свой файл и открыть ЗаписьPDF конструктором имени файла.

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

  3. Проверить реальное содержимое после закрытия читателя. Повторно открыть писатель и записать новое содержимое под тем же именем вложения.

  4. Снова прочитать файл и проверить ровно одно вложение с новым CSV. Замена по имени — не добавление второй копии.

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

  1. Четыре проверки дают Истина: сначала одно CSV Книга;1;250;250, потом одно CSV Книга;3;250;750.

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

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

Проверенная по API семантика обновления одноимённого вложения с настоящим повторным чтением PDF-файла.

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

  1. Одноимённое вложение заменяется. Не используйте этот учебный метод над чужими файлами: там имя может принадлежать важному вложению.

  2. Индекс 0 безопасен здесь после проверки ровно одной записи собственного файла; в общем случае ищите по имени.

  3. PDF/A-1 и PDF/A-2 не подходят для этих произвольных текстовых вложений.

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

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

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

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

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