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