Как программно добавить несколько строк с разным форматированием в колонтитул документа Word из 1С?

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

При формировании печатных форм договоров и соглашений в формате Microsoft Word из 1С часто требуется кастомизировать нижний колонтитул. Типичная задача — разместить внизу страниц блок подписей сторон (например, дату и ФИО), а сразу под ним мелким шрифтом вывести пояснительный текст (подстрочник: «подпись», «расшифровка подписи», «дата»).

Рассмотрим, с какой ошибкой сталкиваются разработчики при попытке добавить вторую строку, как правильно обращаться к объектной модели Word и какие способы решения задачи существуют.

Почему не работает прямое обращение к Footers(2)

Проанализируем распространенную ошибку: попытку обратиться к Sections(1).Footers(2) для вывода второй строки колонтитула.

В объектной модели Microsoft Word коллекция Footers принимает в качестве индекса не номер строки абзаца, а предопределенную константу типа колонтитула (перечисление WdHeaderFooterIndex):

  1. 1 (wdHeaderFooterPrimary) — основной колонтитул документа;
  2. 2 (wdHeaderFooterFirstPage) — колонтитул первой страницы (активен только при включенной опции «Особый колонтитул для первой страницы»);
  3. 3 (wdHeaderFooterEvenPages) — колонтитул четных страниц (при разделении четных и нечетных страниц).

Таким образом, присваивая значение свойству Footers(2).Range.Text, разработчик изменяет колонтитул первой страницы, а не добавляет вторую строку к основному колонтитулу.

Решение 1: Построчное добавление абзацев и форматирование через Range

Разберем рабочий способ добавления нескольких строк с индивидуальным оформлением для каждой через последовательную вставку абзацев в основной колонтитул Footers(1).

Посмотрим на пример кода на стороне клиента 1С:


// Создаем или получаем документ Word
Колонтитул = Документ.Sections(1).Footers(1);

// Заполняем первую строку
Колонтитул.Range.Text = "____________ {Контрагент} {Дата} _____________ {Руководитель} {Дата}";

// Добавляем разрыв абзаца и вставляем вторую строку
Колонтитул.Range.InsertParagraphAfter();
Колонтитул.Range.InsertAfter("подпись контрагент дата");

// Настраиваем размер шрифта для второй строки (второго абзаца)
Колонтитул.Range.Paragraphs(2).Range.Font.Size = 6;
Колонтитул.Range.Paragraphs(2).Range.Font.Italic = Истина;

В этом примере мы получаем диапазон колонтитула, вставляем разделитель абзаца методом InsertParagraphAfter(), дописываем текст подписи методом InsertAfter(), а затем обращаемся к конкретному абзацу по индексу Paragraphs(2) и меняем параметры его шрифта.

Дополнительно: Добавление и центрирование номеров страниц

Выясним, как управлять номерами страниц в верхнем или нижнем колонтитуле. Метод PageNumbers.Add принимает параметры выравнивания и признак отображения на первой странице.

Параметры выравнивания (WdPageNumberAlignment):

  1. 0 — по левому краю (wdAlignPageNumberLeft);
  2. 1 — по центру (wdAlignPageNumberCenter);
  3. 2 — по правому краю (wdAlignPageNumberRight).

Посмотрим на пример размещения номера страницы по центру верхнего колонтитула:


// Добавляем номер страницы: 1 - по центру, Истина - отображать на первой странице
Документ.Sections(1).Headers(1).PageNumbers.Add(1, Истина);

Решение 2: Использование невидимой таблицы в колонтитуле (для ровной верстки)

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

Разберем по шагам вставку таблицы 2x2 в колонтитул:


ДиапазонКолонтитула = Документ.Sections(1).Footers(1).Range;
Таблица = Документ.Tables.Add(ДиапазонКолонтитула, 2, 2);

// Первая строка - подписи и ФИО
Таблица.Cell(1, 1).Range.Text = "Покупатель: ____________ / " + ФИОПокупателя + " /";
Таблица.Cell(1, 2).Range.Text = "Поставщик: ____________ / " + ФИОПоставщика + " /";

// Вторая строка - мелкие подстрочники
Таблица.Cell(2, 1).Range.Text = "(подпись, расшифровка)";
Таблица.Cell(2, 1).Range.Font.Size = 7;
Таблица.Cell(2, 1).Range.ParagraphFormat.Alignment = 1; // По центру

Таблица.Cell(2, 2).Range.Text = "(подпись, расшифровка)";
Таблица.Cell(2, 2).Range.Font.Size = 7;
Таблица.Cell(2, 2).Range.ParagraphFormat.Alignment = 1;

// Отключаем отображение границ таблицы
Таблица.Borders.Enable = Ложь;

Решение 3: Использование шаблонов макета БСП без прямого COM-кода

Если в конфигурации используется «Библиотека стандартных подсистем» (БСП), ручного программного форматирования через COM-объект можно избежать:

  1. Создаем двоичный макет печатной формы в формате .docx.
  2. В Word настраиваем колонтитул визуально: вставляем таблицу, настраиваем размеры шрифтов, выравнивание и границы.
  3. В ячейки колонтитула помещаем параметры БСП вида {v8 Контрагент}, {v8 Дата}.
  4. При печати БСП заполнит параметры непосредственно в XML-структуре файла без необходимости открывать приложение Word и настраивать свойства шрифтов программно.

Важные рекомендации при работе с Word.Application

Клиентский контекст: COM-автоматизацию Новый COMОбъект("Word.Application") следует выполнять только на клиенте под управлением ОС Windows. На сервере 1С (особенно в Linux-среде) COM-объекты Microsoft Office недоступны, а под Windows Server их запуск в фоновых сессиях официально не поддерживается и может приводить к зависанию процессов WINWORD.EXE.

Отказ от Selection в пользу Range: Не используйте методы Selection для перемещения курсора по документу. Работа через объекты Range выполняется быстрее, стабильнее и не зависит от активности окна пользователя.

← На главную