Автоматизация формирования печатных форм в формате Microsoft Word часто сталкивается с техническими ограничениями стандартных методов, таких как Find.Execute. В процессе работы мы часто обнаруживаем, что метод замены текста имеет ограничение в 255 символов, а простая вставка абзацев через Paragraphs.Add всегда сбрасывает данные в конец документа. Давайте разберем, как эффективно решать эту задачу, обеспечивая гибкость и чистоту кода.
Первое, что необходимо усвоить: старайтесь избегать объекта Selection. Он привязан к положению «курсора» в интерфейсе Word, что делает код нестабильным: если в процессе генерации документа пользователь случайно кликнет мышкой, форматирование может «поехать». Вместо этого мы будем работать с объектами Document и Range.
Объект Range позволяет нам точно указывать область документа, с которой мы работаем. Если мы находим метку в документе, мы получаем диапазон, который можно расширять или заменять, не затрагивая остальную структуру файла.
Рассмотрим пример, как можно вставлять строки в цикле, используя InsertAfter и InsertParagraphAfter:
// Предположим, что Замена - это объект Range, полученный после поиска метки
Табл = Замена.Parent;
Для Каждого стр из ТЧвыгрузка Цикл
Сотрудник = "" + стр.Сотрудник;
Табл.InsertAfter(Сотрудник);
Табл.InsertParagraphAfter();
КонецЦикла;
Для создания профессиональных отчетов недостаточно просто вставить текст — важно применить к нему стили: отступы, выравнивание, шрифты. Для этого лучше всего создать отдельную функцию, которая будет принимать объект документа и параметры оформления.
Давайте создадим структуру, которая хранит настройки абзаца, и применим их программно:
Функция ПолучитьНастройкиОформления()
Оформление = Новый Структура;
Оформление.Вставить("ФорматПараграфа", Новый Структура("Alignment, LeftIndent", 1, 0.75));
// ... здесь можно добавить любые другие параметры: SpaceBefore, SpaceAfter и т.д.
Возврат Оформление;
КонецФункции
Процедура ВставитьСтрокуВДокумент(Документ, Текст, Оформление)
Документ.Paragraphs.Add();
НомерПараграфа = Документ.Paragraphs.Count;
Абзац = Документ.Paragraphs(НомерПараграфа);
Абзац.Range.InsertAfter(Текст);
Абзац.Format.Alignment = Оформление.ФорматПараграфа.Alignment;
// Дальнейшая настройка свойств абзаца и шрифта...
КонецПроцедуры
Документ.Bookmarks("ИмяЗакладки").Range.Text = "Значение". Это самый безопасный метод, исключающий ошибки позиционирования.Table для добавления новых строк через Rows.Add(). Это сохранит границы и выравнивание автоматически.Content.Copy), вставлять в основной документ и далее заполнять через Find.Execute или Range.Для минимизации ошибок при работе с COM-объектами Word следуйте этим правилам:
Range.InsertAfter().Документ.Fields.Update().Word.Quit() и приравнивайте переменные к Неопределено, чтобы предотвратить зависание процессов winword.exe в памяти сервера или клиента.Используя предложенные методы работы с Range и структурами оформления, вы сможете создавать сложные печатные формы, которые будут выглядеть профессионально и не потребуют ручной доработки пользователем после формирования из 1С.