При переходе с платформы 8.2 на 8.3, особенно при отключении режима совместимости с версиями 8.1 или 8.2.13, разработчики часто сталкиваются с изменением визуального представления отчетов, построенных на системе компоновки данных (СКД). Одной из наиболее распространенных проблем является некорректная работа условного оформления, в частности — параметра ОриентацияТекста. Рассмотрим ситуацию, когда нам необходимо повернуть заголовки колонок на 90 градусов для экономии места, сохранив при этом стандартное (горизонтальное) отображение самих данных в строках отчета.
Прежде чем переходить к практике, разберем причины возникновения проблемы. В новых версиях платформы 1С:Предприятие 8.3 был существенно переработан движок отрисовки табличных документов и алгоритм расчета каскадных стилей СКД. Если в режиме совместимости настройки оформления могли наследоваться «мягко» или вовсе игнорироваться для определенных областей, то в 8.3 иерархия стала жесткой. Настройки, заданные на уровне всего отчета, теперь приоритетно спускаются вниз ко всем вложенным группировкам и детальным записям, если они явно не перекрыты на более глубоком уровне.
Проанализируем самый правильный с точки зрения архитектуры СКД подход. Вместо того чтобы создавать несколько конфликтующих правил, мы можем воспользоваться механизмом флагов Области использования в настройках условного оформления. Это позволит применить поворот текста только к элементам шапки отчета.
Для реализации этого метода выполним следующие шаги:
ОриентацияТекста установим значение 90.В группировке и В иерархической группировке.В заголовке полей и В заголовке группировок.Такой подход говорит системе: «Применяй поворот на 90 градусов только тогда, когда рисуешь шапку или названия группировок, но игнорируй это правило при выводе самих значений в ячейках».
В некоторых сложных отчетах, особенно при наличии множества вложенных группировок или кросс-таблиц, флаги области использования могут отрабатывать не так, как ожидается. Рассмотрим альтернативный метод, который гарантированно решает задачу путем «перебивания» родительских настроек.
Разберем алгоритм действий:
90 градусов. В области использования устанавливаем значение Везде. Это обеспечит поворот для всех элементов отчета «по умолчанию».ОриентацияТекста равным 0. Область использования также указываем Везде. Так как настройки группировки имеют более высокий приоритет, чем настройки отчета, данные в строках «выровняются» обратно.Этот метод кажется более трудоемким, однако он позволяет гибко управлять визуализацией в тех случаях, когда платформенные механизмы разделения областей (заголовок/группировка) работают неоднозначно из-за сложной структуры компоновки.
Проанализируем ситуацию, когда поворот заголовка приводит к тому, что колонки становятся слишком узкими. Платформа 8.3 при вертикальном тексте пытается максимально сжать ширину колонки, ориентируясь на ширину символов. Чтобы отчет оставался читаемым, рекомендуется в том же правиле условного оформления, где задан поворот, устанавливать дополнительные параметры:
МинимальнаяШирина — задайте фиксированное значение (например, 10 или 15), чтобы колонки не «схлопывались».РазмещениеТекста — установим значение Переносить или Обрубать. Это предотвратит чрезмерное растягивание высоты шапки, если названия полей очень длинные.Иногда требуется настроить оформление динамически, непосредственно перед выводом отчета. Посмотрим на пример кода, который программно устанавливает поворот текста для заголовка конкретного поля в СКД:
// Получаем настройки компоновки данных
Настройки = КомпоновщикНастроек.Настройки;
// Добавляем новый элемент условного оформления
ЭлементОформления = Настройки.УсловноеОформление.Элементы.Добавить();
// Устанавливаем поворот на 90 градусов
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ОриентацияТекста", 90);
// Указываем область использования: только заголовки
ЭлементОформления.ИспользованиеВЗаголовкеПолей = ИспользованиеУсловногоОформления.Использовать;
ЭлементОформления.ИспользованиеВГруппировке = ИспользованиеУсловногоОформления.НеИспользовать;
// Выбираем поле, для которого применяется оформление
ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("СуммаОстаток");
ПолеОформления.Использование = Истина;
Использование программного метода позволяет избежать ошибок при визуальном редактировании схемы и дает возможность более точно управлять поведением отчета в зависимости от прав пользователя или выбранных параметров. Выясним, что ключевым объектом здесь является ИспользованиеУсловногоОформления, который позволяет жестко ограничить область действия настройки программным путем.
Мы рассмотрели два основных способа управления ориентацией текста в СКД. Первый способ (через области использования) является предпочтительным и «чистым». Второй способ (через перекрытие настроек на уровнях группировок) выступает в роли надежного решения для нестандартных ситуаций. Помните, что платформа 8.3 требует более дисциплинированного подхода к иерархии настроек, чем старые версии 8.1 и 8.2.