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