Как настроить произвольный порядок сортировки в СКД для кросс-таблиц и сложных запросов?

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

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

Метод 1. Создание синтетического поля в запросе

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

Проанализируем пример кода, где для каждого типа задачи жестко задается его вес:


ВЫБРАТЬ
    УтверждениеДоговоров.Организация КАК Организация,
    "Экспертиза" КАК ТипЗадачи,
    1 КАК ПорядокСортировки
ИЗ
    Документ.УтверждениеДоговоров КАК УтверждениеДоговоров

ОБЪЕДИНЕНИЕ ВСЕ

ВЫБРАТЬ
    РегистрацияДоговоров.Организация,
    "Регистрация",
    2
ИЗ
    Документ.РегистрацияДоговоров КАК РегистрацияДоговоров

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

Метод 2. Использование выражения упорядочивания в СКД

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

Разберем по шагам, как это настроить:

  1. Откроем схему компоновки данных и перейдем на закладку "Наборы данных".
  2. Найдем наше поле ТипЗадачи.
  3. В колонке "Выражение упорядочивания" нажмем на кнопку выбора и введем выражение на языке выражений СКД:

ВЫБОР 
    КОГДА ТипЗадачи = "Экспертиза" ТОГДА 1
    КОГДА ТипЗадачи = "Регистрация" ТОГДА 2
    КОГДА ТипЗадачи = "Не согласовано" ТОГДА 3
    ИНАЧЕ 4 
КОНЕЦ

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

Метод 3. Особенности сортировки в кросс-таблицах

Часто программисты замечают, что настройки сортировки в общем списке не влияют на колонки кросс-таблицы. Это происходит потому, что кросс-таблица в СКД имеет собственные настройки для каждой группировки. Если ваше поле ТипЗадачи используется как заголовок колонки, выполним следующие действия:

Перейдем на закладку "Настройки". В структуре отчета выберем конкретную группировку (например, колонки, где выводится ТипЗадачи). Ниже, в окне настроек этой группировки, перейдем на вкладку "Сортировка". Убедимся, что там добавлено поле ТипЗадачи. Если мы настроили выражение упорядочивания из Метода 2, то колонки выстроятся в нужном порядке.

Метод 4. Динамическая сортировка через дополнительные реквизиты

Если список задач или их приоритет может меняться пользователем без участия программиста, "зашивать" названия в код (как в Методе 2) — плохая практика. В этом случае лучше добавить к объекту (если это справочник или перечисление) дополнительный реквизит Порядок.

Проанализируем ситуацию: в справочнике "Типы задач" заведен числовой реквизит. Тогда в запросе мы просто получаем это поле:


ВЫБРАТЬ
    ТипыЗадач.Ссылка КАК ТипЗадачи,
    ТипыЗадач.Порядок КАК Порядок
ИЗ
    Справочник.ТипыЗадач КАК ТипыЗадач

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

Метод 5. Скрытие технических полей через "Ограничение доступности"

Если вы все же решили использовать отдельное поле для сортировки (как в Методе 1), вы можете столкнуться с тем, что пользователь увидит его в списке доступных полей и может случайно добавить в отчет. Чтобы этого избежать, используйте механизм ограничений:

  1. На закладке "Наборы данных" выберите поле ПорядокСортировки.
  2. Установите флажки в колонках "Ограничение поля" и "Ограничение группировки".
  3. Оставьте поле доступным только для сортировки.

Таким образом, поле будет невидимым для выбора в "Выбранные поля", но механизм упорядочивания сможет к нему обращаться.

Метод 6. Использование временных таблиц для сложной логики

В случаях, когда типов данных очень много или они формируются динамически, рекомендуется использовать временную таблицу соответствий. Это работает быстрее, чем громоздкие конструкции ВЫБОР КОГДА в запросе. Создадим временную таблицу с парами "Наименование — Индекс", а затем соединим её с основной выборкой по левому соединению. Это обеспечит стабильную производительность даже на больших объемах данных.

Рассмотрим пример формирования такой таблицы:


ВЫБРАТЬ "Экспертиза" КАК Имя, 1 КАК Индекс ПОМЕСТИТЬ ВТ_Порядок
ОБЪЕДИНЕНИЕ ВСЕ ВЫБРАТЬ "Регистрация", 2
;
ВЫБРАТЬ ОсновныеДанные.ТипЗадачи, ВТ_Порядок.Индекс ИЗ ОсновныеДанные ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Порядок ПО ОсновныеДанные.ТипЗадачи = ВТ_Порядок.Имя

Подводя итог, можно сказать, что для простых задач идеально подходит Метод 2 (выражение упорядочивания), а для систем, требующих гибкости управления пользователем — Метод 4 (использование реквизитов объектов). Всегда проверяйте настройки конкретных группировок в кросс-таблицах, так как именно там чаще всего скрывается причина "неработающей" сортировки.

← На главную