При автоматизации документооборота в 1С часто возникает задача формирования документов на основе готовых шаблонов Microsoft Word. Одной из специфических проблем является сохранение параметров защиты исходного файла. Многие разработчики сталкиваются с тем, что стандартные методы копирования свойств, такие как CopyStylesFromTemplate, переносят оформление и стили, но полностью игнорируют настройки защиты документа (ограничение редактирования, пароли и доступ к полям форм).
В этой статье мы подробно разберем, как программно управлять защитой документов Word, какие методы COM-объекта Word.Application для этого использовать и как правильно организовать процесс заполнения защищенного шаблона данными из 1С.
Проанализируем ситуацию: когда мы создаем новый документ на основе шаблона (Templates.Add) или копируем данные из одного документа в другой, Word рассматривает параметры защиты как свойства конкретного экземпляра файла, а не как часть стиля оформления. Следовательно, если ваш шаблон имеет защиту "Только для заполнения форм", созданный на его основе документ может оказаться полностью открытым для редактирования.
Выясним причину: метод CopyStylesFromTemplate предназначен исключительно для синхронизации шрифтов, отступов и других визуальных атрибутов. Для работы с защитой нам придется использовать специализированные методы объекта Document.
Для программной установки защиты в Word используется метод Protect. Рассмотрим его синтаксис и основные параметры, которые нам понадобятся в коде 1С:
Protect(Type, NoReset, Password, UseIRM, EnforceStyleLock)
Разберем значения наиболее важных параметров:
0 (wdAllowOnlyRevisions) — разрешены только исправления;1 (wdAllowOnlyComments) — разрешены только примечания;2 (wdAllowOnlyFormFields) — разрешено только заполнение полей форм (самый частый вариант для шаблонов);3 (wdAllowOnlyReading) — режим "только чтение".Ложь (0), то при включении защиты значения во всех полях форм будут сброшены. При работе из 1С крайне важно передавать Истина (-1), чтобы данные, которые вы уже вписали в документ, сохранились.Рассмотрим пример кода, который устанавливает защиту "Только заполнение форм" с паролем после того, как документ был сформирован:
// Создание объекта Word и открытие документа
WordApp = Новый COMОбъект("Word.Application");
Документ = WordApp.Documents.Add(ПутьКШаблону);
// ... Здесь идет код заполнения документа данными из 1С (замена закладок, поиск и замена текста) ...
// Установка защиты
// wdAllowOnlyFormFields = 2
// NoReset = Истина (-1), чтобы не очистить заполненные данные
Пароль = "МойСложныйПароль123";
Документ.Protect(2, -1, Пароль);
// Сохранение результата
Документ.SaveAs2(ИмяФайлаРезультата);
WordApp.Visible = Истина;
Часто возникает обратная задача: шаблон уже защищен паролем, и нам нужно программно заполнить его данными. Попытка изменить текст в защищенном документе вызовет ошибку COM-объекта. В этом случае алгоритм работы должен быть следующим:
Unprotect.Посмотрим на пример реализации этого алгоритма:
Попытка
// Проверяем тип защиты. -1 означает отсутствие защиты (wdNoProtection)
Если Документ.ProtectionType <> -1 Тогда
Документ.Unprotect("ПарольОтШаблона");
КонецЕсли;
// Выполняем действия по заполнению
// Например, работа с закладками
Документ.Bookmarks("ДатаДоговора").Range.Text = Формат(ТекущаяДата(), "ДЛФ=DD");
// Возвращаем защиту обратно
Документ.Protect(2, -1, "ПарольОтШаблона");
Исключение
Сообщить("Ошибка при работе с защитой документа: " + ОписаниеОшибки());
КонецПопытки;
Важно не путать разные механизмы безопасности Word. Проанализируем три разных свойства, к которым можно обращаться через COM:
Документ.Password = "123".Если вы хотите узнать, защищен ли файл на уровне открытия, используйте свойство 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С была стабильной, придерживайтесь следующих правил:
Попытка...Исключение, так как методы Protect и Unprotect вызывают исключение при неверном пароле или попытке снять защиту с незащищенного файла.NoReset в методе Protect. Без него ваши данные, вставленные из 1С, могут просто исчезнуть в момент включения защиты.КопироватьФайл), и уже в этой копии менять данные, предварительно сняв защиту (если пароль известен программному коду).