Как программно установить ширину колонок в таблице Microsoft Word из 1С?

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

При формировании печатных форм в формате DOC программисты часто сталкиваются с ситуацией, когда таблица, созданная через COMОбъект, выглядит не так, как задумывалось. Особенно это заметно при переходе на новые версии Microsoft Office (начиная с 2013, 2016 и выше). Одной из самых частых проблем является игнорирование заданных размеров колонок: программный код выполняется без ошибок, но в результате все колонки в документе получаются одинаковой ширины.

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

Разбор основной причины: Единицы измерения

Рассмотрим код, который часто используют разработчики:


// Устанавливаем ширину колонок
Table.Columns(1).PreferredWidth = 2;
Table.Columns(2).PreferredWidth = 4;

Главная ловушка здесь заключается в единицах измерения. В объектной модели Microsoft Word свойство PreferredWidth (предпочтительная ширина) по умолчанию принимает значения в пунктах (points). Один пункт составляет примерно 1/72 дюйма или около 0,35 мм. Таким образом, устанавливая значение «2», вы просите Word сделать колонку шириной менее 1 миллиметра. Программа видит, что текст (например, слово «Артикул») не помещается в такую микроскопическую колонку, и срабатывает механизм автоматического расширения, который в итоге сбрасывает ваши настройки до стандартных «равных» долей.

Чтобы установить ширину в привычных сантиметрах, необходимо выполнить перевод. В Word 1 сантиметр равен 28.35 пунктам. Рассмотрим, как правильно рассчитать ширину:


КоэффициентСМ = 28.35;
Table.Columns(1).PreferredWidth = 2 * КоэффициентСМ; // Теперь это 2 см
Table.Columns(2).PreferredWidth = 4 * КоэффициентСМ; // Теперь это 4 см

Использование типов ширины и фиксация размеров

Даже при правильном расчете пунктов Word может проигнорировать настройки, если не указан тип ширины. Для этого используется свойство PreferredWidthType. Проанализируем основные константы, которые нам понадобятся (в 1С мы передаем их числовые значения):

Для надежного результата рекомендуется всегда явно указывать тип измерения «3». Посмотрим на пример кода:


Для НомерКолонки = 1 По 9 Цикл
    Table.Columns(НомерКолонки).PreferredWidthType = 3; // Указываем, что используем пункты
КонецЦикла;

Отключение автоматического подбора (AutoFit)

Современные версии Word по умолчанию создают адаптивные таблицы. Если текст в ячейке слишком длинный, Word расширит колонку, даже если вы запретили это делать через PreferredWidth. Чтобы зафиксировать макет «намертво», нужно использовать метод AutoFitBehavior и свойство AllowAutoFit.

Разберем параметры метода AutoFitBehavior:

  1. 0 (wdAutoFitFixed): Фиксированная ширина колонок. Это именно то, что нам нужно.
  2. 1 (wdAutoFitContent): Автоподбор по содержимому.
  3. 2 (wdAutoFitWindow): Автоподбор по ширине окна (страницы).

Добавим в наш алгоритм управления таблицей следующие строки:


// Устанавливаем режим фиксированной ширины
Table.AutoFitBehavior(0); 

// Запрещаем таблице менять размеры для вписывания содержимого
Table.AllowAutoFit = Ложь;

Альтернативный способ: Установка ширины через ячейки первой строки

Иногда свойство Table.Columns ведет себя нестабильно (особенно если в таблице есть объединенные ячейки). В таких случаях надежнее устанавливать ширину через коллекцию Cells конкретной строки, обычно первой. Свойство Width является более приоритетным, чем «предпочтительная» ширина.

Рассмотрим пошаговый пример реализации:


// Создаем таблицу
Table = Документ.Tables.Add(Position, 1, 9, 1, 0); // 1 - поведение wdWord8TableBehavior, 0 - фиксированная ширина

// Настраиваем колонки через ячейки первой строки
Row1 = Table.Rows(1);
Коэф = 28.35;

Row1.Cells(1).Width = 1 * Коэф;    // №
Row1.Cells(2).Width = 2.5 * Коэф;  // Артикул
Row1.Cells(3).Width = 6 * Коэф;    // Наименование
Row1.Cells(4).Width = 1.5 * Коэф;  // Кол-во
// ... и так далее для остальных колонок

Комплексный пример кода

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


// Инициализация MS Word
WordApp = Новый COMОбъект("Word.Application");
Документ = WordApp.Documents.Add();
Position = Документ.Range(0, 0);

// Создание таблицы: 1 строка, 9 колонок
// 4-й параметр 1 (wdWord8TableBehavior) отключает лишнюю "умную" логику
// 5-й параметр 0 (wdAutoFitFixed) включает фиксированный режим
Table = Документ.Tables.Add(Position, 1, 9, 1, 0);

Коэффициент = 28.35; // Перевод см в пункты

// Задаем ширину для каждой колонки индивидуально
Table.Columns(1).PreferredWidthType = 3; Table.Columns(1).PreferredWidth = 1 * Коэффициент;
Table.Columns(2).PreferredWidthType = 3; Table.Columns(2).PreferredWidth = 3 * Коэффициент;
Table.Columns(3).PreferredWidthType = 3; Table.Columns(3).PreferredWidth = 7 * Коэффициент;
Table.Columns(4).PreferredWidthType = 3; Table.Columns(4).PreferredWidth = 2 * Коэффициент;
// Для остальных колонок по 2 см
Для i = 5 По 9 Цикл
    Table.Columns(i).PreferredWidthType = 3;
    Table.Columns(i).PreferredWidth = 2 * Коэффициент;
КонецЦикла;

// Отключаем автоподбор
Table.AllowAutoFit = Ложь;

// Заполняем заголовки
Row1 = Table.Rows(1);
Row1.Cells(1).Range.Text = "№";
Row1.Cells(2).Range.Text = "Артикул";
Row1.Cells(3).Range.Text = "Товар";
// ... заполнение остальных ячеек

// Оформление
Row1.Range.Font.Bold = Истина;
Row1.Range.ParagraphFormat.Alignment = 1; // Центрирование

WordApp.Visible = Истина;

Важные рекомендации

Проанализировав ситуацию, можно выделить несколько «золотых правил» при работе с таблицами Word из 1С:

  1. Порядок действий: Сначала установите параметры таблицы и ширину колонок, и только потом заполняйте её текстом. Если сначала вставить длинные строки, Word может «раздуть» таблицу до того, как сработает ваш код фиксации.
  2. Использование констант: Всегда помните, что 1С не знает имен констант Word (вроде wdAutoFitFixed). Всегда ищите их числовые значения в документации VBA.
  3. Шрифты: Учитывайте, что размер шрифта также влияет на минимально возможную ширину колонки. Если шрифт слишком большой, колонка не сожмется до указанного размера, пока вы не уменьшите Font.Size.

Следуя этим правилам и правильно используя перевод единиц измерения, вы сможете создавать профессионально оформленные документы любой сложности, полностью контролируя геометрию таблиц.

← На главную