1С 8.3 PDF
Данные > Примеры кода 1С > 1С 8.3 PDF
В 1С 8.3 есть возможность создания и обработки документов в PDF. Объекты конфигурации: документы и отчёты, могут быть экспортированы в формат PDF. Прямо в платформе можно создавать и редактировать документы в формате PDF, а также подписывать их ЭЦП. PDF (Portable Document Format) - это формат файлов, который был разработан компанией Adobe Systems в 1993 году. Он предназначен для представления документов в электронном виде с сохранением их внешнего вида и структуры. Для работы с PDF-документами вне 1С, рекомендую использовать бесплатную программу Adobe Acrobat Reader или платную Foxit PhantomPDF.
Начиная с релизов 8.3.21, 8.3.22 разработчики платформы разнообразили программный функционал по работе с файлами *.pdf через ДокументPDF. А в версию 8.3.26 интегрирована возможность получения размера страницы (будет дополнено с выходом релиза). По данной статье к скачиванию доступна обработка Работа с форматом PDF (мини-шпора).
Оглавление:
Просмотр PDF в 1С 8.3:
&НаКлиенте
Процедура ПросмотрPDF(Команда)
ИмяФайлаРус = (ТРег(Транслит(ФайлPDF.ИмяБезРасширения, Истина)))
+" ("+ФайлPDF.ИмяБезРасширения+")"; // например: Договор (Dogovor)
PDF = Новый ДокументPDF();
PDF.ПрочитатьАсинх(ПутьКФайлуPDF); // чтение с диска или потока. Можно указать пароль
// PDF.Прочитать(ПутьКФайлуPDF);
PDF.Показать(ИмяФайлаРус); // с 8.3.22
КонецПроцедуры
Процедура ПросмотрPDF(Команда)
ИмяФайлаРус = (ТРег(Транслит(ФайлPDF.ИмяБезРасширения, Истина)))
+" ("+ФайлPDF.ИмяБезРасширения+")"; // например: Договор (Dogovor)
PDF = Новый ДокументPDF();
PDF.ПрочитатьАсинх(ПутьКФайлуPDF); // чтение с диска или потока. Можно указать пароль
// PDF.Прочитать(ПутьКФайлуPDF);
PDF.Показать(ИмяФайлаРус); // с 8.3.22
КонецПроцедуры
Получить атрибуты PDF в 1С 8.3:
&НаКлиенте
Процедура ПолучитьАтрибутыPDF(Команда)
PDF = Новый ДокументPDF();
PDF.Прочитать(ПутьКФайлуPDF); // чтение с диска или потока. Можно указать пароль
Сообщить("Атрибуты "+ПутьКФайлуPDF+":"); // с 8.3.21
Сообщить(" ...кол. страниц = "+PDF.КоличествоСтраниц()); // с 8.3.21 Количество страниц в PDF-документе.
Сообщить(" ...тип документа = "+PDF.ТипФайла); // с 8.3.21 Варианты типов файлов PDF-документа.
Сообщить(" ...кол. вложений = "+PDF.Вложения.Количество()); // с 8.3.21 Кол. вложений PDF-файлов
КонецПроцедуры
Процедура ПолучитьАтрибутыPDF(Команда)
PDF = Новый ДокументPDF();
PDF.Прочитать(ПутьКФайлуPDF); // чтение с диска или потока. Можно указать пароль
Сообщить("Атрибуты "+ПутьКФайлуPDF+":"); // с 8.3.21
Сообщить(" ...кол. страниц = "+PDF.КоличествоСтраниц()); // с 8.3.21 Количество страниц в PDF-документе.
Сообщить(" ...тип документа = "+PDF.ТипФайла); // с 8.3.21 Варианты типов файлов PDF-документа.
Сообщить(" ...кол. вложений = "+PDF.Вложения.Количество()); // с 8.3.21 Кол. вложений PDF-файлов
КонецПроцедуры
Преобразовать PDF в оттенки серого в 1С 8.3:
&НаКлиенте
Процедура ПреобразоватьВОттенкиСерогоPDF(Команда)
PDF = Новый ДокументPDF();
PDF.ПреобразоватьВОттенкиСерого(); // работает и с ЗаписьPDF
Сообщить(ПутьКФайлуPDF+" преобразован в серый"); // с 8.3.22
КонецПроцедуры
Процедура ПреобразоватьВОттенкиСерогоPDF(Команда)
PDF = Новый ДокументPDF();
PDF.ПреобразоватьВОттенкиСерого(); // работает и с ЗаписьPDF
Сообщить(ПутьКФайлуPDF+" преобразован в серый"); // с 8.3.22
КонецПроцедуры
Печать PDF в 1С 8.3:
&НаКлиенте
Процедура ПечатьPDF(Команда)
PDF = Новый ДокументPDF();
PDF.Прочитать(ПутьКФайлуPDF); // чтение с диска или потока. Можно указать пароль
PDF.Напечатать(РежимИспользованияДиалогаПечати.Использовать); // с 8.3.21
КонецПроцедуры
Процедура ПечатьPDF(Команда)
PDF = Новый ДокументPDF();
PDF.Прочитать(ПутьКФайлуPDF); // чтение с диска или потока. Можно указать пароль
PDF.Напечатать(РежимИспользованияДиалогаПечати.Использовать); // с 8.3.21
КонецПроцедуры
Добавить подпись в PDF в 1С 8.3:
&НаКлиенте
Процедура ДобавитьПодписьPDF(Команда)
Крипто = Новый МенеджерКриптографии("", "", 80);
Крипто.ПарольДоступаКЗакрытомуКлючу = ПарольЭЦП; // строка
//Сертификат = ПолучитьОткрытыйСертификат();
ПодписьPDF = Новый ОписаниеПодписиPDF;
ПодписьPDF.Имя = "ПодписьДоговора";
//ПодписьPDF.Сертификат = Сертификат;
ПодписьPDF.ТипПодписи = ТипПодписиPDF.Утверждающая;
ПодписьPDF.БлокировкаДокумента = Истина;
ЗаписьPDF = Новый ЗаписьPDF(ПутьКФайлуPDF);
ОтчетОбъект = РеквизитФормыВЗначение("Отчет");
Штамп = ОтчетОбъект.ПолучитьМакет("ПодписьЭЦП");
ЗаписьPDF.ЗаписатьПодпись(Крипто, ПодписьPDF, Штамп);
КонецПроцедуры
Процедура ДобавитьПодписьPDF(Команда)
Крипто = Новый МенеджерКриптографии("", "", 80);
Крипто.ПарольДоступаКЗакрытомуКлючу = ПарольЭЦП; // строка
//Сертификат = ПолучитьОткрытыйСертификат();
ПодписьPDF = Новый ОписаниеПодписиPDF;
ПодписьPDF.Имя = "ПодписьДоговора";
//ПодписьPDF.Сертификат = Сертификат;
ПодписьPDF.ТипПодписи = ТипПодписиPDF.Утверждающая;
ПодписьPDF.БлокировкаДокумента = Истина;
ЗаписьPDF = Новый ЗаписьPDF(ПутьКФайлуPDF);
ОтчетОбъект = РеквизитФормыВЗначение("Отчет");
Штамп = ОтчетОбъект.ПолучитьМакет("ПодписьЭЦП");
ЗаписьPDF.ЗаписатьПодпись(Крипто, ПодписьPDF, Штамп);
КонецПроцедуры
Проверить подпись в PDF в 1С 8.3:
&НаКлиенте
Процедура ПроверитьПодписьPDF(Команда)
Крипто = Новый МенеджерКриптографии("", "", 80);
Крипто.ПарольДоступаКЗакрытомуКлючу = ПарольЭЦП; // строка
// Получить список подписей, которыми подписан документ:
ЧтениеPDF = Новый ЧтениеPDF(ПутьКФайлуPDF);
Подписи = ЧтениеPDF.ПолучитьОписанияПодписей(Крипто); // массив объектов описания подписи
КонецПроцедуры
Процедура ПроверитьПодписьPDF(Команда)
Крипто = Новый МенеджерКриптографии("", "", 80);
Крипто.ПарольДоступаКЗакрытомуКлючу = ПарольЭЦП; // строка
// Получить список подписей, которыми подписан документ:
ЧтениеPDF = Новый ЧтениеPDF(ПутьКФайлуPDF);
Подписи = ЧтениеPDF.ПолучитьОписанияПодписей(Крипто); // массив объектов описания подписи
КонецПроцедуры
Проверить конкретную подпись в PDF в 1С 8.3:
&НаКлиенте
Процедура ПроверитьКонкретнуюПодписьPDF(Команда)
Крипто = Новый МенеджерКриптографии("", "", 80);
Крипто.ПарольДоступаКЗакрытомуКлючу = ПарольЭЦП; // строка
ЧтениеPDF = Новый ЧтениеPDF(ПутьКФайлуPDF);
Подписи = ЧтениеPDF.ПолучитьОписанияПодписей(Крипто);
Для Каждого ТекПодпись Из Подписи Цикл
Попытка
ЧтениеPDF.ПроверитьПодпись(ТекПодпись.Имя, Крипто);
// Ждать ЧтениеPDF.ПроверитьПодписьАсинх(ТекПодпись.Имя, Крипто);
Исключение
Сообщить("Подпись " + ТекПодпись.Имя + " в "+ПутьКФайлуPDF+" недействительна!");
КонецПопытки;
КонецЦикла;
КонецПроцедуры
Процедура ПроверитьКонкретнуюПодписьPDF(Команда)
Крипто = Новый МенеджерКриптографии("", "", 80);
Крипто.ПарольДоступаКЗакрытомуКлючу = ПарольЭЦП; // строка
ЧтениеPDF = Новый ЧтениеPDF(ПутьКФайлуPDF);
Подписи = ЧтениеPDF.ПолучитьОписанияПодписей(Крипто);
Для Каждого ТекПодпись Из Подписи Цикл
Попытка
ЧтениеPDF.ПроверитьПодпись(ТекПодпись.Имя, Крипто);
// Ждать ЧтениеPDF.ПроверитьПодписьАсинх(ТекПодпись.Имя, Крипто);
Исключение
Сообщить("Подпись " + ТекПодпись.Имя + " в "+ПутьКФайлуPDF+" недействительна!");
КонецПопытки;
КонецЦикла;
КонецПроцедуры
Проверить все подписи в PDF в 1С 8.3:
&НаКлиенте
Процедура ПроверитьВсеПодписиPDF(Команда)
Крипто = Новый МенеджерКриптографии("", "", 80);
Крипто.ПарольДоступаКЗакрытомуКлючу = ПарольЭЦП; // строка
ЧтениеPDF = Новый ЧтениеPDF(ПутьКФайлуPDF);
Подписи = ЧтениеPDF.ПолучитьОписанияПодписей(Крипто);
Попытка
ЧтениеPDF.ПроверитьПодписи(Крипто);
// Ждать ЧтениеPDF.ПроверитьПодписиАсинх(Крипто);
Исключение
Сообщить("Подписи в "+ПутьКФайлуPDF+" недействительны!");
КонецПопытки;
КонецПроцедуры
Процедура ПроверитьВсеПодписиPDF(Команда)
Крипто = Новый МенеджерКриптографии("", "", 80);
Крипто.ПарольДоступаКЗакрытомуКлючу = ПарольЭЦП; // строка
ЧтениеPDF = Новый ЧтениеPDF(ПутьКФайлуPDF);
Подписи = ЧтениеPDF.ПолучитьОписанияПодписей(Крипто);
Попытка
ЧтениеPDF.ПроверитьПодписи(Крипто);
// Ждать ЧтениеPDF.ПроверитьПодписиАсинх(Крипто);
Исключение
Сообщить("Подписи в "+ПутьКФайлуPDF+" недействительны!");
КонецПопытки;
КонецПроцедуры
Добавить картинку в PDF в 1С 8.3:
&НаКлиенте
Процедура ДобавитьКартинкуPDF(Команда) // или табл.док.
КартинкаЭЦП = Новый Картинка("D:\Scan\ECP2005241249.jpg");
ОписаниеЭЦП = Новый ОписаниеОтображаемогоОбъектаPDF;
ОписаниеЭЦП.Имя = "ЭЦП";
ОписаниеЭЦП.Ширина = 46;
ОписаниеЭЦП.Высота = 18;
ОписаниеЭЦП.Лево = 10;
ОписаниеЭЦП.Верх = 10;
ОписаниеЭЦП.НомерСтраницы = 1; // добавим на первую
ОписаниеЭЦП.Объект = КартинкаЭЦП;
ЗаписьPDF = Новый ЗаписьPDF(ПутьКФайлуPDF);
ЗаписьPDF.ЗаписатьОтображаемыйОбъект(ОписаниеЭЦП); // с 8.3.16
КонецПроцедуры
Процедура ДобавитьКартинкуPDF(Команда) // или табл.док.
КартинкаЭЦП = Новый Картинка("D:\Scan\ECP2005241249.jpg");
ОписаниеЭЦП = Новый ОписаниеОтображаемогоОбъектаPDF;
ОписаниеЭЦП.Имя = "ЭЦП";
ОписаниеЭЦП.Ширина = 46;
ОписаниеЭЦП.Высота = 18;
ОписаниеЭЦП.Лево = 10;
ОписаниеЭЦП.Верх = 10;
ОписаниеЭЦП.НомерСтраницы = 1; // добавим на первую
ОписаниеЭЦП.Объект = КартинкаЭЦП;
ЗаписьPDF = Новый ЗаписьPDF(ПутьКФайлуPDF);
ЗаписьPDF.ЗаписатьОтображаемыйОбъект(ОписаниеЭЦП); // с 8.3.16
КонецПроцедуры
Добавить вложение в PDF в 1С 8.3:
&НаКлиенте
Процедура ДобавитьВложениеPDF()
ФайлДвоичныеДанныеPDF = Новый ДвоичныеДанные(ПутьКФайлуPDF);
ФайлДвоичныеДанныеJPG = Новый ДвоичныеДанные(ПутьКФайлуJPG);
ПотокФайлPDF = ФайлДвоичныеДанныеPDF.ОткрытьПотокДляЧтения();
PDF = Новый ДокументPDF();
PDF.Прочитать(ПотокФайлPDF);
PDF.Вложения.Добавить("ECP2005241249", ФайлДвоичныеДанныеJPG); // с 8.3.21. Добавить вложение в коллекцию
// PDF.Вложения.Получить(); // с 8.3.21. Получить вложение из коллекции (по индексу)
// PDF.Вложения.Удалить(); // с 8.3.21. Удалить вложение из коллекции (по индексу)
// PDF.Вложения.Очистить(); // с 8.3.21. Очистить коллекцию
// PDF.Вложения.Найти("ECP2005241249"); // с 8.3.21. Найти вложение по имени файла
// PDF.Вложения.Количество(); // с 8.3.21. Получить параметры коллекции
PDF.Записать(ПутьКФайлуPDF);
Сообщить("В "+ПутьКФайлуPDF+" добавлено вложение "+ПутьКФайлуJPG);
КонецПроцедуры
Процедура ДобавитьВложениеPDF()
ФайлДвоичныеДанныеPDF = Новый ДвоичныеДанные(ПутьКФайлуPDF);
ФайлДвоичныеДанныеJPG = Новый ДвоичныеДанные(ПутьКФайлуJPG);
ПотокФайлPDF = ФайлДвоичныеДанныеPDF.ОткрытьПотокДляЧтения();
PDF = Новый ДокументPDF();
PDF.Прочитать(ПотокФайлPDF);
PDF.Вложения.Добавить("ECP2005241249", ФайлДвоичныеДанныеJPG); // с 8.3.21. Добавить вложение в коллекцию
// PDF.Вложения.Получить(); // с 8.3.21. Получить вложение из коллекции (по индексу)
// PDF.Вложения.Удалить(); // с 8.3.21. Удалить вложение из коллекции (по индексу)
// PDF.Вложения.Очистить(); // с 8.3.21. Очистить коллекцию
// PDF.Вложения.Найти("ECP2005241249"); // с 8.3.21. Найти вложение по имени файла
// PDF.Вложения.Количество(); // с 8.3.21. Получить параметры коллекции
PDF.Записать(ПутьКФайлуPDF);
Сообщить("В "+ПутьКФайлуPDF+" добавлено вложение "+ПутьКФайлуJPG);
КонецПроцедуры
Справочно (переменные):
ФайлPDF = Новый Файл("D:\Scan\Dogovor.pdf"); // заменить на рекизит - выбор на форме
ПутьКФайлуPDF = Строка(ФайлPDF.ПолноеИмя);
ФайлJPG = Новый Файл("D:\Scan\ECP2005241249.jpg"); // заменить на рекизит - выбор на форме
ПутьКФайлуJPG = Строка(ФайлJPG.ПолноеИмя);
ПарольЭЦП = 123456;
ПутьКФайлуPDF = Строка(ФайлPDF.ПолноеИмя);
ФайлJPG = Новый Файл("D:\Scan\ECP2005241249.jpg"); // заменить на рекизит - выбор на форме
ПутьКФайлуJPG = Строка(ФайлJPG.ПолноеИмя);
ПарольЭЦП = 123456;
Добавить вложение к письму в формате PDF (аналог типовой процедуры) в 1С 8.3:
Процедура ДобавитьВложениеВФорматеPDFкПисьму(ТелоПисьма, Вложения,
СведенияОДок, ДвоичныеДанныеВложения, УникальныйИдентификатор)
ТелоПисьма.Добавить(НСтр("ru = 'Документ присоединен к письму.'"), ТипЭлементаФорматированногоДокумента.Текст);
ТелоПисьма.Добавить(, ТипЭлементаФорматированногоДокумента.ПереводСтроки);
ТелоПисьма.Добавить(, ТипЭлементаФорматированногоДокумента.ПереводСтроки);
АдресВложенияPDF = ПоместитьВоВременноеХранилище(ТабличныйДокументВPDF(ДвоичныеДанныеВложения), УникальныйИдентификатор);
ВложениеPDF = Новый Структура;
ВложениеPDF.Вставить("АдресВоВременномХранилище", АдресВложенияPDF);
ВложениеPDF.Вставить("Представление", СтрШаблон("%1.pdf", СведенияОДок));
Вложения.Добавить(ВложениеPDF);
КонецПроцедуры
Функция ТабличныйДокументВPDF(ДвоичныеДанныеВложения)
ТабличныйДокументВложения = ТабличныйДокументВложения(ДвоичныеДанныеВложения);
ПотокВПамяти = Новый ПотокВПамяти();
ТабличныйДокументВложения.Записать(ПотокВПамяти, ТипФайлаТабличногоДокумента.PDF);
Возврат ПотокВПамяти.ЗакрытьИПолучитьДвоичныеДанные();
КонецФункции
Функция ТабличныйДокументВложения(ДвоичныеДанныеВложения)
БуферДанныхВложения = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(ДвоичныеДанныеВложения);
ПотокВПамяти = Новый ПотокВПамяти(БуферДанныхВложения);
ТаблицаВложения = Новый ТабличныйДокумент;
ТаблицаВложения.Прочитать(ПотокВПамяти);
Возврат ТаблицаВложения;
КонецФункции
ТелоПисьма.Добавить(НСтр("ru = 'Документ присоединен к письму.'"), ТипЭлементаФорматированногоДокумента.Текст);
ТелоПисьма.Добавить(, ТипЭлементаФорматированногоДокумента.ПереводСтроки);
ТелоПисьма.Добавить(, ТипЭлементаФорматированногоДокумента.ПереводСтроки);
АдресВложенияPDF = ПоместитьВоВременноеХранилище(ТабличныйДокументВPDF(ДвоичныеДанныеВложения), УникальныйИдентификатор);
ВложениеPDF = Новый Структура;
ВложениеPDF.Вставить("АдресВоВременномХранилище", АдресВложенияPDF);
ВложениеPDF.Вставить("Представление", СтрШаблон("%1.pdf", СведенияОДок));
Вложения.Добавить(ВложениеPDF);
КонецПроцедуры
Функция ТабличныйДокументВPDF(ДвоичныеДанныеВложения)
ТабличныйДокументВложения = ТабличныйДокументВложения(ДвоичныеДанныеВложения);
ПотокВПамяти = Новый ПотокВПамяти();
ТабличныйДокументВложения.Записать(ПотокВПамяти, ТипФайлаТабличногоДокумента.PDF);
Возврат ПотокВПамяти.ЗакрытьИПолучитьДвоичныеДанные();
КонецФункции
Функция ТабличныйДокументВложения(ДвоичныеДанныеВложения)
БуферДанныхВложения = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(ДвоичныеДанныеВложения);
ПотокВПамяти = Новый ПотокВПамяти(БуферДанныхВложения);
ТаблицаВложения = Новый ТабличныйДокумент;
ТаблицаВложения.Прочитать(ПотокВПамяти);
Возврат ТаблицаВложения;
КонецФункции
💡 Шаблоны (готовые модели) кода 1С 8.3 с тегом #PDF:
📰 Актуальные новости с тегом #PDF:
- В версию 8.3.27 добавлен функционал проверки сертификата (для ЭЦП) на заданное время.
- В версию 8.3.26 добавлена возможность получения размера страницы PDF
0
комментарии
____________________
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник