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