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

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

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

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

Способ 1. Использование механизма «Новый формат строк»

Это самый «правильный» и каноничный метод в рамках платформы 1С:Предприятие 8. Он позволяет задать индивидуальную ширину колонок для конкретных строк макета, которая будет сохранена при выводе в результирующий документ. Рассмотрим, как реализовать это по шагам:

  1. Откроем ваш макет в конфигураторе.
  2. Выделим строки целиком, которые относятся к определенному блоку (например, Тест №1). Для этого нужно нажать на серые заголовки строк в левой части редактора макета.
  3. Нажмем правую кнопку мыши и выберем пункт меню «Таблица» -> «Формат строк» -> «Назначить новый формат строк».
  4. Теперь, когда формат назначен, мы можем менять ширину колонок именно в этих строках. Вы заметите, что изменение ширины столбца в этой области больше не влияет на ширину того же столбца в «шапке» или других частях макета.

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


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

// Выводим шапку
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ТабДок.Вывести(ОбластьШапка);

// Выводим результаты тестов, у каждого из которых свой формат строк
Если НужноПечататьТест1 Тогда
    ОбластьТест1 = Макет.ПолучитьОбласть("Тест1");
    ТабДок.Вывести(ОбластьТест1);
КонецЕсли;

Если НужноПечататьТест2 Тогда
    ОбластьТест2 = Макет.ПолучитьОбласть("Тест2");
    ТабДок.Вывести(ОбластьТест2);
КонецЕсли;

ТабДок.Показать();

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

Способ 2. Технология «Минимальной сетки» (Pixel-perfect layout)

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

Выясним суть метода: вместо того чтобы пытаться подстроить колонки под текст, мы создаем макет, состоящий из огромного количества очень узких колонок одинаковой ширины (например, ширина 1 или 2). Для того чтобы разместить текст нужной длины, мы просто объединяем несколько соседних ячеек.

Проанализируем преимущества этого подхода:

Чтобы реализовать это, выделите все колонки в макете, установите им фиксированную малую ширину, а затем формируйте визуальные поля через команду «Объединить». Это трудоемко на этапе создания макета, но избавляет от проблем с версткой в будущем.

Способ 3. Программное управление шириной колонок и метод Присоединить()

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

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

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


МассивОбластейКПечати = Новый Массив;
МассивОбластейКПечати.Добавить(Макет.ПолучитьОбласть("Шапка"));

// Добавляем тесты в зависимости от условий
Если РезультатТеста1 <> Неопределено Тогда
    МассивОбластейКПечати.Добавить(Макет.ПолучитьОбласть("Тест1"));
КонецЕсли;

ТабДок = Новый ТабличныйДокумент;
Для Каждого ТекущаяОбласть Из МассивОбластейКПечати Цикл
    // Проверяем, поместится ли следующая область на страницу
    Если Не ТабДок.ПроверитьВывод(ТекущаяОбласть) Тогда
        ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
    КонецЕсли;
    ТабДок.Вывести(ТекущаяОбласть);
КонецЦикла;

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

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

1. Если вам нужно быстро и «по-восьмерочному» исправить ситуацию — используйте Назначить новый формат строк для каждой области в макете. Это решит проблему с ужиманием столбцов.

2. Если вам нужна максимальная точность и корректная работа с Excel — используйте микро-сетку из узких колонок с последующим объединением ячеек.

3. Всегда используйте метод ПроверитьВывод() перед выводом очередной области. Это позволит не разрывать логические блоки (тесты) между страницами и при этом максимально эффективно использовать бумагу, печатая их подряд, как того требует заказчик.

Применяя эти подходы, вы сможете создавать профессиональные и аккуратные отчеты, независимо от сложности структуры исходных макетов.

← На главную