При разработке печатных форм в системе 1С:Предприятие программисты часто сталкиваются с задачей вывода нескольких разнородных блоков данных в один итоговый документ. Классический пример: общая «шапка» документа с одними реквизитами и несколько различных таблиц (результаты тестов, анализы, спецификации) под ней. Главная сложность заключается в том, что по умолчанию 1С применяет ширину колонок первой выведенной области ко всему документу. В итоге последующие области «расползаются» или, наоборот, неоправданно сжимаются, искажая текст и визуальное восприятие.
Разберем, почему это происходит и какими способами можно добиться идеального отображения всех макетов в одном табличном документе, не прибегая к созданию отдельных листов для каждого блока. Проанализируем ситуацию: табличный документ в 1С — это сетка, и если мы просто вызываем метод Вывести(), платформа пытается втиснуть данные новой области в уже существующие координаты колонок. Рассмотрим подробнее основные пути решения этой задачи.
Это самый «правильный» и каноничный метод в рамках платформы 1С:Предприятие 8. Он позволяет задать индивидуальную ширину колонок для конкретных строк макета, которая будет сохранена при выводе в результирующий документ. Рассмотрим, как реализовать это по шагам:
Когда мы будем программно выводить эти области, 1С автоматически поймет, что для данного блока строк используется свой формат, и создаст в результирующем ТабличныйДокумент отдельную секцию с собственными настройками колонок. Посмотрим на пример программного кода, который реализует такой вывод:
// Создаем результирующий документ
ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("МакетПечати");
// Выводим шапку
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ТабДок.Вывести(ОбластьШапка);
// Выводим результаты тестов, у каждого из которых свой формат строк
Если НужноПечататьТест1 Тогда
ОбластьТест1 = Макет.ПолучитьОбласть("Тест1");
ТабДок.Вывести(ОбластьТест1);
КонецЕсли;
Если НужноПечататьТест2 Тогда
ОбластьТест2 = Макет.ПолучитьОбласть("Тест2");
ТабДок.Вывести(ОбластьТест2);
КонецЕсли;
ТабДок.Показать();
Важный нюанс: при использовании этого метода старайтесь не переусердствовать с количеством форматов строк (не создавать их для каждой строки по отдельности), так как это может замедлить формирование документа и увеличить объем файла при сохранении.
Если ваши макеты очень сложные или планируется экспорт документа в формат Excel, предыдущий способ может давать огрехи. Дело в том, что Excel не очень любит частую смену форматов колонок на одном листе. В таких случаях мы рекомендуем использовать метод «минимальной сетки».
Выясним суть метода: вместо того чтобы пытаться подстроить колонки под текст, мы создаем макет, состоящий из огромного количества очень узких колонок одинаковой ширины (например, ширина 1 или 2). Для того чтобы разместить текст нужной длины, мы просто объединяем несколько соседних ячеек.
Проанализируем преимущества этого подхода:
XLS или PDF.Чтобы реализовать это, выделите все колонки в макете, установите им фиксированную малую ширину, а затем формируйте визуальные поля через команду «Объединить». Это трудоемко на этапе создания макета, но избавляет от проблем с версткой в будущем.
Иногда возникают ситуации, когда формат строк нельзя задать заранее. В таких случаях можно попробовать управлять шириной колонок программно, однако это требует большой осторожности. Если изменить ТабДок.Область().ШиринаКолонки, это может повлиять на уже выведенные данные в тех же колонках.
Рассмотрим использование метода Присоединить(). В отличие от Вывести(), который добавляет данные снизу, Присоединить() добавляет их справа. Однако, если объединить эти методы с грамотным управлением областями, можно формировать сложные структуры. Для решения задачи автора (вывод блоков строго друг под другом) основным методом все равно останется Вывести().
Проанализируем пример кода с использованием проверки на заполнение страницы, что важно для экономии бумаги:
МассивОбластейКПечати = Новый Массив;
МассивОбластейКПечати.Добавить(Макет.ПолучитьОбласть("Шапка"));
// Добавляем тесты в зависимости от условий
Если РезультатТеста1 <> Неопределено Тогда
МассивОбластейКПечати.Добавить(Макет.ПолучитьОбласть("Тест1"));
КонецЕсли;
ТабДок = Новый ТабличныйДокумент;
Для Каждого ТекущаяОбласть Из МассивОбластейКПечати Цикл
// Проверяем, поместится ли следующая область на страницу
Если Не ТабДок.ПроверитьВывод(ТекущаяОбласть) Тогда
ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
ТабДок.Вывести(ТекущаяОбласть);
КонецЦикла;
Выясним причину, почему разработчики часто годами ищут ответ на этот вопрос: стандартный механизм 1С кажется неочевидным, пока не столкнешься с понятием формата строк. Подведем итог нашим изысканиям:
1. Если вам нужно быстро и «по-восьмерочному» исправить ситуацию — используйте Назначить новый формат строк для каждой области в макете. Это решит проблему с ужиманием столбцов.
2. Если вам нужна максимальная точность и корректная работа с Excel — используйте микро-сетку из узких колонок с последующим объединением ячеек.
3. Всегда используйте метод ПроверитьВывод() перед выводом очередной области. Это позволит не разрывать логические блоки (тесты) между страницами и при этом максимально эффективно использовать бумагу, печатая их подряд, как того требует заказчик.
Применяя эти подходы, вы сможете создавать профессиональные и аккуратные отчеты, независимо от сложности структуры исходных макетов.