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