Работа с печатными формами в формате Microsoft Word — стандартная задача при автоматизации документооборота. Часто разработчики сталкиваются с ситуацией, когда исходный макет имеет сложную разметку (например, разделение текста на две колонки), но при выводе через 1С форматирование «слетает», и документ отображается в одну колонку. В этой статье мы разберем, почему это происходит, как программно заполнять параметры в шаблоне и как управлять настройками отображения Word.
Рассмотрим ситуацию: вы загрузили файл Word в двоичные данные, сохранили его во временный файл и открыли через COM-объект. Если в исходном документе была настроена многоколоночная верстка, а в открывшемся окне она исчезла — скорее всего, проблема не в самом файле, а в режиме просмотра, который Word устанавливает по умолчанию. При программном создании объекта часто включается режим «Веб-документ» или «Обычный», в которых многоколоночная разметка просто не визуализируется.
Для исправления этой ситуации необходимо явно указать приложению режим отображения «Разметка страницы». Для этого используется свойство ActiveWindow.View.Type. Значение 3 соответствует константе wdPrintView. Реализовать это можно следующим образом:
MSWord.ActiveWindow.View.Type = 3;
Также проанализируем метод создания документа. Использование Documents.Add создает новый документ на основании существующего файла-шаблона. Если разметка привязана к конкретным разделам, которые некорректно интерпретируются при создании, можно попробовать использовать метод Documents.Open, который открывает сам файл «как есть».
Еще одна частая проблема — автоматическое подкрашивание ссылок (гиперссылок) синим цветом и добавление подчеркивания. Это срабатывает механизм автозамены Word. Чтобы избежать изменения оформления при заполнении параметров, можно временно отключить эту опцию в настройках приложения:
MSWord.Options.AutoFormatAsYouTypeReplaceHyperlinks = Ложь;
Разберем практический пример реализации формирования договора. Основной метод работы здесь — использование объекта COMОбъект("Word.Application") и функции поиска и замены текста. Этот подход позволяет подготовить шаблон в Word, расставить в нем теги-метки (например, {День}, {ФизЛицо}) и заменить их на реальные данные из информационной базы.
Посмотрим на пример кода, который выполняет эти операции на стороне клиента:
&НаКлиенте
Процедура РИЦ_ФормированиеДоговора(НазваниеМакета)
Попытка
// Инициализация приложения Word
MSWord = Новый COMОбъект("Word.Application");
// Получаем макет из временного хранилища (предварительно помещенный туда на сервере)
Макет = ПолучитьИзВременногоХранилища(Адрес);
// Сохраняем макет во временный файл на диске
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("doc");
Макет.Записать(ИмяВременногоФайла);
// Создаем новый документ на основе временного файла
Документ = MSWord.Documents.ADD(ИмяВременногоФайла);
// Получаем необходимые данные (например, через серверный вызов)
ДанныеПациента = ПолучитьДанныеПациента();
Документ.Activate();
// Механизм поиска и замены меток на данные
Замена = Документ.Content.Find;
// Пример замены даты
Замена.Execute("{День}", Ложь, Истина, Ложь, , , Истина, , Ложь, Строка(День(ТекущаяДата())));
Замена = Документ.Content.Find;
Замена.Execute("{Месяц}", Ложь, Истина, Ложь, , , Истина, , Ложь, ПолучитьМесяц(ТекущаяДата()));
// Пример замены ФИО и паспортных данных
Замена = Документ.Content.Find;
Замена.Execute("{ФизЛицоПациента}", Ложь, Истина, Ложь, , , Истина, , Ложь, Строка(Пациент));
Замена = Документ.Content.Find;
Замена.Execute("{Серия}", Ложь, Истина, Ложь, , , Истина, , Ложь, ДанныеПациента[0]);
// Делаем окно Word видимым пользователю
MSWord.Application.Visible = Истина;
MSWord.Activate();
Исключение
// Обязательное закрытие приложения при возникновении ошибки
Сообщить(ОписаниеОшибки());
Если MSWord <> Неопределено Тогда
MSWord.Application.Quit();
КонецЕсли;
КонецПопытки;
КонецПроцедуры
Важно обратить внимание на параметры метода Execute. В данном примере мы используем подстановку значений, где ключевыми являются флаги поиска целого слова и учета регистра. Использование Документ.Content.Find позволяет искать вхождения по всему телу документа.
Хотя работа через COM-объект является наиболее привычной, проанализируем её недостатки:
В качестве более современного и быстрого метода можно рассмотреть работу с форматом .docx через XML. Документ Word — это по сути архив. Вы можете использовать объект ЧтениеZipФайла, распаковать файл word/document.xml, заменить в нем текст меток средствами 1С (используя обычные строковые функции или ЗаписьXML) и упаковать обратно. Такой способ сохранит все колонки, шрифты и разметку на 100%, при этом работая в десятки раз быстрее и не требуя установленного офисного пакета на сервере или клиенте.
Если же вы остаетесь в рамках технологии COM, всегда проверяйте свойства PageSetup.TextColumns и ActiveWindow.View, чтобы гарантировать пользователю именно тот вид документа, который был задуман в исходном шаблоне.