Как правильно выводить данные в Microsoft Word из 1С с сохранением форматирования

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

Работа с печатными формами в формате Microsoft Word — стандартная задача при автоматизации документооборота. Часто разработчики сталкиваются с ситуацией, когда исходный макет имеет сложную разметку (например, разделение текста на две колонки), но при выводе через 1С форматирование «слетает», и документ отображается в одну колонку. В этой статье мы разберем, почему это происходит, как программно заполнять параметры в шаблоне и как управлять настройками отображения Word.

Почему пропадают колонки при выводе из 1С?

Рассмотрим ситуацию: вы загрузили файл Word в двоичные данные, сохранили его во временный файл и открыли через COM-объект. Если в исходном документе была настроена многоколоночная верстка, а в открывшемся окне она исчезла — скорее всего, проблема не в самом файле, а в режиме просмотра, который Word устанавливает по умолчанию. При программном создании объекта часто включается режим «Веб-документ» или «Обычный», в которых многоколоночная разметка просто не визуализируется.

Для исправления этой ситуации необходимо явно указать приложению режим отображения «Разметка страницы». Для этого используется свойство ActiveWindow.View.Type. Значение 3 соответствует константе wdPrintView. Реализовать это можно следующим образом:

MSWord.ActiveWindow.View.Type = 3;

Также проанализируем метод создания документа. Использование Documents.Add создает новый документ на основании существующего файла-шаблона. Если разметка привязана к конкретным разделам, которые некорректно интерпретируются при создании, можно попробовать использовать метод Documents.Open, который открывает сам файл «как есть».

Автоматическая подсветка ссылок

Еще одна частая проблема — автоматическое подкрашивание ссылок (гиперссылок) синим цветом и добавление подчеркивания. Это срабатывает механизм автозамены Word. Чтобы избежать изменения оформления при заполнении параметров, можно временно отключить эту опцию в настройках приложения:

MSWord.Options.AutoFormatAsYouTypeReplaceHyperlinks = Ложь;

Программное заполнение шаблона Word из 1С

Разберем практический пример реализации формирования договора. Основной метод работы здесь — использование объекта 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-объект является наиболее привычной, проанализируем её недостатки:

  1. Требовательность к среде: На компьютере обязательно должен быть установлен Microsoft Word той же разрядности, что и платформа 1С.
  2. Производительность: Запуск тяжелого приложения Word для формирования каждого документа занимает значительное время.
  3. Стабильность: Использование COM на стороне сервера не рекомендуется из-за риска блокировки сессий модальными окнами.

В качестве более современного и быстрого метода можно рассмотреть работу с форматом .docx через XML. Документ Word — это по сути архив. Вы можете использовать объект ЧтениеZipФайла, распаковать файл word/document.xml, заменить в нем текст меток средствами 1С (используя обычные строковые функции или ЗаписьXML) и упаковать обратно. Такой способ сохранит все колонки, шрифты и разметку на 100%, при этом работая в десятки раз быстрее и не требуя установленного офисного пакета на сервере или клиенте.

Если же вы остаетесь в рамках технологии COM, всегда проверяйте свойства PageSetup.TextColumns и ActiveWindow.View, чтобы гарантировать пользователю именно тот вид документа, который был задуман в исходном шаблоне.

← На главную