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

26.08.21

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

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

Скачать файлы

Наименование Файл Версия Размер
Добавление электронной подписи в документ PDF
.epf 7,41Kb
55
.epf 7,41Kb 55 Скачать

Файлы 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.3.24)

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

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

1 стартмани

18.03.2024    2670    0    John_d    8    

54

GUID в 1С 8.3 - как с ними быть

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

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

12.02.2024    4606    atdonya    22    

45

Переоткрытие внешних обработок

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

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

30.11.2023    3960    ke.92@mail.ru    16    

61

Валидация JSON через XDTO (включая массивы)

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

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

28.08.2023    8819    YA_418728146    6    

141

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

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

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

2 стартмани

22.08.2023    2071    21    progmaster    7    

3

Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов

Инструментарий разработчика Универсальные функции Платформа 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    16143    133    sapervodichka    112    

129

Система контроля ведения учета [БСП]

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

В данном материале рассмотрим типовой алгоритм подсистемы контроля учета БСП в конфигурациях на примерах.

18.07.2022    7243    quazare    8    

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

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

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


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

по причине:
Сертифицирующая подпись не уникальна
Прикрепленные файлы:
Оставьте свое сообщение