Визуализация электронной подписи на исходящих документах в соответствии с ГОСТ Р 7.0.97-2016. Полная автоматизация
Визуализация ЭЦП по ГОСТу Р 7.0.97-2016, предложенная в предыдущей статье (https://infostart.ru/public/931674/) на данную тему, очень прижилась у меня в организации. Начальник часть писем повелел подписывать ЭЦП и не тревожить его по пустякам. Но механизм подписи требовал некоторого количества ручных действий, а хочется полной автоматизации.
Итак, постановка задачи: штамп должен позиционироваться сам, pdf-файл со штампом ЭЦП должен создаваться сам и в карточку исходящего документа тоже должен сам загружаться.
Здравствуйте.
Правильно ли я понимаю, что штамп позиционируется только при использовании шаблона файла, а в случае, если файл будет загружен не по шаблону, а произвольный, то установка штампа не произойдёт?
И вопросец. А пробовали добавлять штамп в xml в нижней части страницы, чтобы просто отдельной строкой или таблицей?
Доброй ночи! Штамп ЭЦП впечатывается вместо текстовой метки "Sign1" (или 2, 3 и т.д.). Эта метка может быть где угодно и её удобно использовать в шаблоне, но совершенно не обязательно.
Обработка меток происходит в 2 этапа:
1. сначала определяется количество меток в тексте шаблона
код подсчёта количества меток
// считаем количество меток
ЕстьМетка = Истина;
ВсегоМеток = 0;
Пока ЕстьМетка И ВсегоМеток < 10 Цикл
ЕстьМетка = СтрНайти(ПробныйФайл.ПолучитьТекст(), "Sign" + Строка(ВсегоМеток + 1)) > 0;
Если ЕстьМетка Тогда
ВсегоМеток = ВсегоМеток + 1;
КонецЕсли;
КонецЦикла;
ЕстьМеткиВставки = ВсегоМеток > 0;
Показать
2. потом xml-файл пересоздаётся с заменой этих меток на код соответствующего по номеру штампа.
код замены меток на штампы
//вставка разметки для штампа в файл
Пока ЧтениеXML.Прочитать() Цикл
Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
...
ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.Текст Тогда
Если ЕстьМеткиВставки И ЧтениеXML.Значение = "Sign" + Строка(НомерШтампа + 1) Тогда
// вставляем штамп с определённым номером
// проверяем, чтобы не превысить количество штампов в массиве
Если ГотовыеШтампыЭП.Количество() > НомерШтампа Тогда
ЗаписьXML.ЗаписатьБезОбработки(ГотовыеШтампыЭП[НомерШтампа]);
КонецЕсли;
НомерШтампа = НомерШтампа + 1;
Иначе
ЗаписьXML.ЗаписатьТекст(ЧтениеXML.Значение);
КонецЕсли;
ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЕсли;
КонецЦикла;
Показать
Второго вопроса я не понял. Что имеется ввиду под нижней частью таблицы? Нижний колонтитул? Если да, то штамп туда поставить можно, а вывести поля формы для автозаполнения нет.
(2)То есть к первому вопросу. Если нет меток то штамп не будет вставлен, т.е. в произвольном документе, который загрузит пользователь ничего не изменится, если его попытаться подписать и впечатать штампы.
2. Во втором вопросе я имел в виду:
А почему бы не добавлять абзацы(строки) с подписями и штампами прямо в нижней части документа без использования позиционирования? Я предположил, что, возможно, вы это пробовали сделать, может быть столкнулись с трудностями.
Дело в том, что мне всю вставку штампа нужно обработать на сервере, т.к. клиентская машина может быть не-windows.
В добавок, шаблон документа не подходит, т.к. неизвестно заранее количество подписей, и часто сам документ пользователь может добавить не по шаблону.
Плюс ко всему этому есть желание подписывать именно уже визуализированный документ в pdf, чтобы отправлять подписанный, а не "визуализацию" подписанного файла. Думаю, подписывать оба файла будет правильнее. И уже после вставки штампика.
{ОбщийМодуль.ПЛ_ВизуализацияЭЦПСервер.Модуль(42)}: Поле объекта не обнаружено (SN)
?(Сертификат.Субъект.Свойство("O"), Сертификат.Субъект.SN + " " + Сертификат.Субъект.GN, Сертификат.Субъект.CN)));
У себя поправил на:
...Сертификат.Субъект.Свойство("SN ")...
И ещё:
{ОбщийМодуль.ПЛ_ВизуализацияЭЦП_Клиент.Модуль(215)}: Ошибка при вызове метода контекста (Close)
МСВорд.Documents.Close();
по причине:
Произошла исключительная ситуация (Microsoft Word): Метод или свойство недоступны, поскольку эту команду нельзя использовать в режиме чтения.
1. Там в меню 2 команды: "Визуализация ЭЦП" и "Создать файл визуализации". По команде "Визуализация ЭЦП" метки не ищутся и выводится штамп прямо сверху документа, чтобы его можно было позиционировать руками куда надо (предварительно запрашиваются координаты). А по команде "Создать файл визуализации" ищутся метки и вместо них вставляются штампы. Если метки не найдены, то файл визуализации не формируется и выводится предупреждение.
2. Отвечу цитатой п.п. "а" п. 5.23 ГОСТ Р 7.0.97-2016: "место размещения отметки об электронной подписи должны соответствовать месту размещения собственноручной подписи в аналогичном документе на бумажном носителе;". Однако многим на это начхать. В версии 1С БГУ 1.0, например, информация об ЭЦП выводится над документом, полученным по ЭДО. И ничего страшного, мы публикуем такие документы на портале госзакупок и пока никто ничего не сказал. Несоответствие ГОСТу не делает документ юридически менее значимым.
3. По этому вопросу ничего не скажу. Выводить подписи снизу не по ГОСТу, но при формировании на сервере без меток непонятно как распределить штампы. ХЗ, короче.
Подписывать визуализированный файл идеологически неверно. По закону № 63-ФЗ "Об ЭЦП" есть определение: электронная подпись - информация в электронной форме, которая присоединена к другой информации в электронной форме (подписываемой информации) или иным образом связана с такой информацией и которая используется для определения лица, подписывающего информацию; Соответственно ЭЦП может быть прикреплённая и откреплённая (отдельный файл). Если Вы хотите отправлять юридически значимый файл контрагенту, то нужно его отправлять вместе с файлом ЭЦП, а на принимающей стороне должна производиться проверка корректности ЭЦП.
В настоящее время складывается практика отправки сканов документов со штампами ЭЦП (визуализированных документов), что неверно с точки зрения закона, но, как сказал наш юрист, "допустимо в сложившейся практике документооборота".
А почему не по ГОСТу? Ведь даже в примере подпись (штампик) снизу.
Ну может я плохо объясняю.
Я имел в виду всю строку, где указан подписант, его должность и сам штамп формировать полностью.
По поводу имён свойств не подскажу, всегда считал, что есть общепринятые свойства сертификата (O, CN, SN и т.д.), если у вас по-другому, то это странно.
Команду МСВорд.Documents.Close(); оберните в конструкцию Попытка ... Исключение ... У меня на клиентских машинах без данной команды оставались висеть процессы MS Word.
(6) Да в итоге когда закомментировал уже ошибка совместного доступа.
{ОбщийМодуль.ПЛ_ВизуализацияЭЦП_Клиент.Модуль(181)}: Ошибка при вызове метода контекста (ПереместитьФайл)
ПереместитьФайл(НовыйФайлZip, НовыйПутьКФайлу);
по причине:
Ошибка переименования файлов
по причине:
Ошибка совместного доступа к файлу 'C:\temp\!!!!!!!Исх шаблон.docx'. 32(0x00000020): Процесс не может получить доступ к файлу, так как этот файл занят другим процессом.
Надо будет добавить проверку на существование одноимённого файла.
и ошибка пропала.
Возможно разные версии office. Не понятно.
Ещё всё же, думаю, стоит имена файлов во временном хранилище формировать с помощью
ПолучитьИмяВременногоФайла ()
Ну или уникальный идентификатор приписывать...
и потом в конце прикрепления удалять файлы из временного хранилища. (в процессе их можно накапливать в массиве, к примеру)
1. Идеологически неверно потому, что визуализируется уже существующая подпись (так следует из ГОСТа), а сама подпись - это информация. И, конечно, вставка подписи в файл сделает подпись недействительной (1C:Документооборот не даст сохранить файл).
2. В примере штампик внизу, но он находится между полей формы, которые заполняются при заполнении шаблона: слева должность подписанта, справа его ФИО, так, что строго выполняется п.п. "а" п. 5.23 ГОСТа.
3. Для не-Windows систем есть следующие выходы:
а) если не-Windows клиент, а сервер Windows, то можно переписать алгоритм для формирования визуализации на сервере, но тогда только по шаблону с метками;
б) если Windows нет совсем, то можно адаптировать работу алгоритма к LibreOffice (тут коллеге удалось, можно связаться и уточнить), но тогда нужно решать вопрос с созданием PDF и либо искать соответствующую команду COM-сервера, либо пытаться реализовать печать на виртуальном принтере PDF (примеры для 1С и windows я находил в сети).
4.Ошибка МСВорд.Documents.Close(); очень странная. Я тестировал работу алгоритма на MS Word 2007 и 2016 и всё было нормально. Может переменная МСВорд.Documents как-то переинициализируется. Не знаю что и предположить.
"Произошла исключительная ситуация (Microsoft Word): Метод или свойство недоступны, поскольку эту команду нельзя использовать в режиме чтения." - Такая же ошибкаи у меня. Ворд подвешивается, и если еще раз прожать, то уже "Процесс не может получить доступ к файлу" естественно.
(12) Очень жаль, что вы не указываете хотя бы номер строки, в которой произошла ошибка. А в телепатии я пока слаб.
Очень похоже на ошибку, описанную с посте № 4, уважаемого antonio_i, он нашёл решение и описал его в посте № 11. Лично я с такой ошибкой не сталкивался.
Неплохая реализация, никаких проблем как у antonio_i не было. Жаль что юридическая составляющая этого всего никакая... т.к. док не подписан, а просто картинка.
А идей по поводу добавления визуализации в pdf нету?
(15) Позвольте не согласиться. Юридическая составляющая нормальная. Документ подписан в соответствии с ФЗ № 63 и визуализирован согласно ГОСТу.
Визуализация в pdf делается с помощью библиотеки pdftk. Там можно слепить 2 pdf-документа. Верхний содержит визуализацию и прозрачный фон, а нижний - сам документ. Тут сложными являются вопросы позиционирования штампа и согласования размеров изображений, на основании которых сделаны файлы pdf.
17.
it@medipal-onko.ru
30.07.19 14:43 Сейчас в теме
1. Если файл подписан несколькими подписями (Петров, Сидоров), то выводится 2 подписи Петрова.
2. Как заставить подпись позиционироваться внизу документа?
(17) 1. Я не тестировал на предмет вставки нескольких штампов (у меня только одна ЭП). Разные варианты штампов хранятся в массиве ГотовыеШтампыЭП. Надо посмотреть отладчиком что там. В новой версии ДО, разработчики суют все подписи в один штамп, может так и надо.
2. Штамп может вставляться вместо метки или по координатам. Подберите координаты, чтобы подпись вставала куда надо. Координаты указываются в форме настройки положения штрихода (https://infostart.ru/public/931674/)
19.
it@medipal-onko.ru
05.08.19 10:06 Сейчас в теме
(18) 1. У Вас ошибка, Вы не обнуляете Шаблон после замены, поэтому при наличии нескольких подписей всегда печатается первая заполненная. Нужно добавить в конец цикла получение шаблона
ШаблонДляВставкиШтампа = ВизуализацияЭЦПСервер.ПолучитьТекстДляВставки();
Тогда все красиво
2. Подскажите, как получить координаты подвала последней страницы в файле?
а если нужно в обычную печатную форму сделать вывод и потом сохранить в PDF? есть варианты?
через Word все плывет, а вывод, т.е. дорисовка чего-либо в PDF требует дополнительных программ, что тоже стабильности и простоты не добавляет