Как установить произвольный порядок группировок в динамическом списке или СКД

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

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

В этой статье мы разберем профессиональные способы настройки произвольной сортировки группировок, которые позволяют сохранить «чистоту» визуального представления и обеспечить требуемый порядок следования элементов.

Метод 1. Использование свойства «Выражение упорядочивания»

Это наиболее правильный и гибкий механизм, заложенный в систему компоновки данных (СКД) и динамические списки. Рассмотрим ситуацию, когда у нас есть поле ПериодТекстом, содержащее значения «Сегодня», «Завтра» и т.д. Чтобы система сортировала эти группы правильно, нам не нужно менять само текстовое значение.

Проанализируем шаги настройки:

  1. В схеме компоновки данных или в настройках запроса динамического списка выделите поле, по которому осуществляется группировка.
  2. Найдите свойство «Выражение упорядочивания».
  3. Вместо стандартного значения (самого поля) впишите выражение ВЫБОР. Например:

ВЫБОР
    КОГДА Когда = "Вчера" ТОГДА 1
    КОГДА Когда = "Сегодня" ТОГДА 2
    КОГДА Когда = "Завтра" ТОГДА 3
    ИНАЧЕ 4
КОНЕЦ

Результат: В интерфейсе пользователь будет видеть привычные слова, но платформа при построении группировок будет использовать числовые веса, расставляя группы в нужном нам порядке.

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

Часто разработчики сталкиваются с ситуацией, когда общая сортировка списка настроена, но «шапки» групп все равно стоят не на своих местах. Разберем причину: в 1С настройки порядка для всего отчета/списка и настройки порядка для конкретной группировки — это разные сущности.

Рассмотрим алгоритм действий:

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

Важно помнить: если мы сортируем список по полю Индекс, но оно не выведено в выбранные поля, система может его игнорировать. Для этого в наборе данных для поля Индекс необходимо установить флаг «Использовать всегда».

Метод 3. Сортировка по реальной дате с использованием «Выражения представления»

Если ваша группировка основана на времени, эффективнее всего оперировать типом Дата, а не строками. Выясним, как это реализовать, чтобы вместо «01.01.2023» пользователь видел «Сегодня».

В запросе динамического списка вычислим реальную дату для каждой строки. Даже если все записи за «Сегодня» имеют разное время, приведем их к началу дня с помощью функции НАЧАЛОПЕРИОДА. Далее, в настройках поля СКД:


ВЫБОР 
    КОГДА НАЧАЛОПЕРИОДА(ДатаСобытия, ДЕНЬ) = НАЧАЛОПЕРИОДА(&ТекущаяДата, ДЕНЬ) ТОГДА "Сегодня"
    КОГДА НАЧАЛОПЕРИОДА(ДатаСобытия, ДЕНЬ) = ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ТекущаяДата, ДЕНЬ), ДЕНЬ, 1) ТОГДА "Завтра"
    ИНАЧЕ ФОРМАТ(ДатаСобытия, "ДЛФ=D")
КОНЕЦ

При таком подходе система «думает», что сортирует даты (что она делает превосходно), а пользователь видит дружелюбные текстовые названия. Это исключает любые проблемы с алфавитным порядком.

Метод 4. Исправление проблемы строковой сортировки «1, 10, 11, 2»

Если вы все же решили использовать строковые индексы в начале наименований, вы можете столкнуться с компьютерной сортировкой строк. Проанализируем, почему «10» идет раньше, чем «2». Система сравнивает символы поочередно: «1» меньше «2», поэтому «10» оказывается выше.

Чтобы решить эту проблему без изменения логики, применим один из двух подходов:

  1. Дополнение нулями: Используйте индексы «01», «02», ... «10», «11». Тогда сортировка будет корректной.
  2. Приведение к числу в запросе: Если индекс хранится в строке, в выражении упорядочивания используйте ВЫРАЗИТЬ(Индекс КАК ЧИСЛО), если это позволяет тип данных, или предварительно преобразуйте поле в числовой формат в запросе.

Метод 5. Использование перечислений (Enums)

Если категории группировки фиксированы на уровне конфигурации, рекомендуется использовать Перечисления. Посмотрим на особенность их работы: в 1С перечисления сортируются не по имени и не по синониму, а по их порядку в дереве метаданных конфигуратора.

Если вам нужно изменить порядок групп «Срочно», «Нормально», «Низкий приоритет», просто откройте конфигуратор и с помощью стрелок переместите значения перечисления в нужном порядке. Динамический список подхватит эти изменения автоматически, и группировка выстроится соответствующим образом без написания дополнительного кода.

Резюме по работе с динамическими списками

Для того чтобы ваша произвольная сортировка заработала в динамическом списке, всегда проверяйте следующие моменты:

1. Включена ли колонка-индекс в запрос.

2. Установлен ли для этой колонки признак «Использовать всегда» в схеме запроса динамического списка.

3. Настроена ли сортировка в настройках списка на закладке «Порядок» (проверьте как основной порядок, так и порядок внутри группировок).

Используя эти методы, вы сможете создавать профессиональные и удобные интерфейсы, где данные расположены в естественном для пользователя порядке, не прибегая к визуальным «костылям» в виде цифр в заголовках.

← На главную