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

26.08.21

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

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

Файлы

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

Наименование Скачано Купить файл
Добавление электронной подписи в документ PDF
.epf 7,41Kb
85 1 850 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Файлы 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С:Предприятие 8 Бесплатно (free)

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

14.05.2025    5531    DeerCven    15    

57

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

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

21.05.2024    46703    dimanich70    83    

165

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

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

1 стартмани

18.03.2024    6895    6    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

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

12.02.2024    57925    atdonya    31    

68

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

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

30.11.2023    8673    ke.92@mail.ru    17    

68

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

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

28.08.2023    22904    YA_418728146    8    

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

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

С другой стороны - данный механизм можно использовать для внутреннего документооборота - сейчас подтверждением согласования является только действия в программе. Можно в начале процесса формировать печатную форму в формате PDF и потом добавлять на неё подписи согласующих, которые можно проверить в любой программе (Acrobat reader, Foxit и сама 1С)
5. sinichenko_alex 216 30.08.21 15:53 Сейчас в теме
Спасибо очень полезная статья! Как раз занимаемся внедрением (пока простой ЭЦП) далее скорее всего пригодятся ваши труды!
user591389_aska_rabota; +1 Ответить
6. Yashazz 4889 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 4889 01.09.21 11:51 Сейчас в теме
(9) Да, точно... Увы... Смотря, опять же, откуда взялся исходный файл - если это плоский скан, тогда совсем труба; если послойный, то да, некоторые скрипты и библиотеки могут (причём порой сперва надо всё разобрать, потом воткнуть в нужное место, потом собрать заново), а если нормальный объектный, тогда ещё ладно. Заголовок PDF читать - та ещё песня...
7. Поручик 4598 31.08.21 09:43 Сейчас в теме
В основном это нужно для разных госконтор, которые любят весёлые картинки в документах. Логика у них примерно такая: сделайте нам, как в этом письме из министерства.
timurkarimov; +1 Ответить
8. fotov 329 31.08.21 11:22 Сейчас в теме
Для меня поводом внедрить ЭЦП прямо в файл PDF стало то, что бухгалтер прислал мне файл с УПД на котором есть надпись "Подписано ЭЦП", а самой подписи нет. И народ, который не в теме считает, что если надпись на файле есть - то уже всё, документ подписан и можно ничего больше не делать.
11. Yashazz 4889 01.09.21 11:52 Сейчас в теме
(8) Думаю, когда народ массово "осознает", в объект языка 1С добавят побольше инструментов, потому что сейчас это курам на смех.
12. dikar40 9 24.03.22 18:20 Сейчас в теме
Увы, даже простенький документ Word сохраненный в pdf не позволяет прицепить подпись указанным кодом.
Может есть вариант?
13. fotov 329 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 45 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. SergMasss 10 31.05.23 12:41 Сейчас в теме
А как добавить двойную подпись ЭЦП (т.е. по сути надо добавить 2 подписи ЭЦП)?. Пробую на внешней ПФ ТТН для РТУ, где нужно добавить 2 подписи сразу (отправитель и получатель).
Пример как надо приводят из СБИСА пользователи(пример на скрине).
При попытке добавить 2 подпись выдает ошибку. Если проставлять 1 подпись то все нормально.


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

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

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

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

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