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