Как сформировать и заполнить печатную форму Microsoft Word из 1С

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

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

Вариант 1. Заполнение шаблона Word через поиск и замену меток (COM-объект)

Один из самых распространенных методов работы с файлами .doc и .docx — автоматизация приложения Word через COM-объект Word.Application. В исходном документе-шаблоне расставляются уникальные текстовые метки (например, [ПечНомерДоговора], [ПечПокупатель]), которые программа находит и заменяет нужными значениями из информационной базы.

Рассмотрим по шагам реализацию этого механизма в управляемом приложении на стороне клиента:

  1. Создаем экземпляр COM-объекта Word.Application.
  2. Открываем файл шаблона с помощью коллекции Documents.Add().
  3. Обращаемся к колонтитулам и основному содержимому (Content) документа.
  4. Вызываем метод Find.Execute() для подстановки значений.
  5. Сохраняем сформированный файл под новым именем и делаем окно Word видимым пользователю.

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


&НаКлиенте
Процедура СформироватьДокументПоШаблону(Команда)
    
    // Подключаемся к установленному на клиенте Word
    Попытка
        мWord = Новый COMОбъект("Word.Application");
    Исключение
        Предупреждение("Не удалось инициализировать Microsoft Word. Проверьте установку офисного пакета.");
        Возврат;
    КонецПопытки;
    
    мWord.Visible = 0; 
    мNewDoc = мWord.Documents;
    
    // Путь к исходному неизменяемому файлу шаблона
    ПутьКШаблону = "C:\WORDFORMS\ШаблонДоговора.doc";
    мДок = мNewDoc.Add(ПутьКШаблону, 0, 0, 1);   
    
    // Заполнение параметров в верхнем колонтитуле
    мКолонтитул = мДок.Sections.Item(1).Headers.Item(1).Range;
    мКолонтитул.Find.Execute("[ПечНомерДоговора]", 0, 0,,,,,,, "№ 123/2024", 2); 
    мКолонтитул.Find.Execute("[ПечДатаДоговора]", 0, 0,,,,,,, "15 марта 2024 г.", 2); 
    
    // Заполнение параметров в основном теле документа
    мОбъект = мДок.Content;
    мОбъект.Find.Execute("[ПечНомерДоговора]", 0, 0,,,,,,, "№ 123/2024", 2); 
    мОбъект.Find.Execute("[ПечДатаДоговора]", 0, 0,,,,,,, "15 марта 2024 г.", 2); 
    мОбъект.Find.Execute("[ПечПокупатель]", 0, 0,,,,,,, "ООО ""Торговый Дом""", 2); 
    мОбъект.Find.Execute("[ПечРуководитель]", 0, 0,,,,,,, "Иванов И. И.", 2); 
    мОбъект.Find.Execute("[ПечОснование]", 0, 0,,,,,,, "Устава", 2);      
    
    // Формируем уникальное имя результирующего файла
    ТекДатаСтр = Формат(ТекущаяДата(), "ДФ=yyyyMMdd_HHmmss");
    ИмяФайлаРезультата = "C:\WORDFORMS\Договор_" + ТекДатаСтр + ".doc";
    
    // Сохраняем заполненный файл, не повреждая шаблон
    мДок.SaveAs(ИмяФайлаРезультата);
    
    // Делаем окно приложения видимым и активируем его
    мWord.Visible = 1; 
    мWord.Application.WindowState = 2; // Минимизировать
    мWord.Application.WindowState = 1; // Развернуть на весь экран
    
КонецПроцедуры

Важное ограничение метода Find.Execute(): заменяемое строковое значение не должно превышать 255 символов. Если требуется вставить большой фрагмент текста, многострочный абзац или таблицу, рекомендуется использовать механизм закладок (Bookmarks).

Вариант 2. Использование закладок (Bookmarks) для подстановки текста любой длины

Разберем более гибкий способ заполнения шаблона. В самом документе Word через меню Вставка → Закладка расставляются именованные метки. В коде 1С мы обращаемся напрямую к этим закладкам по их именам и передаем произвольный текст без ограничения по количеству символов.

Посмотрим на пример заполнения через коллекцию Bookmarks:


&НаКлиенте
Процедура ЗаполнитьЧерезЗакладки()
    
    Попытка
        Ворд = Новый COMОбъект("Word.Application");
    Исключение
        Сообщить("Не удалось запустить Word: " + ОписаниеОшибки());
        Возврат;
    КонецПопытки;
    
    Ворд.DisplayAlerts = 0; // Отключаем служебные диалоговые окна
    
    ФайлШаблона = "C:\WORDFORMS\ШаблонУведомления.dot";
    Док = Ворд.Documents.Add(ФайлШаблона);
    
    // Подстановка данных по именам закладок
    Док.Bookmarks("ИсходящийНомер").Range.Text = "Исх. № 45/08";
    Док.Bookmarks("Контрагент").Range.Text     = "ООО ""Вектор""";
    Док.Bookmarks("Адрес").Range.Text          = "101000, г. Москва, ул. Примерная, д. 10";
    Док.Bookmarks("СуммаДолга").Range.Text     = Формат(150450.50, "ЧДЦ=2; ЧГ=3 0");
    Док.Bookmarks("Подписант").Range.Text      = "Генеральный директор Петров П. П.";
    
    ИмяДляСохранения = "C:\WORDFORMS\Уведомление_45.rtf";
    
    Попытка
        Док.SaveAs(ИмяДляСохранения);
        Ворд.Visible = 1;
    Исключение
        Сообщить("Ошибка при сохранении документа: " + ОписаниеОшибки());
        Док.Close(0);
        Ворд.Quit(0);
    КонецПопытки;
    
КонецПроцедуры

Хранение шаблонов внутри базы 1С

Чтобы не привязываться к жестким локальным путям на диске (например, C:\WORDFORMS\), шаблоны документов удобно хранить непосредственно в конфигурации или базе данных:

  1. В дереве метаданных у документа или справочника создаем макет с типом Двоичные данные и загружаем туда файл .doc / .dot.
  2. При формировании печатной формы получаем макет с помощью метода ПолучитьМакет().
  3. Создаем временный файл методом ПолучитьИмяВременногоФайла("doc") и выгружаем в него двоичные данные методом Записать().
  4. Передаем путь к временному файлу в Word.Documents.Add().
  5. После завершения работы удаляем временный файл процедурой УдалитьФайлы().

Перенос макета Word в табличный документ 1С (MXL)

Если задача требует отказаться от внешних офисных приложений и выводить форму встроенными средствами 1С, документ Word можно сконвертировать в табличный документ следующими способами:

  1. Экспорт через HTML: Сохраняем документ в Word как веб-страницу (.html). В 1С создаем объект ТабличныйДокумент и считываем файл методом ТабличныйДокумент.Прочитать(ПутьКФайлу, ТипФайлаТабличногоДокумента.HTML). Полученный результат точно сохраняет пропорции таблиц, объединения ячеек и шрифты. Затем его можно скопировать в макет и разметить именованные секции.
  2. Копирование табличной сетки: Табличные блоки из документа Word можно выделить, скопировать через буфер обмена и вставить напрямую в макет конфигуратора 1С, где они автоматически разобьются по строкам и колонкам.
← На главную