При внедрении электронного документооборота в 1С:ДО специалисты часто сталкиваются с тремя основными сложностями: блокировкой файлов после подписания, неэстетичным видом стандартного штампа электронной подписи (ЭП) и необходимостью корректной конвертации документов из Word в PDF с сохранением всех визуальных отметок. В данной статье мы подробно разберем, как кастомизировать эти процессы, проанализируем механизмы работы системы и изучим примеры программного кода для решения нестандартных задач.
Типовая логика системы предполагает, что после наложения электронной подписи файл документа становится недоступным для редактирования (блокируется криптопровайдером для обеспечения неизменности данных). Однако регистрация документа часто происходит после подписания, и системе требуется записать регистрационный номер и дату в реквизиты файла. Рассмотрим два основных подхода к решению этого конфликта.
Подход 1: Регистрация перед подписанием. Мы можем модифицировать процесс утверждения. В форме задачи при нажатии кнопки «Утвердить» программно инициируется регистрация документа. После того как РегистрационныйНомер получен и вставлен в файл через механизм автозаполнения, выполняется стандартная процедура подписания. Это гарантирует, что в подпись попадет уже «финальная» версия файла с номером.
Подход 2: Работа со штампом визуализации. Если бизнес-процесс требует сначала подписать, а потом зарегистрировать, можно использовать доработку кнопки сохранения. Проанализируем ситуацию: штамп ЭП — это графическая визуализация, которая может формироваться динамически. Мы можем разрешить регистрацию «поверх» подписанного файла, если программно временно снимать флаг редактирования или использовать механизм отложенного формирования PDF-визуализации, где номер и штамп накладываются только в момент выгрузки документа.
Многие пользователи жалуются, что стандартный штамп в 1С:ДО выглядит слишком громоздким. Для его изменения нам потребуется работа с макетами и внешней утилитой ImageMagick. Выясним причину такого поведения системы: штамп формируется как графический объект, параметры которого жестко заданы в коде модуля РаботаСЭП.
Разберем шаги по изменению штампа:
ШаблонОтметкиЭП. Это PNG-изображение, которое служит подложкой. Мы можем заменить его на собственный вариант меньшего размера с прозрачным фоном.РаботаСЭП, функция СоздатьОтметкуЭП. Здесь система через ImageMagick накладывает текст (данные сертификата) на картинку.-density отвечает за разрешение, а -pointsize — за размер шрифта.Важный технический нюанс: В документах Word (docx) размеры изображений задаются в единицах EMU (English Metric Units). Помните, что 1 см = 360 000 EMU. Если штамп вставляется фиксированного размера (например, 3 см), найдите в коде процедуры вставки картинки переменные Extent.cx и Extent.cy и измените их расчетные значения, иначе Word будет принудительно растягивать ваше маленькое изображение.
Рассмотрим подробнее алгоритм формирования PDF-файла, который содержит и данные документа, и штамп ЭП. Проблема в том, что напрямую «вложить» ЭП в PDF в момент конвертации сложно. Правильная последовательность действий выглядит так:
Для серверной конвертации часто используется LibreOffice в режиме headless, что позволяет автоматизировать процесс без участия пользователя. Также существует возможность автозаполнения шаблонов в формате MXL с последующим сохранением в PDF.
Типовой механизм 1С:ДО часто ограничен заполнением только одной табличной части (например, «Товары»). Проанализируем пример кода, который позволяет обойти это ограничение в процедуре ВыполнитьЗаменуПолейИСтрокВДокументеMSOfficeOpenXML. Рассмотрим решение, позволяющее корректно обрабатывать XML-структуру документа при наличии нескольких таблиц.
Для реализации этого метода необходимо доработать массив данных для автозамен, добавив в него свойство НомерТаблицы. Посмотрим на пример модифицированного кода:
// Доработка механизма для заполнения нескольких табличных частей
Процедура ВыполнитьЗаменуПолейИСтрокВДокументеMSOfficeOpenXML(ЧтениеXML, ЗаписьXML, АдресXML, МассивДанныхДляАвтоЗамен, ЗаполнятьТолькоПоляРегистрации = Ложь)
// ... инициализация переменных ...
КоличествоСтрок = 0;
ИспользуетсяНомерТаблицы = Ложь;
НомерТаблицыЗаполнения = 0;
Для Каждого Настройка Из МассивДанныхДляАвтоЗамен Цикл
Если Настройка.НомерКолонкиТабличнойЧасти = 1 Тогда
КоличествоСтрок = Настройка.ЗначениеЗамены.Количество;
ИспользуетсяНомерТаблицы = Настройка.Свойство("НомерТаблицы");
Прервать;
КонецЕсли;
КонецЦикла;
// В цикле чтения XML определяем начало нашей таблицы
Если ЧтениеXML.Имя = "w:tbl" И КоличествоСтрок > 0 Тогда
ФлагНайденаТаблица = Истина;
СтрокаТаблицы = 0;
КонецЕсли;
// Проверка соответствия номера таблицы
Если ФлагНайденаТаблица И ИспользуетсяНомерТаблицы Тогда
Для Каждого НастройкаЗамены Из МассивДанныхДляАвтоЗамен Цикл
Если НастройкаЗамены.ТермДляЗамены = СтрПоиска И НастройкаЗамены.НомерКолонкиТабличнойЧасти > 0
И НастройкаЗамены.НомерТаблицы <> НомерТаблицыЗаполнения Тогда
НомерТаблицыЗаполнения = НастройкаЗамены.НомерТаблицы;
КоличествоСтрок = НастройкаЗамены.ЗначениеЗамены.Количество;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
// ... дальнейшая логика замены тегов ...
КонецПроцедуры
Этот код позволяет системе переключаться между различными таблицами в документе Word, сопоставляя их с данными из 1С. Основная сложность здесь заключается в соблюдении структуры тегов w:tr и w:tc. Если в таблице есть нечетное количество строк или объединенные ячейки, необходимо внимательно следить за закрывающими тегами XML, чтобы не нарушить целостность файла.
Подводя итог, отметим, что для создания качественного визуального штампа ЭЦП в 1С:ДО необходимо:
Важный совет: Помните, что визуальный штамп в PDF — это лишь картинка для удобства пользователя. Юридическую значимость имеет только файл отсоединенной подписи или встроенная в PDF/A невидимая электронная подпись. Всегда проверяйте соответствие ваших технических решений требованиям регламентов вашей организации.