Как сохранить или установить защиту документа Word при формировании из 1С через COM-объект

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

При автоматизации документооборота в 1С часто возникает задача формирования документов на основе готовых шаблонов Microsoft Word. Одной из специфических проблем является сохранение параметров защиты исходного файла. Многие разработчики сталкиваются с тем, что стандартные методы копирования свойств, такие как CopyStylesFromTemplate, переносят оформление и стили, но полностью игнорируют настройки защиты документа (ограничение редактирования, пароли и доступ к полям форм).

В этой статье мы подробно разберем, как программно управлять защитой документов Word, какие методы COM-объекта Word.Application для этого использовать и как правильно организовать процесс заполнения защищенного шаблона данными из 1С.

Почему защита не копируется автоматически

Проанализируем ситуацию: когда мы создаем новый документ на основе шаблона (Templates.Add) или копируем данные из одного документа в другой, Word рассматривает параметры защиты как свойства конкретного экземпляра файла, а не как часть стиля оформления. Следовательно, если ваш шаблон имеет защиту "Только для заполнения форм", созданный на его основе документ может оказаться полностью открытым для редактирования.

Выясним причину: метод CopyStylesFromTemplate предназначен исключительно для синхронизации шрифтов, отступов и других визуальных атрибутов. Для работы с защитой нам придется использовать специализированные методы объекта Document.

Метод Protect: основной инструмент установки защиты

Для программной установки защиты в Word используется метод Protect. Рассмотрим его синтаксис и основные параметры, которые нам понадобятся в коде 1С:

Protect(Type, NoReset, Password, UseIRM, EnforceStyleLock)

Разберем значения наиболее важных параметров:

  1. Type (WdProtectionType) — определяет тип защиты:
    • 0 (wdAllowOnlyRevisions) — разрешены только исправления;
    • 1 (wdAllowOnlyComments) — разрешены только примечания;
    • 2 (wdAllowOnlyFormFields) — разрешено только заполнение полей форм (самый частый вариант для шаблонов);
    • 3 (wdAllowOnlyReading) — режим "только чтение".
  2. NoReset — логическое значение. Если установлено в Ложь (0), то при включении защиты значения во всех полях форм будут сброшены. При работе из 1С крайне важно передавать Истина (-1), чтобы данные, которые вы уже вписали в документ, сохранились.
  3. Password — строка, содержащая пароль для снятия защиты.

Практический пример установки защиты

Рассмотрим пример кода, который устанавливает защиту "Только заполнение форм" с паролем после того, как документ был сформирован:


// Создание объекта Word и открытие документа
WordApp = Новый COMОбъект("Word.Application");
Документ = WordApp.Documents.Add(ПутьКШаблону);

// ... Здесь идет код заполнения документа данными из 1С (замена закладок, поиск и замена текста) ...

// Установка защиты
// wdAllowOnlyFormFields = 2
// NoReset = Истина (-1), чтобы не очистить заполненные данные
Пароль = "МойСложныйПароль123";
Документ.Protect(2, -1, Пароль);

// Сохранение результата
Документ.SaveAs2(ИмяФайлаРезультата);
WordApp.Visible = Истина;

Как работать с уже защищенным шаблоном

Часто возникает обратная задача: шаблон уже защищен паролем, и нам нужно программно заполнить его данными. Попытка изменить текст в защищенном документе вызовет ошибку COM-объекта. В этом случае алгоритм работы должен быть следующим:

  1. Проверяем, установлена ли защита в текущем документе.
  2. Если защита есть, снимаем ее методом Unprotect.
  3. Вносим необходимые изменения (заполняем параметры, таблицы).
  4. Снова устанавливаем защиту с теми же параметрами.

Посмотрим на пример реализации этого алгоритма:


Попытка
    // Проверяем тип защиты. -1 означает отсутствие защиты (wdNoProtection)
    Если Документ.ProtectionType <> -1 Тогда
        Документ.Unprotect("ПарольОтШаблона");
    КонецЕсли;
    
    // Выполняем действия по заполнению
    // Например, работа с закладками
    Документ.Bookmarks("ДатаДоговора").Range.Text = Формат(ТекущаяДата(), "ДЛФ=DD");
    
    // Возвращаем защиту обратно
    Документ.Protect(2, -1, "ПарольОтШаблона");
Исключение
    Сообщить("Ошибка при работе с защитой документа: " + ОписаниеОшибки());
КонецПопытки;

Различие между паролем на открытие и защитой содержимого

Важно не путать разные механизмы безопасности Word. Проанализируем три разных свойства, к которым можно обращаться через COM:

Если вы хотите узнать, защищен ли файл на уровне открытия, используйте свойство HasPassword. Однако помните, что само текстовое значение пароля из объекта вычитать невозможно — его нужно знать заранее или хранить в настройках вашей базы 1С.

Особенности сохранения в разных форматах

При использовании метода SaveAs2 для сохранения защищенного документа, обратите внимание на параметр формата файла. Например, для сохранения в формате современного документа Word (.docx) используется константа wdFormatXMLDocument, которая численно равна 0.


// Пример сохранения с указанием формата
ИмяДляСохранения = "C:\Docs\Dogovor.docx";
wdFormatXMLDocument = 0;
Документ.SaveAs2(ИмяДляСохранения, wdFormatXMLDocument);

Дополнительные возможности: защита разделов

Иногда требуется защитить не весь документ целиком, а только его части. Например, шапку и подвал договора оставить неизменными, а основной текст разрешить редактировать. В Word это реализуется через разделы (Sections).

Рассмотрим, как это сделать программно. У каждого раздела есть свойство ProtectedForForms. Если общая защита документа установлена в режим wdAllowOnlyFormFields, мы можем точечно разрешить редактирование конкретного раздела:


// Устанавливаем общую защиту
Документ.Protect(2, -1, "Пароль");

// Разрешаем редактирование во втором разделе документа
Документ.Sections.Item(2).ProtectedForForms = Ложь;

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

Рекомендации по стабильной работе

Подведем итог. Чтобы ваша работа с защищенными документами Word из 1С была стабильной, придерживайтесь следующих правил:

← На главную