В процессе разработки часто возникает задача упорядочить папки в группировках списка документов так, как того требует пользователь, а не в алфавитном порядке, который навязывает платформа 1С:Предприятие. Давайте разберем, почему возникает эта проблема и какие методы решения существуют в арсенале разработчика.
Когда мы настраиваем ДинамическийСписок и добавляем в него группировку, система автоматически перестраивает запрос к базе данных. Важно понимать, что ДинамическийСписок работает на основе Запрос, где поле группировки всегда участвует в операторе ORDER BY. Поскольку 1С сортирует данные по представлению (обычно это поле Наименование или Код), любой строковый или ссылочный тип данных будет отсортирован по алфавиту.
Попытки просто добавить реквизит Порядок в справочник, на который ссылается группировка, не дадут результата в ДинамическомСписке, так как он «видит» только ссылку и ее строковое представление, игнорируя ваши настройки сортировки внутри самого справочника.
Если вы хотите сохранить стандартный ДинамическийСписок и не переписывать форму на использование дерева значений, самым простым и рабочим вариантом является «обман» системы через префиксацию.
ПорядковыйНомер (число).ПередЗаписью формируйте Наименование с использованием числового префикса.Пример реализации логики в модуле объекта справочника:
Процедура ПередЗаписью(Отказ)
// Преобразуем числовой порядок в строку с ведущим нулем
Префикс = Формат(ПорядковыйНомер, "ЧЦ=3; ЧВН=; ЧГ=0");
Наименование = Префикс + "_ " + ИсходноеНаименование;
КонецПроцедуры
После такой манипуляции ДинамическийСписок будет сортировать группы по алфавиту, но благодаря числовым префиксам (001, 002, 003) порядок будет соответствовать именно тому, который задал пользователь.
Если префиксация не устраивает пользователей визуально, единственным надежным способом является замена ДинамическогоСписка на ДеревоЗначений. Этот метод дает полный контроль над порядком следования строк.
Разберем по шагам реализацию:
ДеревоЗначений.ПриСозданииНаСервере или ПриОткрытии программно выполните запрос к базе данных.Порядок из справочника.ДеревоЗначений данными из полученной выборки, программно создавая группы и добавляя в них строки документов.Рассмотрим пример формирования дерева в коде:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Группировка.Ссылка КАК Группа,
| Документ.Ссылка КАК Документ
|ИЗ
| Документ.ЗаказКлиента КАК Документ
|ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Группировки КАК Группировка
| ПО Документ.РеквизитГруппировки = Группировка.Ссылка
|УПОРЯДОЧИТЬ ПО
| Группировка.ПорядковыйНомер";
РезультатЗапроса = Запрос.Выполнить();
// Далее обходим результат и добавляем строки в ДеревоЗначений
Важное примечание: Использование ДеревоЗначений лишает вас некоторых стандартных преимуществ ДинамическогоСписка (например, стандартного поиска или автоматического обновления). Вам потребуется самостоятельно реализовать логику обновления данных при изменении документов в базе.
Анализируя ситуацию, мы видим, что стандартная платформа 1С жестко связывает группировку в ДинамическомСписке с представлением объекта. Чтобы добиться желаемого результата, используйте либо префиксацию (для простоты и сохранения стандартного функционала списка), либо ДеревоЗначений (для полной кастомизации интерфейса).
Помните, что попытки перехватить отрисовку группировок в ДинамическомСписке через серверные обработчики событий будут неэффективны, так как список управляется движком платформы, который работает непосредственно с базой данных через SQL-запросы.