При формировании отчетов в схеме компоновки данных (СКД) разработчики часто сталкиваются с ситуацией, когда длинный заголовок поля автоматически разбивается платформой на несколько строк. Особенно наглядно это проявляется при вертикальном выводе отчета или при выводе компактных таблиц, состоящих всего из одной строки. Платформа 1С пытается сэкономить горизонтальное пространство и переносит слова заголовка по пробелам. Если же мы попытаемся решить проблему «в лоб» и задать минимальную ширину всей колонке, то ячейка с самим значением (например, коротким числом) также растягивается, что портит внешний вид отчета.
Проанализируем причины такого поведения компоновщика и подробно рассмотрим проверенные способы настройки отчета, позволяющие зафиксировать заголовок в одну строку без деформации смежных ячеек.
По умолчанию в СКД для большинства ячеек применяется свойство «Размещение» со значением «Авто» или «Переносить». Алгоритм автоподбора ширины платформы рассчитывает размеры сетки таблицы целиком. Если заголовок содержит пробелы, компоновщик ужимает колонку по горизонтали и увеличивает высоту строки за счет переноса слов.
Если мы просто установим в оформлении поля параметр Минимальная ширина, это правило применится ко всей колонке табличного документа сверху вниз. В результате заголовок действительно перестанет переноситься, но ячейка с данными под ним (или рядом с ним при транспонировании) получит ту же самую ширину, оставив вокруг короткого значения большое пустое поле.
Разберем по шагам наиболее правильный путь решения проблемы штатными средствами СКД, предложенный в обсуждении: использование условного оформления с четким указанием области действия.
Минимальная ширина и укажем необходимое значение (например, 15 или 20 символов, в зависимости от длины текста). Также для надежности можно включить параметр Размещение и установить значение «Обрезать» или «Выступать».СистемныеПоля.УровеньВГруппировке Равно 0 (или требуемый уровень иерархии, где находится заголовок).Рассмотрим изящный способ, не требующий сложных манипуляций с условным оформлением. Платформа 1С выполняет перенос текста исключительно по стандартным пробелам (символ с кодом 32) и дефисам. Если разорвать цепочку обычных пробелов, СКД будет воспринимать фразу как единое длинное слово.
Alt + 0160 (набирая цифры на цифровом блоке клавиатуры при зажатой клавише Alt).СтрЗаменить(Поле, " ", Символ(160)).В этом случае компоновщик макета не сможет перенести текст заголовка и будет вынужден отрисовать его в одну строчку.
Если вертикальная таблица формируется путем вывода группировок, часто реквизиты выводятся вместе с группировочным полем в одну общую ячейку. Проанализируем настройки вывода, которые позволяют физически разнести заголовки и значения по разным колонкам:
После этого наименование и значение попадут в разные физические столбцы таблицы, что позволит раздельно управлять их шириной и форматированием.
Когда требуется стопроцентный визуальный контроль над таблицей, наилучшим решением является создание собственного макета оформления ячейки:
Посмотрим на пример ситуации, когда отчет формируется программно. В модуле отчета или форме в процедуре ПриКомпоновкеРезультата мы можем напрямую скорректировать результирующий табличный документ после вывода компоновщика.
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
// Точечно отключаем перенос текста и автовысоту для заголовков
ОбластьШапки = ДокументРезультат.Область("R1C1:R1C2");
ОбластьШапки.РазмещениеТекста = ТипРазмещенияТекстаТабличногоДокумента.Выступать;
// Задаем ширину первой колонки под заголовок
ДокументРезультат.Область("C1").ШиринаКолонки = 25;
КонецПроцедуры
Таким образом, комбинируя область применения условного оформления и свойства размещения текста, мы получаем аккуратный табличный документ без деформированных ячеек с данными.