При формировании печатных форм договоров и соглашений в формате Microsoft Word из 1С часто требуется кастомизировать нижний колонтитул. Типичная задача — разместить внизу страниц блок подписей сторон (например, дату и ФИО), а сразу под ним мелким шрифтом вывести пояснительный текст (подстрочник: «подпись», «расшифровка подписи», «дата»).
Рассмотрим, с какой ошибкой сталкиваются разработчики при попытке добавить вторую строку, как правильно обращаться к объектной модели Word и какие способы решения задачи существуют.
Проанализируем распространенную ошибку: попытку обратиться к Sections(1).Footers(2) для вывода второй строки колонтитула.
В объектной модели Microsoft Word коллекция Footers принимает в качестве индекса не номер строки абзаца, а предопределенную константу типа колонтитула (перечисление WdHeaderFooterIndex):
1 (wdHeaderFooterPrimary) — основной колонтитул документа;2 (wdHeaderFooterFirstPage) — колонтитул первой страницы (активен только при включенной опции «Особый колонтитул для первой страницы»);3 (wdHeaderFooterEvenPages) — колонтитул четных страниц (при разделении четных и нечетных страниц).Таким образом, присваивая значение свойству Footers(2).Range.Text, разработчик изменяет колонтитул первой страницы, а не добавляет вторую строку к основному колонтитулу.
Разберем рабочий способ добавления нескольких строк с индивидуальным оформлением для каждой через последовательную вставку абзацев в основной колонтитул 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):
0 — по левому краю (wdAlignPageNumberLeft);1 — по центру (wdAlignPageNumberCenter);2 — по правому краю (wdAlignPageNumberRight).Посмотрим на пример размещения номера страницы по центру верхнего колонтитула:
// Добавляем номер страницы: 1 - по центру, Истина - отображать на первой странице
Документ.Sections(1).Headers(1).PageNumbers.Add(1, Истина);
Если реквизиты подписей имеют разную длину (длинные наименования контрагентов или ФИО), использование простых пробелов и подчеркиваний может привести к смещению подстрочников. В таких случаях надежнее программно создать в колонтитуле невидимую таблицу.
Разберем по шагам вставку таблицы 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 = Ложь;
Если в конфигурации используется «Библиотека стандартных подсистем» (БСП), ручного программного форматирования через COM-объект можно избежать:
.docx.{v8 Контрагент}, {v8 Дата}.Клиентский контекст: COM-автоматизацию Новый COMОбъект("Word.Application") следует выполнять только на клиенте под управлением ОС Windows. На сервере 1С (особенно в Linux-среде) COM-объекты Microsoft Office недоступны, а под Windows Server их запуск в фоновых сессиях официально не поддерживается и может приводить к зависанию процессов WINWORD.EXE.
Отказ от Selection в пользу Range: Не используйте методы Selection для перемещения курсора по документу. Работа через объекты Range выполняется быстрее, стабильнее и не зависит от активности окна пользователя.