Автоматизация создания документов через 1С часто требует сложного форматирования, которое не ограничивается простым выводом текста. Одной из частых задач является программная вставка разрыва страницы при выполнении определенных условий, например, при поиске конкретного слова-маркера. Давайте разберем, как реализовать это эффективно.
Самый быстрый и производительный способ — это использование встроенных возможностей поиска Microsoft Word. Вместо того чтобы перебирать весь текст в цикле, мы поручаем эту задачу движку самого текстового редактора. В качестве спецсимвола для разрыва страницы в Word используется комбинация ^m.
Для реализации этого метода используем следующий код:
// Предположим, Документ - это активный документ Word
СловоЗамены = "НайтиСлово";
Документ.Content.Find.Execute(СловоЗамены, Ложь, Ложь, Ложь, , , Истина, , Ложь, "^m", 2);
Разберем параметры метода Execute:
"^m" — это ключевой элемент, указывающий на вставку разрыва страницы.2 (wdReplaceAll) говорит о том, что нужно заменить все найденные вхождения в документе.Если вам нужно вставить разрыв страницы в конкретной позиции, не привязываясь к замене текста, можно воспользоваться объектом Selection. Это имитирует ручную работу пользователя в интерфейсе программы.
Рассмотрим пример кода:
Word = Новый COMОбъект("Word.Application");
Word.Visible = Истина;
Док = Word.Documents.Add();
Selection = Word.Selection;
// Вставляем что-то в документ
Selection.TypeText("Текст перед разрывом страницы");
// Вставляем разрыв страницы, используя константу 7
Selection.InsertBreak(7);
Selection.TypeText("Текст на новой странице");
Важное примечание: Цифра 7 в методе InsertBreak соответствует константе wdPageBreak. Мы рекомендуем в своих проектах создавать переменные или функции-обертки для таких «магических чисел», чтобы код оставался читаемым. Например: wdPageBreak = 7;.
Иногда возникает соблазн перебрать коллекцию Words в цикле For Each, чтобы найти нужное слово и выделить его. Хотя этот подход кажется логичным, мы не рекомендуем его для больших документов. Программный обход каждого слова через COM-интерфейс работает крайне медленно. Если вам нужно выделить абзац или строку, используйте объект Range, который позволяет манипулировать фрагментами текста без лишней нагрузки на систему.
Когда объектная модель Word кажется слишком сложной, используйте встроенную функцию записи макросов. Это самый надежный способ понять, как Word интерпретирует ваши действия:
Microsoft Word.При работе с автоматизацией всегда отдавайте предпочтение объекту Range перед объектом Selection. Selection сильно зависит от того, где «стоит курсор» в видимом окне, что может приводить к ошибкам, если Word запущен в скрытом режиме на сервере. Использование Range делает ваш код стабильным и независимым от визуального фокуса программы.
Если вам необходимо вставить разрыв после конкретного абзаца, попробуйте следующий подход: после того как вы нашли искомый фрагмент, используйте Range.Paragraphs(1).Range.InsertBreak(7). Это гарантированно добавит разрыв именно после того абзаца, где было найдено слово.