Как настроить произвольную сортировку колонок и скрыть итоги в отчете на СКД при использовании внешней таблицы значений?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке отчетов на Системе Компоновки Данных (СКД) с использованием внешних наборов данных (например, Таблицы Значений) часто возникает задача вывести колонки в строго определенном порядке, отличном от алфавитного. При этом стандартные механизмы группировки кросс-таблиц могут добавлять ненужные итоговые колонки, которые портят внешний вид отчета.

Разберем подробно ситуацию, когда данные передаются в схему программно, и рассмотрим несколько способов решения проблем с сортировкой и отображением итогов.

Суть проблемы

Представим, что мы формируем таблицу значений (ТЗ) с начислениями сотрудника. У нас есть колонки: Сотрудник, Показатель (например, "Оклад", "Премия", "Надбавка") и Сумма. В отчете мы хотим видеть кросс-таблицу, где в строках — сотрудники, а в колонках — показатели.

По умолчанию СКД сортирует группировки (колонки) по наименованию. В итоге порядок будет таким: "Надбавка", "Оклад", "Премия" (по алфавиту). Нам же нужно: "Оклад", "Премия", "Надбавка".

Попытка разделить показатели на разные поля (например, Показатель и Показатель1) приводит к появлению промежуточных итогов, которые делают отчет громоздким и пустым в некоторых ячейках.

Решение 1. Произвольная сортировка через дополнительное поле

Самый надежный способ управления порядком вывода — добавить в источник данных числовое поле для сортировки. Рассмотрим этот процесс пошагово.

Шаг 1. Подготовка данных

В нашу таблицу значений необходимо добавить колонку, отвечающую за вес (порядок) показателя. Назовем её ПорядокСортировки.


ТЗВывод = Новый ТаблицаЗначений;
ТЗВывод.Колонки.Добавить("Сотрудник", Новый ОписаниеТипа("Строка"));
ТЗВывод.Колонки.Добавить("Показатель", Новый ОписаниеТипа("Строка"));
ТЗВывод.Колонки.Добавить("ПорядокСортировки", Новый ОписаниеТипа("Число")); // Добавляем поле для сортировки
ТЗВывод.Колонки.Добавить("Сумма", Новый ОписаниеТипа("Число"));

// Заполняем данные с указанием порядка
НоваяСтрока = ТЗВывод.Добавить();
НоваяСтрока.Сотрудник = "Ирина Николаевна";
НоваяСтрока.Показатель = "Оклад";
НоваяСтрока.ПорядокСортировки = 1; // Оклад должен быть первым
НоваяСтрока.Сумма = 100;

НоваяСтрока = ТЗВывод.Добавить();
НоваяСтрока.Сотрудник = "Ирина Николаевна";
НоваяСтрока.Показатель = "Премия";
НоваяСтрока.ПорядокСортировки = 2; // Премия второй
НоваяСтрока.Сумма = 50;

НоваяСтрока = ТЗВывод.Добавить();
НоваяСтрока.Сотрудник = "Ирина Николаевна";
НоваяСтрока.Показатель = "Надбавка";
НоваяСтрока.ПорядокСортировки = 3; // Надбавка третьей
НоваяСтрока.Сумма = 10;

Шаг 2. Настройка Набора Данных в СКД

Это самый важный момент, который часто упускают (именно поэтому сортировка может не работать, даже если поле добавлено в ТЗ). Простого добавления поля в набор данных недостаточно.

  1. В схеме компоновки данных перейдите на вкладку Наборы данных.
  2. Добавьте поле ПорядокСортировки в описание полей набора.
  3. Найдите поле Показатель (то поле, которое будет выводиться в заголовках колонок).
  4. В колонке Выражение упорядочивания для поля Показатель напишите: ПорядокСортировки.

Теперь СКД знает: везде, где используется поле Показатель, его нужно сортировать не по самому значению ("Оклад", "Премия"...), а по соответствующему ему числу из поля ПорядокСортировки.

Шаг 3. Настройка группировок

На вкладке Настройки:

  1. Добавьте группировку колонок по полю Показатель.
  2. Убедитесь, что в настройках этой группировки на вкладке "Сортировка" стоит "Авто" или явно выбрано поле Показатель. Благодаря настройке на Шаге 2, сортировка произойдет корректно (1 -> 2 -> 3).

Решение 2. Скрытие "лишних" итогов

Если вы всё же решили использовать разные поля для колонок или столкнулись с ненужными итогами в кросс-таблице, существует несколько способов их убрать.

Способ А: Условное оформление

Это визуальный способ скрыть цифры. Мы можем сделать текст в ячейках итогов "невидимым" (цвета фона).

  1. Перейдите на вкладку Настройки -> Условное оформление.
  2. Добавьте новый элемент.
  3. Оформление: Установите цвет текста = Белый (или цвет фона отчета). В параметре "Текст" можно поставить пробел, но это работает не всегда корректно с числами.
  4. Условие: Здесь нужно "поймать" итоговую запись. Обычно это делается через проверку уровня группировки или через системные поля. Например, если это общие итоги, можно использовать условие СистемныеПоля.УровеньГруппировки = 0 (для колонок). Либо, если вы используете разные поля показателей, условие может быть Показатель Заполнено И Показатель1 Не Заполнено (зависит от структуры).
  5. Оформляемые поля: Выберите ресурсы, которые нужно скрыть (например, Сумма).

Способ Б: Отключение расчета ресурсов

Более правильный, "архитектурный" способ. Можно указать СКД, для каких группировок нужно считать ресурсы, а для каких — нет.

  1. Перейдите на вкладку Ресурсы в схеме компоновки.
  2. В колонке Рассчитывать по... напротив поля Сумма снимите галочку с "Общих итогов" или конкретной группировки, если она там есть.
  3. Если нужной группировки в списке нет, можно добавить поле Сумма в ресурсы дважды: один раз для группировки "Сотрудник", второй раз для группировки "Показатель", и не добавлять для "Общих итогов".

Решение 3. Изменение структуры данных (Pivot)

Если набор показателей фиксирован (или их конечное небольшое количество), лучшим решением будет отказаться от универсальной кросс-таблицы ("Сотрудник" - "Показатель" - "Сумма") и подготовить "плоскую" таблицу еще на этапе формирования ТЗ.

Вместо строк:
Иванов | Оклад | 100
Иванов | Премия | 50

Сформируем структуру:
Иванов | 100 (Колонка Оклад) | 50 (Колонка Премия)

Код трансформации:


ТЗПлоская = Новый ТаблицаЗначений;
ТЗПлоская.Колонки.Добавить("Сотрудник");
ТЗПлоская.Колонки.Добавить("СуммаОклад");
ТЗПлоская.Колонки.Добавить("СуммаПремия");
ТЗПлоская.Колонки.Добавить("СуммаНадбавки");

// Пример заполнения
НоваяСтрока = ТЗПлоская.Добавить();
НоваяСтрока.Сотрудник = "Ирина Николаевна";
НоваяСтрока.СуммаОклад = 100;
НоваяСтрока.СуммаПремия = 50;
НоваяСтрока.СуммаНадбавки = 10;

Преимущества такого подхода:

Резюме

Если вам необходимо сохранить динамическую структуру (количество колонок может меняться), используйте Решение 1 с полем сортировки и обязательно пропишите Выражение упорядочивания в наборе данных.

Если колонки известны заранее (Оклад, Премия, Надбавка), лучше используйте Решение 3, трансформировав таблицу значений в плоский вид перед передачей в СКД. Это избавит вас от большинства проблем с макетированием.

← На главную