Добавление электронной подписи в документ PDF

26.08.21

Разработка - Универсальные функции

Как добавить подпись прямо в файл PDF, чтобы не нужно было файлы подписи передавать отдельно.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Добавление электронной подписи в документ PDF
.epf 7,41Kb
68
68 Скачать (1 SM) Купить за 1 850 руб.

Файлы PDF поддерживают внедрение в тело документа картинки с описанием, что файл PDF подписан и самой электронной подписи прямо в файл.

В платформе это реализовано начиная с версии 8.3.16. На Инфостарт есть статья на эту тему Подпись PDF в новой версии 8.3.16, но мне механизм не подошёл по ряду причин - код написан для выполнения на сервере, а при реальном использовании Крипто-ПРО ставится на клиент и вызовы должны быть соответственно на клиенте.

Грабли, на которые наступил:

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

* В качестве штампа используется Табличный документ - можно использовать вместо него картинку

* Время на добавление подписи на нормальном компьютере i7-10510U, 16Гб - 1,2 секунды, 98% времени вызов ЗаписьPDF.ЗаписатьПодпись. Есть предположение, что это время на взаимодействие с КриптоПро и концептуально его не ускорить.

 

Собственно сам код:

&НаКлиенте
Процедура Подписать(Команда)
	
	ПутьКФайлыПодписанный = СтрЗаменить(ПутьКФайлу, ".pdf", "_signed.pdf");
	КопироватьФайл(ПутьКФайлу, ПутьКФайлыПодписанный);
	
	ДанныеСертификата = ДанныеСертификата(Сертификат);
	Штамп = Штамп(ДанныеСертификата.Наименование, ДанныеСертификата.ДанныеСертификата);
	
	МенеджерКриптографии = Новый МенеджерКриптографии(ДанныеСертификата.ИмяПрограммы, "", ДанныеСертификата.ТипПрограммы);
	МенеджерКриптографии.ПарольДоступаКЗакрытомуКлючу = Пароль;
	
	ПодписьPDF = Новый ОписаниеПодписиPDF;
	ПодписьPDF.Имя = "ПодписьДоговора";
	ПодписьPDF.Сертификат = Новый СертификатКриптографии(ДанныеСертификата.ДанныеСертификата);
	ПодписьPDF.ТипПодписи = ТипПодписиPDF.Сертифицирующая;
	ПодписьPDF.БлокировкаДокумента = Истина;
	ПодписьPDF.Верх = -10;
	ПодписьPDF.Лево = 50;
	
	ЗаписьPDF = Новый ЗаписьPDF();
	ЗаписьPDF.Открыть(ПутьКФайлыПодписанный);
	
	ЗаписьPDF.ЗаписатьПодпись(МенеджерКриптографии, ПодписьPDF, Штамп);
	ЗаписьPDF.Закрыть();
	
КонецПроцедуры

&НаСервереБезКонтекста
Функция ДанныеСертификата(Сертификат)

	ДанныеСертификата = Новый Структура("Наименование, ДанныеСертификата, ИмяПрограммы, ТипПрограммы");
	
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("Сертификат", Сертификат);
	Запрос.Текст =
	"ВЫБРАТЬ
	|	Наименование,
	|	ДанныеСертификата,
	|	Программа.ИмяПрограммы КАК ИмяПрограммы,
	|	Программа.ТипПрограммы КАК ТипПрограммы,
	|	Организация.НаименованиеСокращенное КАК ОрганизацияНаименованиеСокращенное
	|ИЗ
	|	Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования
	|ГДЕ
	|	Ссылка = &Сертификат";
	
	Выборка = Запрос.Выполнить().Выбрать();
	
	Если Выборка.Следующий() Тогда 
		
		ЗаполнитьЗначенияСвойств(ДанныеСертификата, Выборка);
		ДанныеСертификата.ДанныеСертификата = Выборка.ДанныеСертификата.Получить();
		ДанныеСертификата.Наименование = Выборка.ОрганизацияНаименованиеСокращенное + ", " + Выборка.Наименование;
		
	КонецЕсли;
	
	Возврат ДанныеСертификата;

КонецФункции

&НаСервереБезКонтекста
Функция Штамп(НаименованиеСертификата, ДанныеСертификата)

	Штамп = Новый ТабличныйДокумент;
	
	Сертификат = Новый СертификатКриптографии(ДанныеСертификата);
	
	Область = Штамп.Область(1, 1, 1, 1);
	Область.Текст = НаименованиеСертификата + Символы.ПС
		+ Формат(ТекущаяДата(), "ДФ='dd.MM.yyyy HH:mm ""(MSK)""'")
		+ ", Сертификат № "
		+ СтрЗаменить(Сертификат.СерийныйНомер, " ", "");
	Цвет = WebЦвета.Синий;
	Линия = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная, 1);
	Область.ЦветТекста = Цвет;
	Область.ЦветРамки = Цвет;
	Область.ГраницаСверху = Линия;
	Область.ГраницаСнизу = Линия;
	Область.ГраницаСлева = Линия;
	Область.ГраницаСправа = Линия;
	
	Штамп.Область(, 1, , 1).ШиринаКолонки = 62;
	
	Штамп.Область(2,1,2,1).Текст = " ";
	
	Возврат Штамп;

КонецФункции

 

ЗаписьPDF Подпись PDF

См. также

Универсальные функции Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

21.05.2024    20226    dimanich70    81    

145

Универсальные функции Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

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

1 стартмани

18.03.2024    4099    3    John_d    11    

57

Универсальные функции Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    18188    atdonya    24    

57

Универсальные функции Программист Платформа 1С v8.3 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    5506    ke.92@mail.ru    16    

65

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    14772    YA_418728146    7    

166

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    3590    57    progmaster    8    

4

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    18494    171    sapervodichka    112    

135
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. capitan 2507 26.08.21 21:07 Сейчас в теме
Это наверное круто, но кто принимает такие подписи ?
2. fotov 315 27.08.21 10:17 Сейчас в теме
(1) В своём продукте я делаю подпись 2 раза - первый раз подписывается собственно сам PDF файл (подпись не отделяемая, но проверять её неудобно) и потом использую типовой функционал БСП ЭлектроннаяПодпись, чтобы создать отдельный типовые подписи.

Здесь риск в том, что рядовой пользователь в целях налоговой проверки может "забыть" выгрузить отдельные файлы подписи и внёдённая в PDF подпись повышает безопасность проверки.
3. capitan 2507 27.08.21 10:25 Сейчас в теме
(2)Мне кажется что это не ответ на поставленный вопрос ?
ФНС принимает ЭП в PDF файлах ?
cleaner_it; +1 Ответить
4. fotov 315 27.08.21 14:09 Сейчас в теме
(3) если говорить про сейчас - ФНС скорее всего такие документы не принимает

С другой стороны - данный механизм можно использовать для внутреннего документооборота - сейчас подтверждением согласования является только действия в программе. Можно в начале процесса формировать печатную форму в формате PDF и потом добавлять на неё подписи согласующих, которые можно проверить в любой программе (Acrobat reader, Foxit и сама 1С)
5. sinichenko_alex 211 30.08.21 15:53 Сейчас в теме
Спасибо очень полезная статья! Как раз занимаемся внедрением (пока простой ЭЦП) далее скорее всего пригодятся ваши труды!
user591389_aska_rabota; +1 Ответить
6. Yashazz 4791 30.08.21 19:56 Сейчас в теме
Неплохо, неплохо. Я несколько раз подбирался к PDF, написать про их нюансы, т.к. они очень сильно разные, по сути-то; да не осилил. Тема, на самом деле, имеет множество граблей, и респект поборовшим их.
9. v.a.t 31.08.21 19:09 Сейчас в теме
(6)Причем грабли настолько разнообразные что иногда приходится делать по принципу из Москвы в Питер да через Дальний восток. На ПЭП и ЭЦП для PDF я собаку съел. Есть механизмы генерации ПЭП средствами Adobe посредством скрипта JS, и установки поля подписи в любое место докумета (именно поле методом addField). Причем это работает только если установлен не ридер, а полный Adobe DC. Причем у кого-то это работает в одну итерацию установка поля а затем установка подписи в это поле, а у кого-то приходится делать в 2 итерации сначала устанавливать поле подписи записывать копию файла, а затем снова его открывать и устанавливать подпись в это поле.

С ЭЦП тоже весело, установка красивой подписи согласно фз-63 с логотипом организации, у кого - то все работает без проблем, посредством скрипта JS от крипто PDF. У кого-то приходиться танцы с бубном проводить чтобы оно заработало.

В общем сплошной не управляемый черный ящик...
10. Yashazz 4791 01.09.21 11:51 Сейчас в теме
(9) Да, точно... Увы... Смотря, опять же, откуда взялся исходный файл - если это плоский скан, тогда совсем труба; если послойный, то да, некоторые скрипты и библиотеки могут (причём порой сперва надо всё разобрать, потом воткнуть в нужное место, потом собрать заново), а если нормальный объектный, тогда ещё ладно. Заголовок PDF читать - та ещё песня...
7. Поручик 4692 31.08.21 09:43 Сейчас в теме
В основном это нужно для разных госконтор, которые любят весёлые картинки в документах. Логика у них примерно такая: сделайте нам, как в этом письме из министерства.
timurkarimov; +1 Ответить
8. fotov 315 31.08.21 11:22 Сейчас в теме
Для меня поводом внедрить ЭЦП прямо в файл PDF стало то, что бухгалтер прислал мне файл с УПД на котором есть надпись "Подписано ЭЦП", а самой подписи нет. И народ, который не в теме считает, что если надпись на файле есть - то уже всё, документ подписан и можно ничего больше не делать.
11. Yashazz 4791 01.09.21 11:52 Сейчас в теме
(8) Думаю, когда народ массово "осознает", в объект языка 1С добавят побольше инструментов, потому что сейчас это курам на смех.
12. dikar40 9 24.03.22 18:20 Сейчас в теме
Увы, даже простенький документ Word сохраненный в pdf не позволяет прицепить подпись указанным кодом.
Может есть вариант?
13. fotov 315 25.03.22 10:04 Сейчас в теме
(12) Скорее всего проблема связана с тем, что ломается механизм добавления штампа. Можно попытаться не добавлять штамп, но добавлять электронную подпись.
14. dikar40 9 25.03.22 15:48 Сейчас в теме
(12). Проверил. Подпись без штампа Подпись тоже не ставится. Написал на корпоративную техподдержку 1С
BorovikOV; +1 Ответить
15. dikar40 9 25.03.22 15:49 Сейчас в теме
Проверьте у себя. У меня любой pdf созданный из ворда не позволяет прицепить ЭП указанным методом.
На созданный из 1С - позволяет
16. dikar40 9 25.03.22 16:41 Сейчас в теме
Интересно. Склеил pdf из нескольких с помощью magick convert. Подпись позволяет ставить. Штамп - нет
17. oleg201007 39 13.04.22 10:56 Сейчас в теме
Добрый день! допиливаю свою самописную конфу для обмена с ЕГАИСЗ.
В xml запрос нужно интегрировать две подписи-предприятия и врача.
Это сделал.И еще нужно интегрировать в xml пдф заключение врача.
И вот этот пдф должен быть подписан подписью организации.
Подскажите, как подписать отткрепленной подписью пдф?
Спасибо
18. menen 15.03.23 05:13 Сейчас в теме
Добрый день, проверьте метод:

ЗаписьPDF.ЗаписатьПодпись(МенеджерКриптографии, ПодписьPDF, Штамп);

Согласно описанию синтаксис-помощника нужно:

ЗаписьPDF.ЗаписатьПодпись(МенеджерКриптографии, Штамп, ПодписьPDF);


ЗаписьPDF (PDFWriter)
ЗаписатьПодпись (WriteSignature)
Синтаксис:
ЗаписатьПодпись(<МенеджерКриптографии>, <ПредставлениеПодписи>, <ОписаниеПодписи>)
Параметры:
<МенеджерКриптографии> (обязательный)
Тип: МенеджерКриптографии.
Менеджер криптографии.
<ПредставлениеПодписи> (необязательный)
Тип: Картинка, ТабличныйДокумент.
Объект, представляющий собой оформление (штамп) электронной подписи PDF-документа. Если параметр не указан, оформление не создается (подпись не отображается).
<ОписаниеПодписи> (обязательный)
Тип: ОписаниеПодписиPDF.
Объект, содержащий описание электронной подписи PDF-документа.
19. пользователь 04.05.23 16:26
Сообщение было скрыто модератором.
...
20. user790109 10 31.05.23 12:41 Сейчас в теме
А как добавить двойную подпись ЭЦП (т.е. по сути надо добавить 2 подписи ЭЦП)?. Пробую на внешней ПФ ТТН для РТУ, где нужно добавить 2 подписи сразу (отправитель и получатель).
Пример как надо приводят из СБИСА пользователи(пример на скрине).
При попытке добавить 2 подпись выдает ошибку. Если проставлять 1 подпись то все нормально.


Сертифицирующая подпись не уникальна
{ВнешняяОбработка.ПечатьТТН.Форма.Форма.Форма(150)}:ЗаписьPDF.ЗаписатьПодпись(МенеджерКриптографии, ПодписьPDF, Штамп);

по причине:
Сертифицирующая подпись не уникальна
Прикрепленные файлы:
21. evgeniyasm 16.05.24 11:27 Сейчас в теме
Добрый день. А для БГУ можно сделать, чтобы работало? Очень сильно нужно
22. user1299235 05.08.24 00:58 Сейчас в теме
Спасибо автору.
Я у себя сделал подписание документов для внутреннего документооборота по этой методе. Лечебное учреждение. У всех есть УКЭП потому, что положено подписывать медицинские документы. Подписание мед.документов есть из коробки. Грех не воспользоваться и не применить УКЭПы для внутрянки.

Сотрудник загружает вордовый документ, нажимает кнопку "преобразовать", которая на клиенте посредством com обращения к word делает из него pdf. Далее сотрудник нажимает "подписать". Есть трудности с простановкой штампов, когда подписей много, но я в итоге сделал, что штамп ставится на первые 8, а остальные без штампа.
Ещё сделал код, который после подписания перечитывает подписи и проставляет галочки кто подписал в сам документ.

Для кадровых документов сделал ещё проще. Сотрудник создает документ, выбирает тип - например "заявление на отпуск". Указывает даты, и нажатием одной кнопки формируется pdf-файл по html-шаблону. Ему остается только поставить подпись.

Жаль только, что платформа пока что не позволяет ставить подпись на PDF с штампом времени. По крайней мере я так и не нашел, как это сделать.
23. goodcove 15.10.24 14:42 Сейчас в теме
Спасибо!
Статья очень помогла.
Подскажите почему у вас СертификатКриптографии работает без инициализации?
У меня пишет объект не инициализирован.
Оставьте свое сообщение