Вопрос отправки подписанного файла с ЭП из внутренней почты рассматривался в прошлой публикации.
Сразу оговорюсь, что проверка подписей — сложный процесс. На сервере, который принимает почту, необходимо устанавливать сертификаты всех удостоверяющих центров, которые выдают подписи вашим контрагентам, и отслеживать их актуальность. Также, чтобы всё работало, необходимо установить опцию «Проверять подписи и сертификаты на сервере» в настройках электронной подписи.
Не менее сложный процесс - сопоставление откреплённой подписи и файла. Мой метод базируется на предположении, что имя файла документа с расширением содержится в имени файла подписи. Но всё равно этот метод трудно считать на 100% точным, требуется ручной контроль. Файл подписи определяется по расширению. Сейчас, как я понял, используется два варианта «p7s» (1С) и «sig» (все остальные). Если нужно добавить свои, то дописываем строку в функции «ПолучитьРасширенияЭП()» общего модуля расширения «ППЭП_ОбработкаЭП».
Опишу кратко алгоритм работы.
- Загрузка почтовых вложений происходит в процедуре «ЗаписатьВходящееПисьмо()» общего модуля «ВстроеннаяПочтаСервер». Т.к. тип вызова функции в расширении «Вместо с контролем» работает странно (по крайней мере у меня на 8.3.15.1830), пришлось всю функцию утащить в расширение. Там есть рекурсивная процедура «ДобавитьФайлыИзИнтернетПочтовогоСообщения()», которая непосредственно загружает файлы в письмо и по результатам своей деятельности формирует массив ссылок на файлы.
- Мы берём массив файлов, переносим в таблицу и сортируем по убыванию длины. Делаем это для более точного определения принадлежности подписи.
- Далее, получаем подписи для файла, читаем их, проверяем на корректность и добавляем к файлу со всеми отметками о результатах и дате проверки. На самом деле мы подписываем не сам файл, а его версию, а в файле только признак ставим.
- Если всё получилось, то помечаем файлы подписей на удаление, а если где-то ошибка, то оставляем, чтобы можно было добавить подпись вручную уже после создания входящего документа.
Т.е. ключевая идея состоим в том, чтобы добавить подпись к файлу на этапе приёма письма, а не при создании внутреннего документа. Мне так показалось проще. Соответственно потом, при создании входящего документа, файл в него переносится уже подписанный и с отметками о проверке.
Код сильно закомментирован, делал для себя, чтобы проще было понять логику работы программы, соответственно будет полезно всем, кто интересуется механизмами работы с ЭП и сертификатами в 1С:Документооборот.
Что делать, если на момент приёма письма, на сервере не был установлен сертификат удостоверяющего центра контрагента? Тут всё просто: ставим сертификат и проводим повторную проверку подписи.
Как организовать подписание договора с использованием ЭП? Договор — внутренний документ, мы подписываем его и отправляем по почте или непосредственно или с сопроводом, как исходящий. На стороне контрагента его принимают, проверяют подпись, подписывают своей и отправляют обратно. Мы принимаем письмо, видим наш договор и подпись контрагента, она проверена и корректна. Если договор пришёл с сопроводительным письмом, то делаем входящий. А дальше ручками, выгружает подпись и добавляем её к файлу договора, получаем юридически значимый договор с двумя подписями. По поводу автоматизации мыслей пока нет.
Расширение проверено на конфигурации "Документооборот государственного учреждения, редакция 2.1" (2.1.16.1) и технологической платформе 8.3.15.1830.