Как вывести несколько макетов с разной шириной колонок в один табличный документ 1С?

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

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

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

Метод 1: Использование программного метода СоздатьФорматСтрок()

Наиболее технологичный способ решения проблемы — использование метода СоздатьФорматСтрок() объекта ОбластьЯчеекТабличногоДокумента. Этот метод позволяет «разорвать» связь конкретных строк с общей сеткой колонок табличного документа. Фактически для выбранной области создается свой собственный набор колонок со своими размерами.

Разберем по шагам, как это реализовать в коде:

  1. Получаем необходимую область из макета.
  2. Применяем метод СоздатьФорматСтрок() к этой области.
  3. Выводим область в результирующий табличный документ.

Проанализируем пример кода:


// Создаем результирующий документ
ТабДок = Новый ТабличныйДокумент;

// Получаем первую область (например, Шапку первого документа)
Макет1 = ПолучитьМакет("Макет1");
Область1 = Макет1.ПолучитьОбласть("Заголовок");
ТабДок.Вывести(Область1);

// Получаем вторую область из другого макета с другой шириной колонок
Макет2 = ПолучитьМакет("Макет2");
Область2 = Макет2.ПолучитьОбласть("Таблица");

// Ключевой момент: создаем индивидуальный формат строк для этой области
Область2.СоздатьФорматСтрок();

// Теперь выводим область — она сохранит свои настройки ширины колонок
ТабДок.Вывести(Область2);

Важно помнить, что при использовании СоздатьФорматСтрок() система копирует настройки ширины колонок из макета в новую независимую сетку внутри итогового документа. Если вы планируете в дальнейшем редактировать ширину колонок программно, делать это нужно именно для этой области. Для построения структуры формирования и вывода макетов в современных конфигурациях можно использовать пример внешней печатной формы на БСП.

Метод 2: Настройка формата строк в конфигураторе

Если вы хотите избежать лишнего кода, можно настроить формат строк непосредственно в макете. В конфигураторе 1С есть возможность задать уникальную ширину колонок для отдельных строк или групп строк.

Выясним, как это сделать вручную:

  1. Откройте макет в конфигураторе.
  2. Выделите одну или несколько строк, для которых нужно установить уникальную ширину колонок (выделение должно быть именно по строкам, кликом на номера строк слева).
  3. Попробуйте изменить ширину любой колонки в выделенной области.
  4. Система выдаст запрос: «Выбранные строки имеют одинаковый формат колонок. Изменить формат колонок только для выделенных строк или для всей таблицы?».
  5. Выберите вариант «Только для выделенных строк».

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

Метод 3: Использование ПакетОтображаемыхДокументов

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

Посмотрим на логику работы с объектом ПакетОтображаемыхДокументов:


Пакет = Новый ПакетОтображаемыхДокументов;

// Формируем первый документ
ТабДок1 = СформироватьПервыйОтчет(); // Возвращает ТабличныйДокумент
ЭлементПакета1 = Пакет.Состав.Добавить();
ЭлементПакета1.Данные = ПоместитьВоВременноеХранилище(ТабДок1);

// Формируем второй документ
ТабДок2 = СформироватьВторойОтчет(); // Возвращает ТабличныйДокумент
ЭлементПакета2 = Пакет.Состав.Добавить();
ЭлементПакета2.Данные = ПоместитьВоВременноеХранилище(ТабДок2);

// Показываем пользователю весь пакет сразу
Пакет.Показать("Печать пакета документов");

Этот способ идеален, если документы должны печататься последовательно, но не обязательно должны быть «склеены» в один лист. Каждый документ в пакете сохраняет свои собственные настройки страницы, поля и, конечно же, ширину колонок.

Метод 4: Метод «Микро-сетки» (Проектирование макета)

Существует еще один подход, который часто называют «профессиональным стандартом» для сложных отчетов, предназначенных для экспорта в Excel. Проанализируем ситуацию: если использовать СоздатьФорматСтрок(), то при сохранении в Excel файл будет перегружен скрытыми или очень мелкими колонками, что затруднит его редактирование пользователем.

Чтобы этого избежать, мы можем создать единую сетку для всех макетов:

  1. В основном макете создаем большое количество колонок (например, 40-60) очень маленькой и равной ширины (например, 2 или 3 единицы).
  2. Любые ячейки в макетах (заголовки, данные, подписи) формируем путем объединения нужного количества этих микро-колонок.
  3. Поскольку физическая ширина колонок во всем документе становится одинаковой, при выводе разных областей друг за другом визуальная структура не нарушается.

Этот метод требует больше времени на этапе проектирования макета в конфигураторе, но он гарантирует идеальное отображение и в 1С, и в Excel без использования программных ухищрений.

Метод 5: Использование разделителей страниц

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

Рассмотрим пример:


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

// Вставляем разделитель страниц
ТабДок.ВывестиГоризонтальныйРазделительСтраниц();

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

Подведение итогов

Подводя итог, можно сказать: выбор метода зависит от вашей конечной цели. Если вам нужно быстро «склеить» две таблицы в одну форму — используйте СоздатьФорматСтрок(). Если документы принципиально разные по смыслу и настройкам печати — выбирайте ПакетОтображаемыхДокументов. А если отчет предназначен для активной работы пользователя в Excel после выгрузки — лучше всего подойдет метод микро-сетки с объединением ячеек.

← На главную