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

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

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

Понимание природы проблемы

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

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

Решение 1: Префиксация наименований

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

  1. Создайте в справочнике группировок реквизит ПорядковыйНомер (число).
  2. При записи элемента справочника или в процедуре ПередЗаписью формируйте Наименование с использованием числового префикса.

Пример реализации логики в модуле объекта справочника:


Процедура ПередЗаписью(Отказ)
    // Преобразуем числовой порядок в строку с ведущим нулем
    Префикс = Формат(ПорядковыйНомер, "ЧЦ=3; ЧВН=; ЧГ=0");
    Наименование = Префикс + "_ " + ИсходноеНаименование;
КонецПроцедуры

После такой манипуляции ДинамическийСписок будет сортировать группы по алфавиту, но благодаря числовым префиксам (001, 002, 003) порядок будет соответствовать именно тому, который задал пользователь.

Решение 2: Использование дерева значений

Если префиксация не устраивает пользователей визуально, единственным надежным способом является замена ДинамическогоСписка на ДеревоЗначений. Этот метод дает полный контроль над порядком следования строк.

Разберем по шагам реализацию:

  1. Добавьте на форму реквизит с типом ДеревоЗначений.
  2. В процедуре ПриСозданииНаСервере или ПриОткрытии программно выполните запрос к базе данных.
  3. В запросе обязательно соедините документы с вашим справочником группировок и выполните сортировку по полю Порядок из справочника.
  4. Заполните ДеревоЗначений данными из полученной выборки, программно создавая группы и добавляя в них строки документов.

Рассмотрим пример формирования дерева в коде:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |    Группировка.Ссылка КАК Группа,
    |    Документ.Ссылка КАК Документ
    |ИЗ
    |    Документ.ЗаказКлиента КАК Документ
    |ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Группировки КАК Группировка
    |    ПО Документ.РеквизитГруппировки = Группировка.Ссылка
    |УПОРЯДОЧИТЬ ПО
    |    Группировка.ПорядковыйНомер";

РезультатЗапроса = Запрос.Выполнить();
// Далее обходим результат и добавляем строки в ДеревоЗначений

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

Итоговые рекомендации

Анализируя ситуацию, мы видим, что стандартная платформа 1С жестко связывает группировку в ДинамическомСписке с представлением объекта. Чтобы добиться желаемого результата, используйте либо префиксацию (для простоты и сохранения стандартного функционала списка), либо ДеревоЗначений (для полной кастомизации интерфейса).

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

← На главную