Как вывести таблицу в Word из 1С и красиво её отформатировать?

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

Интеграция 1С с офисными приложениями Microsoft Office через COM-соединение — это стандартная задача при формировании договоров, коммерческих предложений, актов и других официальных документов. Однако разработчики часто сталкиваются с тем, что сгенерированные таблицы выглядят неаккуратно: колонки произвольно сжимаются, текст переносится некорректно, а при попытке продолжить вывод текста после таблицы новые абзацы «залипают» внутри последней ячейки.

В этой статье мы подробно разберем, как решить проблемы с форматированием таблиц Word из 1С, настроить точные размеры колонок, выровнять текст во всех плоскостях и корректно перевести курсор за пределы таблицы для продолжения заполнения документа.

Способ 1. Управление шириной колонок и отключение автоподбора Word

По умолчанию MS Word пытается автоматически подстраивать ширину столбцов под их содержимое. Если в одной ячейке находится длинное наименование, а в другой — короткий артикул, Word перераспределит пространство так, что таблица станет асимметричной. Чтобы зафиксировать точные размеры колонок, необходимо отключить стандартный автоподбор и принудительно задать ширину.

Для управления автоподбором используется метод AutoFitBehavior. Вызовем его последовательно со специальными параметрами:

  1. Сначала установим автоподбор по ширине окна страницы (параметр 2 — аналог константы wdAutoFitWindow).
  2. Затем зафиксируем эту ширину (параметр 0 — аналог константы wdAutoFitFixed), чтобы Word больше не пытался ее пересчитывать при программном заполнении ячеек текстом.

Дополнительно для точного позиционирования рекомендуется использовать функцию CentimetersToPoints. Она переводит привычные нам сантиметры во внутренние единицы измерения Word (пункты). Посмотрим на практический пример реализации этого механизма:


// Инициализация COM-соединения с Word
MSWord = Новый COMОбъект("Word.Application");
MSWord.Visible = Истина; // Сделаем процесс видимым для наглядности
Документ = MSWord.Documents.Add();

// Устанавливаем позицию вставки (начало документа)
Позиция = Документ.Range(0, 0);

// Создаем таблицу: 1 строка, 4 колонки
Таблица = Документ.Tables.Add(Позиция, 1, 4);

// Настраиваем автоповедение таблицы
Таблица.AutoFitBehavior(2); // Вписываем в границы страницы
Таблица.AutoFitBehavior(0); // Фиксируем размеры колонок

// Задаем точную ширину колонок в сантиметрах
Таблица.Columns(1).Width = MSWord.CentimetersToPoints(1.5); // № п/п
Таблица.Columns(2).Width = MSWord.CentimetersToPoints(8.0); // Наименование товара
Таблица.Columns(3).Width = MSWord.CentimetersToPoints(3.5); // Количество
Таблица.Columns(4).Width = MSWord.CentimetersToPoints(4.0); // Сумма

Способ 2. Горизонтальное и вертикальное выравнивание текста в ячейках

Когда мы выводим данные в таблицу, очень важно правильно их позиционировать. Числовые показатели (цены, количества) принято выравнивать по правому краю, текстовые наименования — по левому, а порядковые номера или даты — по центру ячейки.

Для горизонтального выравнивания используется свойство Alignment объекта ParagraphFormat. В COM-объекте Word используются следующие числовые значения:

Также важно, чтобы текст не «прилипал» к верхней границе ячейки, особенно если высота строки больше стандартной. Настроим вертикальное выравнивание с помощью свойства VerticalAlignment у объекта ячейки:

Рассмотрим, как применить эти свойства на практике при заполнении строки таблицы данными из 1С:


// Добавляем новую строку в таблицу
НоваяСтрока = Таблица.Rows.Add();

// Заполнение ячейки №1 (Номер строки - по центру)
Ячейка1 = НоваяСтрока.Cells(1);
Ячейка1.Range.Text = "1";
Ячейка1.Range.ParagraphFormat.Alignment = 1; // По центру
Ячейка1.VerticalAlignment = 1;               // По центру вертикали

// Заполнение ячейки №2 (Наименование - по левому краю)
Ячейка2 = НоваяСтрока.Cells(2);
Ячейка2.Range.Text = "Кабель силовой ВВГнг-LS 3х2.5";
Ячейка2.Range.ParagraphFormat.Alignment = 0; // По левому краю
Ячейка2.VerticalAlignment = 1;

// Заполнение ячейки №4 (Сумма - по правому краю)
Ячейка4 = НоваяСтрока.Cells(4);
Ячейка4.Range.Text = "12500.50";
Ячейка4.Range.ParagraphFormat.Alignment = 2; // По правому краю
Ячейка4.VerticalAlignment = 1;

Способ 3. Как выйти из таблицы и продолжить писать текст под ней

Одна из самых частых проблем разработчиков: после того как цикл по заполнению таблицы завершился, весь последующий выводимый текст (например, подписи сторон, итоговые формулировки) почему-то оказывается внутри последней ячейки таблицы. Использование методов имитации нажатия клавиш вроде MoveDown работает нестабильно и сильно зависит от версии Word.

Разберем два надежных способа программного переноса курсора за пределы таблицы.

Вариант А. Схлопывание диапазона (Метод Collapse) — наиболее надежный программный способ

Мы берем диапазон всей таблицы, сжимаем его в конечную точку и принудительно вставляем новый абзац сразу за границей таблицы. Этот метод работает в фоновом режиме и не требует обращения к объекту выделения экрана (Selection).


// Получаем диапазон всей созданной таблицы
ГраницаТаблицы = Таблица.Range;

// Сворачиваем диапазон к его концу (параметр 0 соответствует wdCollapseEnd)
ГраницаТаблицы.Collapse(0);

// Вставляем новый абзац сразу после таблицы
ГраницаТаблицы.InsertParagraphAfter();

// Добавляем текст, который гарантированно окажется ниже таблицы
ГраницаТаблицы.InsertAfter("Итого к оплате: Двенадцать тысяч пятьсот рублей 50 копеек.");

Вариант Б. Принудительный сдвиг курсора выделения (Selection)

Если в вашем алгоритме построение документа жестко завязано на последовательное использование объекта Selection.TypeText(), то перебросить фокус ввода за пределы таблицы можно следующим образом:


// Перемещаем курсор в позицию сразу за окончанием таблицы
MSWord.Selection.Start = Таблица.Range.End;

// Добавляем новый чистый абзац (аналог нажатия Enter)
MSWord.Selection.TypeParagraph();

// Пишем текст под таблицей
MSWord.Selection.TypeText("Директор ООО 'Ромашка' ___________ /Иванов И.И./");

Способ 4. Использование готового шаблона (макета) Word

Создание таблиц «с нуля» через COM-код — трудоемкий процесс, требующий прописывания десятков строк кода для рамок, заливки и шрифтов. Гораздо профессиональнее и быстрее — создать файл-шаблон (.docx) средствами самого Word, настроить там красивые стили, шрифты, границы колонок и сохранить его на сервере или в макете 1С как ActiveDocument.

В шаблоне мы создаем таблицу, в которой уже оформлена шапка и подготовлена ровно одна пустая строка для заполнения данными. Проанализируем алгоритм заполнения такого шаблона из 1С:


// Подключаемся к Word и открываем подготовленный файл-шаблон
MSWord = Новый COMОбъект("Word.Application");
MSWord.Visible = Ложь; // Выполняем заполнение в фоновом режиме
Документ = MSWord.Documents.Open("C:\Templates\ШаблонДоговора.docx");

// Получаем нужную нам таблицу по индексу (например, вторую по счету в документе)
РабочаяТаблица = Документ.Tables.Item(2);

// Инициализируем счетчик строк. Заполнение начинаем со 2-й строки (1-я занята шапкой)
ИндексСтроки = 2;

// Выборка данных из 1С (например, результат запроса или обход ТЧ)
Пока ВыборкаДанных.Следующий() Цикл
    
    // Если это не первая заполняемая строка, динамически добавляем новую
    Если ИндексСтроки > 2 Тогда
        РабочаяТаблица.Rows.Add();
    КонецЕсли;
    
    // Записываем данные в ячейки с помощью метода InsertAfter
    РабочаяТаблица.Cell(ИндексСтроки, 1).Range.InsertAfter(Строка(ИндексСтроки - 1)); // № п/п
    РабочаяТаблица.Cell(ИндексСтроки, 2).Range.InsertAfter(ВыборкаДанных.НоменклатураНаименование);
    РабочаяТаблица.Cell(ИндексСтроки, 3).Range.InsertAfter(Формат(ВыборкаДанных.Количество, "ЧДЦ=3"));
    РабочаяТаблица.Cell(ИндексСтроки, 4).Range.InsertAfter(Формат(ВыборкаДанных.Сумма, "ЧДЦ=2"));
    
    // Переходим к следующей строке таблицы
    ИндексСтроки = ИндексСтроки + 1;
    
КонецЦикла;

// Делаем документ видимым для пользователя после окончания формирования
MSWord.Visible = Истина;

Дополнительные полезные настройки таблиц Word

Чтобы таблицы выглядели максимально качественно при печати и переносе на стыках страниц, рекомендуем использовать две важные настройки:

  1. Запрет разрыва строк при переходе на новую страницу. По умолчанию длинная строка таблицы может разорваться: верхняя половина текста останется на одной странице, а нижняя уползет на другую. Чтобы этого избежать, используйте:
    Таблица.Rows.AllowBreakAcrossPages = 0; (где 0 — запрет разрыва).
  2. Применение стандартного оформления. Чтобы быстро применить ко всей таблице аккуратную стандартную сетку Word со всеми рамками, пропишите:
    Таблица.Style = "Сетка таблицы"; (в англоязычной версии ОС — "Table Grid").

Применение рассмотренных методик позволит вам гибко управлять структурой документов Word, сделает ваши отчеты и печатные формы презентабельными, а код — надежным и устойчивым к ошибкам верстки.

← На главную