При формировании быстрых отчетов или выводе таблиц значений на печать разработчики часто используют объект ПостроительОтчета. Этот механизм позволяет мгновенно генерировать печатные формы без детального проектирования макетов. Однако у его простоты есть обратная сторона: стандартный алгоритм расчета ширины колонок работает не всегда идеально. Например, системные колонки вроде "Номер строки" могут неоправданно растягиваться, из-за чего полезные данные не помещаются на стандартный лист формата А4.
В этой статье мы подробно разберем несколько эффективных способов управления шириной выводимых колонок в 1С при использовании ПостроительОтчета. Мы изучим как простые интерактивные методы, так и сложные программные алгоритмы автоматического расчета ширины ячеек. Для настройки печатных форм без избыточного кодирования пригодится инструкция по редактированию печатных форм в 1С.
В сообщениях на форуме часто предлагают следующее решение:
Построитель = Новый ПостроительОтчета;
Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТаблицаЗначений);
Построитель.Макет = Неопределено;
Макет = Построитель.Макет;
Область = Макет.Область();
Область.ШиринаКолонки = 10;
Построитель.Макет = Макет;
Построитель.Вывести();
Давайте выясним, почему этот код не решает поставленную задачу избирательного изменения ширины конкретной колонки. Метод Макет.Область() без параметров возвращает весь табличный документ целиком. Когда мы устанавливаем свойство ШиринаКолонки = 10 для всей области, мы принудительно делаем абсолютно все колонки отчета одинаковой ширины. Это испортит форматирование больших текстовых полей (например, наименований или ФИО сотрудников) и сделает таблицу нечитаемой. Наша задача — научиться управлять шириной колонок точечно.
Для того чтобы изменить размеры конкретных колонок, мы должны заставить ПостроительОтчета сгенерировать макет по умолчанию, затем перехватить этот макет, найти нужные области по имени или тексту заголовка, скорректировать их ширину и вернуть измененный макет обратно в построитель до вызова метода вывода.
Рассмотрим по шагам реализацию этого алгоритма:
// 1. Инициализируем построитель и источник данных
Построитель = Новый ПостроительОтчета;
Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТаблицаЗначений);
// 2. Сбрасываем макет в Неопределено, чтобы система построила его автоматически
Построитель.Макет = Неопределено;
Построитель.Выполнить(); // Запускаем процесс генерации структуры отчета
// 3. Получаем сгенерированный макет во временную переменную
МакетОтчета = Построитель.Макет;
// 4. Находим область конкретной колонки по тексту заголовка
ОбластьНомерСтроки = МакетОтчета.НайтиТекст("Номер строки");
Если ОбластьНомерСтроки <> Неопределено Тогда
// Задаем компактный размер для колонки нумерации
ОбластьНомерСтроки.ШиринаКолонки = 6;
КонецЕсли;
ОбластьСотрудник = МакетОтчета.НайтиТекст("Сотрудник");
Если ОбластьСотрудник <> Неопределено Тогда
// Выделяем больше места под фамилию и инициалы
ОбластьСотрудник.ШиринаКолонки = 35;
КонецЕсли;
// 5. Возвращаем модифицированный макет в построитель
Построитель.Макет = МакетОтчета;
// 6. Выводим готовый отчет на экран
Построитель.Вывести();
Этот способ хорош тем, что структура отчета подготавливается еще на этапе компоновки данных самим построителем, и на экран сразу выводится документ с правильным оформлением. В задачах по подбору решений для переноса данных ЗУП такие отчеты часто используются для первичного анализа качества перенесенных кадровых сведений.
Зачастую намного проще управлять визуальным отображением данных уже после того, как построитель отработал и сформировал итоговый документ. Для этого мы перенаправим вывод данных из построителя в предварительно созданный объект ТабличныйДокумент.
Проанализируем пример кода с постобработкой готового документа:
// Создаем результирующий табличный документ
ТабДок = Новый ТабличныйДокумент;
// Выводим данные построителя в наш табличный документ
Построитель.Вывести(ТабДок);
// Вариант А: Корректировка по известным номерам колонок (если структура статична)
// Синтаксис метода Область: Область(СтрокаНачала, КолонкаНачала, СтрокаКонца, КолонкаКонца)
ТабДок.Область(, 1, , 1).ШиринаКолонки = 5; // Задаем ширину 1-й колонки равной 5
ТабДок.Область(, 2, , 2).ШиринаКолонки = 30; // Задаем ширину 2-й колонки равной 30
// Вариант Б: Динамический поиск колонок по заголовкам в готовом документе
ОбластьЗаголовкаНомер = ТабДок.НайтиТекст("№");
Если ОбластьЗаголовкаНомер <> Неопределено Тогда
ОбластьЗаголовкаНомер.ШиринаКолонки = 6;
КонецЕсли;
// Отображаем итоговый документ пользователю
ТабДок.Показать("Отчет по сотрудникам");
Использование постобработки табличного документа считается более гибким подходом, так как программист получает полный контроль над готовой печатной формой и может применять к ней любые дополнительные методы оформления. Например, при подготовке отчетов для контроля результатов миграции автоматизация сверки проводок между базами поможет найти ошибки быстрее, чем ручной просмотр широких таблиц.
Если главная проблема заключается в том, что отчет из-за широких колонок физически не помещается на лист бумаги формата А4 при отправке на печать, можно применить масштабирование. На форуме предлагали делать это вручную в окне параметров печати, однако мы можем автоматизировать этот процесс программно.
Достаточно установить свойство АвтоМасштаб для целевого табличного документа в значение Истина. Платформа 1С самостоятельно сожмет или растянет отчет так, чтобы все колонки ровно уложились по ширине печатной страницы.
ТабДок = Новый ТабличныйДокумент;
Построитель.Вывести(ТабДок);
// Включаем автоматическое масштабирование под ширину листа
ТабДок.АвтоМасштаб = Истина;
// Задаем ландшафтную ориентацию, если колонок действительно много
ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
ТабДок.Показать();
Этот метод идеально подходит в качестве быстрого решения проблемы "вылезания" данных за границы листа без необходимости вручную перебирать размеры десятков колонок.
Для создания профессиональных отчетов в среде "1С:Предприятие" часто применяется алгоритм динамического подбора ширины. Суть метода заключается в том, чтобы проанализировать длину строкового представления данных в первых строках таблицы и установить ширину колонок на основании этих замеров.
Давайте реализуем универсальную процедуру автоматического подбора ширины ячеек:
Процедура ОптимизироватьШиринуКолонок(ТабДок) Экспорт
// Ограничиваем количество анализируемых строк для экономии производительности
МаксимальноеКоличествоСтрок = Мин(ТабДок.ВысотаТаблицы, 100);
КоличествоКолонок = ТабДок.ШиринаТаблицы;
Для НомерКолонки = 1 По КоличествоКолонок Цикл
МаксДлинаСимволов = 0;
// Перебираем ячейки текущей колонки в первых строках документа
Для НомерСтроки = 1 По МаксимальноеКоличествоСтрок Цикл
Ячейка = ТабДок.Область(НомерСтроки, НомерКолонки);
// Проверяем длину текста ячейки
ТекущаяДлина = СтрДлина(Ячейка.Текст);
Если ТекущаяДлина > МаксДлинаСимволов Тогда
МаксДлинаСимволов = ТекущаяДлина;
КонецЕсли;
КонецЦикла;
// Вычисляем оптимальную ширину с учетом небольшого запаса на шрифты
Если МаксДлинаСимволов > 0 Тогда
ОптимальнаяШирина = МаксДлинаСимволов + 3; // Добавляем 3 символа запаса
// Ограничиваем минимальную и максимальную ширину
ОптимальнаяШирина = Макс(ОптимальнаяШирина, 5);
ОптимальнаяШирина = Мин(ОптимальнаяШирина, 50);
ТабДок.Область(, НомерКолонки, , НомерКолонки).ШиринаКолонки = ОптимальнаяШирина;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Применение этой процедуры после выполнения вывода построителя гарантирует аккуратный внешний вид таблицы без пустых пространств и без усечения важной информации. Если формирование подобных документов является частью бизнес-процесса, использование программных роботов RPA позволит полностью исключить ручной труд при их подготовке и рассылке.
Стоит отметить, что объект ПостроительОтчета является устаревшим и использовался в основном на платформе 1С версий 8.0 и 8.1 (а также в "обычном" интерфейсе 8.2 и 8.3). В современной разработке стандартом является использование Системы компоновки данных (СКД).
В СКД задача управления шириной колонок решается полностью в визуальном конструкторе без написания единой строки кода:
НомерСтроки или Сотрудник), к которым должно применяться это ограничение.Использование СКД не только упрощает форматирование ячеек, но и дает конечным пользователям огромные возможности по самостоятельной кастомизации отчетов прямо в режиме предприятия.