Как настроить правильную сортировку колонок в таблице СКД, если они сортируются по алфавиту?

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

При разработке отчетов в системе компоновки данных (СКД) разработчики часто сталкиваются с ситуацией, когда колонки таблицы, содержащие числа или интервалы (например, "1", "2", "11"), сортируются не по числовому значению, а по алфавиту. В результате получается нелогичный порядок: "1", "11", "2", "3". Это происходит потому, что СКД воспринимает эти значения как строковые. Рассмотрим подробно, как решить эту задачу несколькими способами, от простых настроек в конструкторе до использования вычисляемых полей и макетов.

Метод 1: Использование выражения упорядочивания в наборе данных

Это самый правильный и архитектурно верный способ решения проблемы. В СКД у каждого поля есть свойство, позволяющее указать, по какому правилу или полю его нужно сортировать, независимо от того, что видит пользователь. Разберем по шагам, как это настроить:

  1. Откроем конструктор схемы компоновки данных и перейдем на закладку Наборы данных.
  2. Найдем поле, которое используется в качестве колонок (например, Интервал или НомерКолонки).
  3. В колонке Выражение упорядочивания нажмем на кнопку выбора.
  4. Здесь мы можем прописать логику. Если в запросе у нас есть скрытое числовое поле, которое соответствует этой колонке, укажем его. Если нет, мы можем написать выражение преобразования прямо здесь:

ВЫРАЗИТЬ(ИмяПоля КАК ЧИСЛО)

Проанализируем ситуацию: теперь, когда СКД будет строить таблицу, она обратится к этому выражению для определения порядка вывода колонок, при этом в заголовке останется исходное строковое представление.

Метод 2: Настройка упорядочивания внутри группировки колонок

Часто программисты пытаются настроить общую сортировку отчета, но для таблиц в СКД это работает иначе. Сортировка колонок определяется настройками конкретной группировки. Выполним следующие действия:

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

Рассмотрим пример: если наше поле колонок содержит текст "свыше 10 дн.", мы можем добавить в запрос поле КоличествоДней (числовое) и в настройках группировки колонок указать сортировку именно по этому числовому полю.

Метод 3: Использование вычисляемых полей для сложной логики

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

На закладке Вычисляемые поля добавим новое поле, назовем его, например, ПорядокКолонок. В выражении напишем код, который извлекает число из строки. Если мы точно знаем структуру строки, можно использовать функции СТРЗАМЕНИТЬ, ПОДСТРОКА или обратиться к функции общего модуля:


// Пример выражения, если нужно убрать текст и оставить число
ВЫРАЗИТЬ(СтрЗаменить(ИмяПоля, "свыше ", "") КАК ЧИСЛО)

После создания такого поля, вернемся к методу 1 или 2 и укажем это вычисляемое поле в качестве критерия для сортировки. Обратите внимание, что само вычисляемое поле не обязательно выводить в отчет — оно может служить исключительно технической цели.

Метод 4: Трюк с лидирующими нулями и условным оформлением

Рассмотрим более простой, но "визуальный" способ. Если мы приведем все строковые значения к одной длине, добавив нули в начало (например, "01", "02", "11"), то алфавитная сортировка автоматически станет эквивалентна числовой. Однако пользователю видеть нули не всегда приятно.

Посмотрим, как это реализовать красиво:

  1. В запросе или вычисляемом поле формируем значение с нулями: "0" + ИмяПоля (с проверкой длины).
  2. В настройках отчета переходим в Условное оформление.
  3. Добавляем новый элемент оформления.
  4. В качестве оформляемого поля выбираем нашу колонку.
  5. В свойстве Текст прописываем выражение или формат, который будет скрывать лидирующие нули при выводе.

Хотя этот метод кажется менее элегантным, он выручает, когда нет возможности менять структуру запроса или использовать сложные макеты.

Метод 5: Использование макета ячейки и функций общего модуля

Для самых сложных случаев, когда логика определения порядка и представления сильно разнится, проанализируем вариант с макетом. Мы можем создать макет группировки для колонок. В ячейке макета можно указать параметр и в его свойствах прописать выражение, вызывающее функцию общего модуля.


// В макете ячейки для параметра "Заголовок"
ОбщийМодульОтчетов.ПолучитьПредставлениеИнтервала(ИмяПоля)

В этом случае мы можем хранить в самом поле СКД "чистые" числа для идеальной сортировки, а в макете "на лету" превращать их в красивые строки типа "Интервал: от 1 до 5 дней". СКД сначала отсортирует данные как числа, а затем применит макет для отрисовки заголовков.

Метод 6: Сортировка по длине строки (быстрый способ)

Проанализируем ситуацию, когда нам нужно быстро исправить порядок "1, 11, 2" без создания новых полей. В настройках упорядочивания группировки можно добавить два уровня сортировки:

  1. Первый уровень: выражение ДЛИНА(ИмяПоля) по возрастанию.
  2. Второй уровень: само поле ИмяПоля по возрастанию.

В таком случае строка "2" (длина 1) всегда будет выше строки "11" (длина 2), и проблема будет решена минимальными усилиями.

Подведем итог: для решения проблемы сортировки колонок в СКД лучше всего использовать Выражение упорядочивания в настройках набора данных или явно указывать поле сортировки в настройках Группировки. Использование вычисляемых полей и функций общих модулей позволяет реализовать любую, даже самую сложную логику расположения столбцов в отчете.

← На главную