Почему увеличивается ширина таблицы при выводе макета в 1С и как это исправить

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

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

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

Анализ проблемы: почему одна колонка превращается в шесть?

Рассмотрим типичный сценарий. В коде выполняется вывод подготовленной области макета в итоговый табличный документ:


МакетПечати.Параметры.Протокол = Протокол.ПолучитьТекст();
ТабличныйДокумент.Вывести(МакетПечати);

Перед выводом разработчик проверяет свойства объектов в отладчике и видит следующую картину:

  1. В исходном макете визуально оформлена всего 1 колонка.
  2. До вывода область МакетПечати.ШиринаТаблицы возвращает значение 1.
  3. В результирующем объекте ТабличныйДокумент до вывода ширина равна 0.
  4. Сразу после вывода области значение ТабличныйДокумент.ШиринаТаблицы становится равным 6.

Давайте разберем по шагам, почему так происходит. Первое, на что нужно обратить внимание, — это природа свойства ШиринаТаблицы в платформе 1С. Данное свойство возвращает общее количество колонок, которые содержат не только текстовые данные, но и любые свойства оформления.

К таким неявным свойствам оформления относятся:

Если макет создавался не с нуля, а был скопирован с другого отчета или обработки, в его XML-структуре (файле формата .mxl) сохраняются старые форматы строк. Даже если вы выделили ячейки и нажали клавишу Delete, платформа очистила лишь текстовое содержимое, но сохранила информацию о структуре колонок.

Почему у макета ширина 1, а у результата — 6?

Выясним причину несоответствия: почему свойство МакетПечати.ШиринаТаблицы возвращает 1, но при переносе в результирующий документ сетка расширяется до 6 колонок?

Дело в том, что метод ПолучитьОбласть() возвращает конкретный именованный диапазон ячеек. Если имя области (например, «Строка») было назначено только на первую колонку (конкретно на ячейку R1C1), то объект ОбластьЯчеекТабличногоДокумента действительно имеет ширину, равную 1.

Однако при вызове метода ТабличныйДокумент.Вывести() платформа копирует в итоговый документ не просто изолированную ячейку, а всю строку целиком вместе с ее индивидуальным форматом колонок. Если строка в исходном макете-доноре имела формат, рассчитанный на 6 колонок (например, из-за того, что в других строках макета колонки были объединены или имели уникальную ширину), результирующий табличный документ вынужден перестроить свою общую сетку под этот формат. В итоге общая ширина таблицы увеличивается.

Способы решения проблемы

Для устранения фантомных колонок и приведения ширины таблицы в соответствие с реальными данными можно использовать несколько подходов. Рассмотрим их подробнее.

Решение 1. Интерактивное удаление неиспользуемых колонок

Простая очистка содержимого ячеек клавишей Delete или Backspace не удаляет метаданные колонок. Чтобы физически вырезать лишние колонки из структуры макета, выполните следующие действия в конфигураторе:

  1. Откройте макет печати в редакторе.
  2. Включите отображение заголовков строк и колонок (в меню: Таблица — Имена — Отображать заголовки).
  3. Нажмите левой кнопкой мыши на серую панель заголовков сверху и выделите все «лишние» колонки (в нашем случае с 2-й по 6-ю).
  4. Нажмите правой кнопкой мыши по выделенным заголовкам колонок и выберите пункт «Удалить» (не «Очистить»!).

После этой операции лишние колонки будут полностью удалены из XML-структуры макета.

Решение 2. Сброс формата строк

Уникальная ширина колонок для отдельных строк задается через механизм формата строк. Если этот формат больше не нужен, его следует сбросить:

  1. Выделите строки макета на левой серой панели заголовков.
  2. Нажмите правой кнопкой мыши и выберите команду «Удалить формат строк».
  3. Ширина колонок в выделенных строках вернется к стандартной (общей для всего макета) сетке, а скрытые настройки разметки будут стерты.

Решение 3. Программная глубокая очистка областей

Если вы формируете или очищаете макет программно, обычный вызов метода Очистить() без параметров удалит только текст. Чтобы гарантированно очистить все форматы, рамки и стили, передавайте в метод явные параметры:


// Параметры метода Очистить: ОчищатьЗначения, ОчищатьОформление, ОчищатьВыделениеРегионов
ОбластьДляОчистки = МакетПечати.Область("R1C2:R100C6");
ОбластьДляОчистки.Очистить(Истина, Истина, Истина);

Использование всех трех параметров в значении Истина гарантирует, что из указанного диапазона ячеек со 2-й по 6-ю колонку сотрется абсолютно вся служебная информация, которая могла влиять на свойство ШиринаТаблицы.

Решение 4. Создание макета с нуля (быстрый практический путь)

Как показывает практика практикующих разработчиков 1С, если макет-донор был сильно перегружен сложным форматированием, объединением ячеек и ручными настройками ширины, «вычистить» его до идеального состояния бывает трудно. В таком случае самым надежным и быстрым решением будет создание нового чистого макета в конфигураторе и перенос туда только необходимых текстов и параметров ручным вводом. Это полностью исключит перенос скрытых «фантомных» свойств оформления старого макета.

← На главную