Как программно установить пароль на PDF-файл в 1С

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

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

Метод 1: Использование консольной утилиты PDFtk Server

Одним из проверенных временем способов является использование бесплатной утилиты PDFtk Server. Этот метод универсален, так как работает независимо от разрядности платформы (x86 или x64), если правильно подготовить окружение. Рассмотрим логику процесса: мы помещаем исполняемые файлы утилиты в макет обработки, при необходимости извлекаем их во временный каталог и запускаем выполнение команды.

Проанализируем программный код, который позволяет реализовать этот алгоритм:


// 1. Подготовка путей и извлечение утилиты из макета
КаталогУстановки = КаталогВременныхФайлов() + "PDFtk\";
СоздатьКаталог(КаталогУстановки);

ДанныеАрхива = ЭтаОбработка.ПолучитьМакет("PDFtk_Bundle"); // Макет с ZIP-архивом программы
ИмяФайлаАрхива = КаталогУстановки + "pdftk.zip";
ДанныеАрхива.Записать(ИмяФайлаАрхива);

// Распаковка архива штатными средствами 1С
ЧтениеZip = Новый ЧтениеZipФайла(ИмяФайлаАрхива);
ЧтениеZip.ИзвлечьВсе(КаталогУстановки, РежимВосстановленияПутейФайловZIP.Восстанавливать);
ЧтениеZip.Закрыть();

// 2. Формирование команды для установки пароля
// owner_pw - пароль владельца (разрешает менять настройки)
// user_pw - пароль пользователя (требуется при открытии, если указан)
// allow - разрешения (например, запрет копирования текста)

ИмяФайлаИсточник = "C:\Temp\Source.pdf";
ИмяФайлаРезультат = "C:\Temp\Protected.pdf";
Пароль = "MySecretPass123";

СтрокаЗапуска = СтрШаблон("\"%1pdftk.exe\" \"%2\" output \"%3\" owner_pw %4", 
    КаталогУстановки, ИмяФайлаИсточник, ИмяФайлаРезультат, Пароль);

// 3. Запуск через COM-объект WScript.Shell
Скрипт = Новый COMОбъект("WScript.Shell");
// Параметры: Команда, СтильОкна (0 - скрыто), ОжидатьЗавершения (Истина)
РезультатКода = Скрипт.Run(СтрокаЗапуска, 0, Истина);

Если РезультатКода = 0 Тогда
    Сообщить("Файл успешно защищен!");
Иначе
    Сообщить("Произошла ошибка при обработке PDF. Код возврата: " + РезультатКода);
КонецЕсли;

Важно обратить внимание на использование дополнительных кавычек в переменной СтрокаЗапуска. Если пути к файлам содержат пробелы (например, "C:\My Documents\file.pdf"), без кавычек система выдаст ошибку 0x80070002, так как не сможет найти файл.

Метод 2: Нативные средства платформы 1С (версия 8.3.15 и выше)

Если вы работаете на современной версии платформы, то использование сторонних библиотек во многих случаях избыточно. Разработчики 1С добавили объект ПараметрыЗаписиPDF, который позволяет настраивать защиту непосредственно в методе Записать() для табличного документа.

Выясним, как это работает на практике. При сохранении ТабличныйДокумент мы можем передать настройки шифрования:


ТабДок = Новый ТабличныйДокумент;
// ... формирование табличного документа ...

НастройкиPDF = Новый ПараметрыЗаписиPDF;

// Устанавливаем пароль для открытия файла (если нужно)
НастройкиPDF.ПарольПользователя = "UserPassword";

// Устанавливаем пароль администратора для управления правами
НастройкиPDF.ПарольАдминистратора = "AdminPassword";

// Настраиваем ограничения
НастройкиPDF.ЗапретКопированияТекста = Истина;
НастройкиPDF.ЗапретПечати = Истина;
НастройкиPDF.ЗапретИзмененияСодержимого = Истина;

// Сохраняем файл с применением настроек
ТабДок.Записать("C:\Reports\ProtectedReport.pdf", ТипФайлаТабличногоДокумента.PDF, НастройкиPDF);

Рассмотрим преимущества этого подхода. Во-первых, он полностью кроссплатформенный (работает и в Windows, и в Linux). Во-вторых, он не требует наличия стороннего ПО на сервере или клиентском компьютере. В-третьих, это значительно быстрее, так как не создается лишних процессов в операционной системе.

Метод 3: Использование утилиты QPDF

В некоторых ситуациях PDFtk может некорректно работать с очень тяжелыми файлами или современными версиями стандарта PDF (1.7+). В таких случаях мы рекомендуем использовать QPDF. Это мощный инструмент с открытым исходным кодом, который поддерживает 256-битное AES шифрование.

Разберем пример команды для интеграции через ЗапуститьПриложение:


ПутьКQPDF = "C:\Apps\qpdf\qpdf.exe";
ИсходныйФайл = "C:\In.pdf";
ВыходнойФайл = "C:\Out.pdf";
Пароль = "StrongPass";

// --encrypt user-password owner-password key-length --
Команда = СтрШаблон("%1 --encrypt %2 %2 256 -- \"%3\" \"%4\"", 
    ПутьКQPDF, Пароль, ИсходныйФайл, ВыходнойФайл);

ЗапуститьПриложение(Команда, , Истина);

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

Типичные ошибки и их решение

Разберем ситуацию, упомянутую пользователями: возникновение ошибки 0x80070002 при выполнении метода Run. Многие ошибочно полагают, что это связано с регистрацией COM-компонентов 1С, однако причина почти всегда кроется в путях.

Проанализируем основные причины этой ошибки:

  1. Неверный путь к EXE-файлу. Убедитесь, что после извлечения из архива файл pdftk.exe действительно находится в КаталогВременныхФайлов.
  2. Отсутствие кавычек. Если в пути к временной папке пользователя Windows есть пробелы (например, "C:\Users\Ivan Ivanov\AppData..."), команда развалится, если не обернуть путь в двойные кавычки.
  3. Зависимости DLL. Консольные утилиты часто требуют наличия библиотек вроде libiconv.dll или libgcc.dll в той же папке. Если вы извлекаете только .exe из макета, программа не запустится.

Альтернативный вариант: ZIP-архив с паролем

Если специфика бизнес-процесса позволяет, можно использовать встроенный объект ЗаписьZipФайла. Это не установит пароль на сам PDF, но защитит контейнер, в котором он находится. Это решение полезно, если нужно отправить несколько документов одним защищенным пакетом.


ЗаписьZip = Новый ЗаписьZipФайла("C:\Temp\Archive.zip", "ПарольАрхива", "Комментарий", 
    МетодСжатияZIP.Сжатие, УровеньСжатияZIP.Оптимальный, МетодШифрованияZIP.Zip20);
ЗаписьZip.Добавить("C:\Temp\Report.pdf");
ЗаписьZip.Записать();

Подведем итог: для новых конфигураций на платформе 8.3.15+ оптимальным выбором будет использование ПараметрыЗаписиPDF. Для старых систем или специфических требований по защите (например, работа с уже готовыми файлами, а не табличными документами) связка 1С + PDFtk/QPDF остается самым надежным и гибким решением. В качестве готовой альтернативы сторонним утилитам подойдет консольное приложение для защиты PDF-документов из 1С.

← На главную