Визуализация электронной подписи на исходящих документах в соответствии с ГОСТ Р 7.0.97-2024. Полная автоматизация



Визуализация ЭЦП по ГОСТу Р 7.0.97-2024, предложенная в предыдущей статье (https://infostart.ru/public/931674/) на данную тему, очень прижилась у меня в организации. Начальник часть писем повелел подписывать ЭЦП и не тревожить его по пустякам. Но механизм подписи требовал некоторого количества ручных действий, а хочется полной автоматизации.
Итак, постановка задачи: штамп должен позиционироваться сам, pdf-файл со штампом ЭЦП должен создаваться сам и в карточку исходящего документа тоже должен сам загружаться.

На помощь нам приходит заполнение файла по шаблону, в который мы поместим особую метку. Но раз мы используем заполнение по шаблону, то правильно будет заполнять автоматически исходящий номер, краткое наименование документа, сведения о подписывающем лице и исполнителе документа. Файл шаблона и алгоритмы заполнения полей MS Word я приложу в архиве вместе с реализацией алгоритмов заполнения.
Алгоритм действий пользователей при подготовке исходящего письма следующий:

  1. Исполнитель создаёт письмо по шаблону, заполняет реквизиты и допечатывает необходимый текст в частично заполненный документ.
  2. Документ проходит процессы согласования, которые приняты в организации для такого вида документов.
  3. Согласованный документ отправляется на регистрацию.
  4. Сотрудник документооборота, снабжённый ЭЦП начальника:
    • проверяет правильность оформления документа;
    • регистрирует документ;
    • заполняет регистрационную информацию в файле;
    • подписывает документ ЭЦП;
    • формирует визуализацию данного документа;
    • отправляет документ по почте (при использовании внутренней почты в исходящем письме необходимо удалить файл, подписанный ЭЦП, т. к. он всё равно не уйдёт).

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

Небольшая ремарка про метки. Их в общем случае может быть несколько. Называются они «Sign1”, “Sign2” и т. д. Они расставляются в нужных местах документа и красятся белым цветом, чтобы их не было видно. Размер штампа по вертикали составляет 2,7 см, и чтобы текст ниже штампа не поплыл (MS Word не позволяет использовать поля формы в колонтитулах), необходимо создавать запас пространства. В файле примера используется невидимая таблица с фиксированной высотой.

Непосредственно в форме элемента справочника «Исходящие документы» необходимо создать команды «Визулизация ЭЦП» и «Создать файл визуализации», и привязать их к функциональной опции «Использовать электронные подписи». Эти команды нужно разместить в группе «Форма ЭП и Шифрование/ЭП» с настройкой «Только во всех действиях» и в группе “КонтекстноеМенюФайлыГруппаЭП” таблицы значений «Файлы». Чтобы было совсем красиво, можно внести изменения в процедуру «УстановитьДоступностьКоманд».

Пара моментов про создание файлов PDF. Файлы создаются на компьютере пользователя и по этому MS Word 2007+ должен стоять там. Но MS Word умеет сохранять документы в формат PDF только с версии 2010. Для пользователей MS Word 2007 необходимо установить надстройку 2007 Microsoft Office: сохранение в формате PDF или XPS (Майкрософт).

Блоки кода большие и я их спрячу под спойлер.

 

 Модифицированная процедура "УстановитьДоступностьКоманд"

 

 Текст команд визуализации

Вот и всё, останется только заставить пользователей делать исходящие письма по шаблону. Очень помогает открыть тайну копирования карточки документов, а то люди думают, что им нужно будет заново набирать тексты у всех исходящих писем.

В архиве содержатся следующие файлы:

  1. файл конфигурации для объединения с основной;
  2. пример шаблона исходящего письма;
  3. скрипты заполнения полей файла шаблона.

P.S. Чуть не забыл. При заполнении шаблона в качестве телефона исполнителя документа выводится рабочий телефон и чтобы он появился в системе нужно добавить соответствующую запись в справочнике "Виды контактной информации" в группу "Контактная информация справочника "Пользователи".

Все доработки реально работают в 1С:Документооборот версии 2.1.12.2. Теперь не стыдно и в XXI век шагнуть.

22 Comments

  1. antonio_i

    Здравствуйте.

    Правильно ли я понимаю, что штамп позиционируется только при использовании шаблона файла, а в случае, если файл будет загружен не по шаблону, а произвольный, то установка штампа не произойдёт?

    И вопросец. А пробовали добавлять штамп в xml в нижней части страницы, чтобы просто отдельной строкой или таблицей?

    Reply
  2. soulner
    Reply
  3. antonio_i

    (2)То есть к первому вопросу. Если нет меток то штамп не будет вставлен, т.е. в произвольном документе, который загрузит пользователь ничего не изменится, если его попытаться подписать и впечатать штампы.

    2. Во втором вопросе я имел в виду:

    А почему бы не добавлять абзацы(строки) с подписями и штампами прямо в нижней части документа без использования позиционирования? Я предположил, что, возможно, вы это пробовали сделать, может быть столкнулись с трудностями.

    Дело в том, что мне всю вставку штампа нужно обработать на сервере, т.к. клиентская машина может быть не-windows.

    В добавок, шаблон документа не подходит, т.к. неизвестно заранее количество подписей, и часто сам документ пользователь может добавить не по шаблону.

    Плюс ко всему этому есть желание подписывать именно уже визуализированный документ в pdf, чтобы отправлять подписанный, а не «визуализацию» подписанного файла. Думаю, подписывать оба файла будет правильнее. И уже после вставки штампика.

    Reply
  4. antonio_i

    (2) Словил ошибку:


    {ОбщийМодуль.ПЛ_ВизуализацияЭЦПСервер.Модуль(42)}: Поле объекта не обнаружено (SN)

    ?(Сертификат.Субъект.Свойство(«O»), Сертификат.Субъект.SN + » » + Сертификат.Субъект.GN, Сертификат.Субъект.CN)));

    У себя поправил на:

    …Сертификат.Субъект.Свойство(«SN «)…

    И ещё:

    {ОбщийМодуль.ПЛ_ВизуализацияЭЦП_Клиент.Модуль(215)}: Ошибка при вызове метода контекста (Close)

    МСВорд.Documents.Close();

    по причине:

    Произошла исключительная ситуация (Microsoft Word): Метод или свойство недоступны, поскольку эту команду нельзя использовать в режиме чтения.
    Reply
  5. soulner

    1. Там в меню 2 команды: «Визуализация ЭЦП» и «Создать файл визуализации». По команде «Визуализация ЭЦП» метки не ищутся и выводится штамп прямо сверху документа, чтобы его можно было позиционировать руками куда надо (предварительно запрашиваются координаты). А по команде «Создать файл визуализации» ищутся метки и вместо них вставляются штампы. Если метки не найдены, то файл визуализации не формируется и выводится предупреждение.

    2. Отвечу цитатой п.п. «а» п. 5.23 ГОСТ Р 7.0.97-2016: «место размещения отметки об электронной подписи должны соответствовать месту размещения собственноручной подписи в аналогичном документе на бумажном носителе;». Однако многим на это начхать. В версии 1С БГУ 1.0, например, информация об ЭЦП выводится над документом, полученным по ЭДО. И ничего страшного, мы публикуем такие документы на портале госзакупок и пока никто ничего не сказал. Несоответствие ГОСТу не делает документ юридически менее значимым.

    3. По этому вопросу ничего не скажу. Выводить подписи снизу не по ГОСТу, но при формировании на сервере без меток непонятно как распределить штампы. ХЗ, короче.

    Подписывать визуализированный файл идеологически неверно. По закону № 63-ФЗ «Об ЭЦП» есть определение: электронная подпись — информация в электронной форме, которая присоединена к другой информации в электронной форме (подписываемой информации) или иным образом связана с такой информацией и которая используется для определения лица, подписывающего информацию; Соответственно ЭЦП может быть прикреплённая и откреплённая (отдельный файл). Если Вы хотите отправлять юридически значимый файл контрагенту, то нужно его отправлять вместе с файлом ЭЦП, а на принимающей стороне должна производиться проверка корректности ЭЦП.

    В настоящее время складывается практика отправки сканов документов со штампами ЭЦП (визуализированных документов), что неверно с точки зрения закона, но, как сказал наш юрист, «допустимо в сложившейся практике документооборота».

    Reply
  6. soulner

    По поводу имён свойств не подскажу, всегда считал, что есть общепринятые свойства сертификата (O, CN, SN и т.д.), если у вас по-другому, то это странно.

    Команду МСВорд.Documents.Close(); оберните в конструкцию Попытка … Исключение … У меня на клиентских машинах без данной команды оставались висеть процессы MS Word.

    Reply
  7. antonio_i

    (5)

    Подписывать визуализированный файл идеологически неверно.

    Это потому что подписывание идёт вслед за установкой штампа?

    Но получается, что установка штампа после подписи сломает подпись.

    (5)

    Выводить подписи снизу не по ГОСТу

    А почему не по ГОСТу? Ведь даже в примере подпись (штампик) снизу.

    Ну может я плохо объясняю.

    Я имел в виду всю строку, где указан подписант, его должность и сам штамп формировать полностью.

    Reply
  8. antonio_i

    (6) Да в итоге когда закомментировал уже ошибка совместного доступа.

    {ОбщийМодуль.ПЛ_ВизуализацияЭЦП_Клиент.Модуль(181)}: Ошибка при вызове метода контекста (ПереместитьФайл)
    ПереместитьФайл(НовыйФайлZip, НовыйПутьКФайлу);
    по причине:
    Ошибка переименования файлов
    по причине:
    Ошибка совместного доступа к файлу ‘C:	emp!!!!!!!Исх шаблон.docx’. 32(0x00000020): Процесс не может получить доступ к файлу, так как этот файл занят другим процессом. 

    Надо будет добавить проверку на существование одноимённого файла.

    Reply
  9. antonio_i

    (5) И ещё

    Правильно ли я понимаю, что на не-windows системах работать не будет?

    Reply
  10. soulner

    1. Идеологически неверно потому, что визуализируется уже существующая подпись (так следует из ГОСТа), а сама подпись — это информация. И, конечно, вставка подписи в файл сделает подпись недействительной (1C:Документооборот не даст сохранить файл).

    2. В примере штампик внизу, но он находится между полей формы, которые заполняются при заполнении шаблона: слева должность подписанта, справа его ФИО, так, что строго выполняется п.п. «а» п. 5.23 ГОСТа.

    3. Для не-Windows систем есть следующие выходы:

    а) если не-Windows клиент, а сервер Windows, то можно переписать алгоритм для формирования визуализации на сервере, но тогда только по шаблону с метками;

    б) если Windows нет совсем, то можно адаптировать работу алгоритма к LibreOffice (тут коллеге удалось, можно связаться и уточнить), но тогда нужно решать вопрос с созданием PDF и либо искать соответствующую команду COM-сервера, либо пытаться реализовать печать на виртуальном принтере PDF (примеры для 1С и windows я находил в сети).

    4.Ошибка МСВорд.Documents.Close(); очень странная. Я тестировал работу алгоритма на MS Word 2007 и 2016 и всё было нормально. Может переменная МСВорд.Documents как-то переинициализируется. Не знаю что и предположить.

    Reply
  11. antonio_i

    (6)

    Оказалось, что документ открывался только на чтение в строке

    WordДокумент = МСВорд.Documents.Open(НовыйПутьКФайлу,, -1);

    Исправил на

    WordДокумент = МСВорд.Documents.Open(НовыйПутьКФайлу,, Ложь);

    и ошибка пропала.

    Возможно разные версии office. Не понятно.

    Ещё всё же, думаю, стоит имена файлов во временном хранилище формировать с помощью

    ПолучитьИмяВременногоФайла ()

    Ну или уникальный идентификатор приписывать…

    и потом в конце прикрепления удалять файлы из временного хранилища. (в процессе их можно накапливать в массиве, к примеру)

    Reply
  12. kaljro

    «Произошла исключительная ситуация (Microsoft Word): Метод или свойство недоступны, поскольку эту команду нельзя использовать в режиме чтения.» — Такая же ошибкаи у меня. Ворд подвешивается, и если еще раз прожать, то уже «Процесс не может получить доступ к файлу» естественно.

    Reply
  13. soulner

    (12) Очень жаль, что вы не указываете хотя бы номер строки, в которой произошла ошибка. А в телепатии я пока слаб.

    Очень похоже на ошибку, описанную с посте № 4, уважаемого antonio_i, он нашёл решение и описал его в посте № 11. Лично я с такой ошибкой не сталкивался.

    Reply
  14. antonio_i

    (12)

    Посмотрите мой ответ № 11

    Там у меня была такая же ошибка, я исправил.

    Reply
  15. Монту

    Неплохая реализация, никаких проблем как у antonio_i не было. Жаль что юридическая составляющая этого всего никакая… т.к. док не подписан, а просто картинка.

    А идей по поводу добавления визуализации в pdf нету?

    Reply
  16. soulner

    (15) Позвольте не согласиться. Юридическая составляющая нормальная. Документ подписан в соответствии с ФЗ № 63 и визуализирован согласно ГОСТу.

    Визуализация в pdf делается с помощью библиотеки pdftk. Там можно слепить 2 pdf-документа. Верхний содержит визуализацию и прозрачный фон, а нижний — сам документ. Тут сложными являются вопросы позиционирования штампа и согласования размеров изображений, на основании которых сделаны файлы pdf.

    Reply
  17. it@medipal-onko.ru

    1. Если файл подписан несколькими подписями (Петров, Сидоров), то выводится 2 подписи Петрова.

    2. Как заставить подпись позиционироваться внизу документа?

    Reply
  18. soulner

    (17) 1. Я не тестировал на предмет вставки нескольких штампов (у меня только одна ЭП). Разные варианты штампов хранятся в массиве ГотовыеШтампыЭП. Надо посмотреть отладчиком что там. В новой версии ДО, разработчики суют все подписи в один штамп, может так и надо.

    2. Штамп может вставляться вместо метки или по координатам. Подберите координаты, чтобы подпись вставала куда надо. Координаты указываются в форме настройки положения штрихода (https://infostart.ru/public/931674/)

    Reply
  19. it@medipal-onko.ru

    (18) 1. У Вас ошибка, Вы не обнуляете Шаблон после замены, поэтому при наличии нескольких подписей всегда печатается первая заполненная. Нужно добавить в конец цикла получение шаблона

    ШаблонДляВставкиШтампа = ВизуализацияЭЦПСервер.ПолучитьТекстДляВставки();

    Тогда все красиво

    2. Подскажите, как получить координаты подвала последней страницы в файле?

    Reply
  20. izidakg

    а если нужно в обычную печатную форму сделать вывод и потом сохранить в PDF? есть варианты?

    через Word все плывет, а вывод, т.е. дорисовка чего-либо в PDF требует дополнительных программ, что тоже стабильности и простоты не добавляет

    Reply
  21. soulner

    (20) Добрый день. Не по теме вопрос. В данной публикации рассматривается подпись и визуализация произвольного документа (формат MS Word 2007+). В частности исходящего письма. А как у вас реализована генерация писем через обычную печатную форму? Поделитесь, интересно.

    Если у Вас печатная форма, то всё значительно проще. Штамп с параметрами для подписи можно задизайнить прямо в макете и потом вжух:

    ТабДок.Записать(ИмяФайла,ТипФайлаТабличногоДокумента.PDF);

    и получить pdf-файл.

    Reply
  22. izidakg

    (21) еще не доделал, по сути таже зд, только другие детали

    сохранение в виде Word, Excel, PDF роли не играет. Ваш вариант заточен на письма, мне нужно шире. Нужно сохранить печатную форму, наложить подпись ЭЦП, возможно подписать ЭЦП

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *