&НаКлиенте
Процедура КнопкаПодписать(Команда)
ЗаписанныеОбъекты = ПодписатьPDFНаСервере();
Если ЗаписанныеОбъекты.Количество() > 0 Тогда
ОповеститьОбИзменении(ТипЗнч(ЗаписанныеОбъекты[0]));
КонецЕсли;
Для Каждого ЗаписанныйОбъект Из ЗаписанныеОбъекты Цикл
Оповестить("Запись_Файл", Новый Структура, ЗаписанныйОбъект);
КонецЦикла;
ПоказатьОповещениеПользователя(, , НСтр("ru = 'Подписание завершено'"), БиблиотекаКартинок.Информация32);
КонецПроцедуры
&НаСервере
Функция ПодписатьPDFНаСервере()
ПараметрыСертификата = ПодготовитьПараметрыСертификата();
ВыбранныйОбъект = Неопределено;
ТипФайла = ТипФайлаТабличногоДокумента.PDF;
// Заполнение списка выбора для присоединения файлов к объекту.
Для Каждого ОбъектПечати Из ОбъектыПечати Цикл
Если КОбъектуМожноПрисоединятьФайлы(ОбъектПечати.Значение) Тогда
ВыбранныйОбъект = ОбъектПечати.Значение;
КонецЕсли;
КонецЦикла;
ЕстьВозможностьПрисоединения = ВыбранныйОбъект <> Неопределено;
// Объект для присоединения по умолчанию.
Если Не ЕстьВозможностьПрисоединения Тогда
//ВыбранныйОбъект = Элементы.ВыбранныйОбъект.СписокВыбора[0].Значение;
// ошибка сообщить
КонецЕсли;
ФайлыВоВременномХранилище = Новый Массив;
// подготовка временной папки
ИмяВременнойПапки = ПолучитьИмяВременногоФайла();
СоздатьКаталог(ИмяВременнойПапки);
ТаблицаФорматов = УправлениеПечатью.НастройкиФорматовСохраненияТабличногоДокумента();
// сохранение печатных форм
ОбработанныеПечатныеФормы = Новый Массив;
Для Каждого НастройкаПечатнойФормы Из НастройкиПечатныхФорм Цикл
ПечатнаяФорма = ЭтотОбъект[НастройкаПечатнойФормы.ИмяРеквизита];
Если ОбработанныеПечатныеФормы.Найти(ПечатнаяФорма) = Неопределено Тогда
ОбработанныеПечатныеФормы.Добавить(ПечатнаяФорма);
Иначе
Продолжить;
КонецЕсли;
Если ВычислитьИспользованиеВывода(ПечатнаяФорма) = ИспользованиеВывода.Запретить Тогда
Продолжить;
КонецЕсли;
Если ПечатнаяФорма.Защита Тогда
Продолжить;
КонецЕсли;
Если ПечатнаяФорма.ВысотаТаблицы = 0 Тогда
Продолжить;
КонецЕсли;
ПечатныеФормыПоОбъектам = УправлениеПечатью.ПечатныеФормыПоОбъектам(ПечатнаяФорма, ОбъектыПечати);
Для Каждого СоответствиеОбъектаПечатнойФорме Из ПечатныеФормыПоОбъектам Цикл
ОбъектПечати = СоответствиеОбъектаПечатнойФорме.Ключ;
ПечатнаяФорма = СоответствиеОбъектаПечатнойФорме.Значение;
НастройкиФормата = ТаблицаФорматов.НайтиСтроки(Новый Структура("ТипФайлаТабличногоДокумента", ТипФайла))[0];
ЗаданныеИменаПечатныхФорм = ОбщегоНазначения.ЗначениеИзСтрокиXML(НастройкаПечатнойФормы.ИмяФайлаПечатнойФормы);
ИмяФайла = УправлениеПечатью.ИмяФайлаПечатнойФормыОбъекта(ОбъектПечати, ЗаданныеИменаПечатныхФорм, НастройкаПечатнойФормы.Название);
ИмяФайла = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыВИмениФайла(ИмяФайла);
ИмяФайла = ИмяФайла + "." + НастройкиФормата.Расширение;
ПолноеИмяФайла = УникальноеИмяФайла(ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ИмяВременнойПапки) + ИмяФайла);
ПечатнаяФорма.Записать(ПолноеИмяФайла, ТипФайла);
Штамп = ЭлектроннаяПодпись.ШтампВизуализацииЭлектроннойПодписи(ПараметрыСертификата.СертификатКриптографии, ТекущаяДата());
ПодписьPDF = Новый ОписаниеПодписиPDF;
ПодписьPDF.Имя = "ПодписьДокумента";
ПодписьPDF.Сертификат = ПараметрыСертификата.СертификатКриптографии;
ПодписьPDF.ТипПодписи = ТипПодписиPDF.Утверждающая;
ПодписьPDF.БлокировкаДокумента = Истина;
ЗаписьPDF = Новый ЗаписьPDF(ПолноеИмяФайла);
ЗаписьPDF.ЗаписатьПодпись(ПараметрыСертификата.МенеджерКриптографии, ПодписьPDF, Штамп);
ЗаписьPDF.Закрыть();
ДвоичныеДанные = Новый ДвоичныеДанные(ПолноеИмяФайла);
ПутьВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификаторХранилища);
ОписаниеФайла = Новый Структура;
ОписаниеФайла.Вставить("Представление", ИмяФайла);
ОписаниеФайла.Вставить("АдресВоВременномХранилище", ПутьВоВременномХранилище);
ФайлыВоВременномХранилище.Добавить(ОписаниеФайла);
КонецЦикла;
КонецЦикла;
УдалитьФайлы(ИмяВременнойПапки);
ЗаписанныеОбъекты = ПрисоединитьПечатныеФормыКОбъекту(ФайлыВоВременномХранилище, ВыбранныйОбъект);
Возврат ЗаписанныеОбъекты;
КонецФункции
&НаСервере
Функция КОбъектуМожноПрисоединятьФайлы(СсылкаНаОбъект)
МожноПрисоединять = Неопределено;
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда
МодульРаботаСФайлами = ОбщегоНазначения.ОбщийМодуль("ПрисоединенныеФайлы");
МожноПрисоединять = МодульРаботаСФайлами.КОбъектуМожноПрисоединятьФайлы(СсылкаНаОбъект);
КонецЕсли;
Если МожноПрисоединять = Неопределено Тогда
МожноПрисоединять = Ложь;
КонецЕсли;
Возврат МожноПрисоединять;
КонецФункции
&НаСервере
Функция ПодготовитьПараметрыСертификата()
ПараметрыСертификата = Новый Структура("Сертификат, СертификатКриптографии, Пароль, МенеджерКриптографии");
ПараметрыСертификата.Сертификат = Константы.СертификатPDF.Получить();
Если Не ЗначениеЗаполнено(ПараметрыСертификата.Сертификат) Тогда
Возврат ПараметрыСертификата;
КонецЕсли;
РеквизитыСертификата = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ПараметрыСертификата.Сертификат, "Отпечаток, Программа");
ПараметрыСертификата.СертификатКриптографии = ЭлектроннаяПодписьСлужебный.ПолучитьСертификатПоОтпечатку(РеквизитыСертификата.Отпечаток, Ложь, Ложь);
Данные = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(ПараметрыСертификата.Сертификат,"ПаролиСертификатов");
Если ТипЗнч(Данные) <> Тип("Соответствие") Тогда
// todo предлагать вводить пароль пользователю
КонецЕсли;
ПараметрыСертификата.Пароль = Данные.Получить(Пользователи.ТекущийПользователь());
МенеджерКриптографии = ЭлектроннаяПодпись.МенеджерКриптографии("Подписание", Ложь, , РеквизитыСертификата.Программа);
МенеджерКриптографии.ПарольДоступаКЗакрытомуКлючу = ПараметрыСертификата.Пароль;
ПараметрыСертификата.МенеджерКриптографии = МенеджерКриптографии;
Возврат ПараметрыСертификата;
КонецФункции