Как из 1С открыть шаблон Word, заполнить его данными и сохранить под новым именем

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

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

Инициализация COM-соединения и открытие документа

Для начала взаимодействия с внешним приложением нам необходимо создать экземпляр объекта Word.Application. Рассмотрим этот процесс на примере платформы 1С 7.7, так как именно она обсуждалась в исходной теме, но помним, что логика работы с самим Word идентична и для версии 8.3.

Проанализируем базовый код открытия документа:


// Создаем объект связи с Word
Ворд = СоздатьОбъект("Word.Application"); 

// Путь к нашему шаблону
ИмяФайлаШаблона = КаталогИБ() + "\ExtForms\Шаблон.doc"; 

// Открываем документ
// Параметр 0 означает, что мы не подтверждаем преобразование
// Параметр 1 открывает документ только для чтения (ReadOnly)
Договоры = Ворд.Documents; 
Док = Договоры.Open(ИмяФайлаШаблона, 0, 1); 

// Делаем окно Word видимым (для отладки)
Ворд.Visible = 1;

Важный момент: если вы планируете формировать документы в фоновом режиме, свойство Visible следует устанавливать в значение 0. Это ускорит работу и не будет отвлекать пользователя мельканием окон.

Автоматический поиск и замена текста

После того как документ открыт, нам нужно найти в нем заранее подготовленные метки (например, {НомерДоговора} или {Дата}) и заменить их на данные из информационной базы. Для этого используется метод Find.Execute объекта Selection.

Разберем параметры этого метода подробнее. Рассмотрим пример замены метки на конкретное значение:


wdFindContinue = 1; // Продолжать поиск при достижении конца документа
wdReplaceAll = 2;   // Заменить все найденные вхождения
True = 1;
False = 0;

// Выполняем поиск и замену для метки {1}
Ворд.Selection.Find.Execute("{1}", True, True, False, False, False, True, wdFindContinue, False, НомерДоговора, wdReplaceAll);

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

Сохранение заполненного документа под новым именем

Одной из главных проблем, с которой сталкиваются разработчики, является попытка сохранить изменения. Если просто вызвать метод Save(), программа попытается перезаписать сам шаблон, что недопустимо. Правильный подход — использование метода SaveAs.

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


// Формируем путь для нового файла
ИмяНовогоФайла = "C:\Договоры\Договор_№" + СокрЛП(Код) + ".doc";

// Получаем активный документ
НовыйДокумент = Ворд.ActiveDocument;

// Сохраняем под новым именем
// Второй параметр 0 соответствует формату документа Word (.doc)
НовыйДокумент.SaveAs(ИмяНовогоФайла, 0);

// Закрываем документ и приложение
НовыйДокумент.Close();
Ворд.Quit();

Внимание: При работе в современных операционных системах (Windows 10/11) запись напрямую в корень диска C:\ может быть заблокирована правами доступа. Рекомендуем использовать подпапки или временный каталог пользователя, получаемый функцией КаталогВременныхФайлов().

Использование профессионального подхода с шаблонами .dot

Более правильным с точки зрения архитектуры Microsoft Office является использование файлов-шаблонов с расширением .dot или .dotx. Вместо открытия файла (Open), мы создаем новый документ на основании шаблона (Add). Это гарантирует, что оригинал никогда не будет изменен случайно.

Посмотрим на этот метод:


ИмяШаблона = КаталогИБ() + "\ExtForms\ШаблонДоговора.dot";
// Метод Add создает копию на лету
НовДокумент = Ворд.Documents.Add(ИмяШаблона);

// ... здесь идет код заполнения данными ...

// Сохраняем как обычный документ .doc
НовДокумент.SaveAs(ПутьКНовомуФайлу);

Настройка режима просмотра: «Разметка страницы»

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

Выясним, как это сделать программно:


// Устанавливаем тип вида в значение 3 (Page Layout)
Ворд.ActiveWindow.View.Type = 3;

Значения свойства View.Type:

  1. 1 — Обычный режим (Normal).
  2. 3 — Разметка страницы (Print Layout).
  3. 4 — Режим черновика (Draft).

Особенности перехода на платформу 1С 8.3

Если вы решили перенести данный функционал в современную конфигурацию на управляемых формах, необходимо внести небольшие коррективы в синтаксис. Основное отличие — использование системной функции Новый COMОбъект.

Рассмотрим пример для 1С 8.3:


Попытка
    Ворд = Новый COMОбъект("Word.Application");
Исключение
    Сообщить("MS Word не установлен на этом компьютере!");
    Возврат;
КонецПопытки;

// Все последующие вызовы методов (Documents.Add, SaveAs) остаются такими же
// как в примере для 7.7

Важное замечание по серверному коду: Если процедура выполняется «НаСервере», объект Word должен быть установлен именно на сервере 1С. Однако Microsoft официально не рекомендует использовать Office в серверных сессиях. В таких случаях лучше выполнять формирование документа на стороне клиента.

Рекомендации по оптимизации: Закладки (Bookmarks)

Метод поиска и замены (Find.Execute), хотя и прост в реализации, работает медленно в больших документах. Более надежный способ — расставить в шаблоне Word Закладки (Вставка -> Закладка).

Проанализируем пример работы с закладками:


// Прямое обращение к закладке по имени
Если Док.Bookmarks.Exists("ИмяКлиента") Тогда
    Док.Bookmarks("ИмяКлиента").Range.Text = "ООО 'Ромашка'";
КонецЕсли;

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

Заключение

Мы рассмотрели полный цикл работы с документами Word: от создания объекта связи до управления режимами отображения готового файла. Помните о необходимости закрывать приложение методом Quit() и обнулять переменную (Ворд = Неопределено;), чтобы в диспетчере задач Windows не скапливались «зависшие» процессы WINWORD.EXE, которые могут блокировать оперативную память сервера или клиентской машины.

← На главную