Почему не работает сортировка в табличной части документа и как ее настроить?

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

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

В чем причина такого поведения платформы

Проанализируем архитектурные особенности платформы 1С:Предприятие 8.3:

  1. Различие между динамическим списком и табличной частью. Динамический список предназначен исключительно для отображения данных из базы данных. Щелчок по шапке перестраивает запрос к СУБД с конструкцией упорядочивания. Табличная часть на форме связана с объектом ДанныеФормыКоллекция. Физический порядок строк в документе имеет смысловое значение: от него зависят алгоритмы списания партий (FIFO/LIFO), распределение сумм, расчет накопительных итогов и порядок строк в печатных формах. Случайное изменение порядка строк простым нажатием на заголовок колонки могло бы нарушить логику проведения документа.
  2. Индексация реквизитов не включает сортировку в интерфейсе. Установка свойства Индексировать у реквизита табличной части в дереве метаданных предназначена исключительно для создания индекса в СУБД. Это ускоряет выполнение запросов с отборами и поиском, но никак не влияет на визуальное поведение элементов интерфейса в управляемой форме.
  3. Особенности сортировки ссылочных данных. Если колонка содержит ссылочный тип (например, ссылку на справочник контрагентов или номенклатуры), стандартная сортировка упорядочивает записи по уникальному идентификатору (UUID ссылки), а не по строковому представлению наименования.

Способ 1. Использование стандартного меню команд таблицы

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

  1. Выделим нужную строку и колонку в табличной части документа.
  2. Нажмем кнопку Еще (в некоторых версиях интерфейса — «Все действия») в командной панели таблицы.
  3. В выпадающем меню выберем пункт Сортировать по возрастанию или Сортировать по убыванию.

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

Способ 2. Программная сортировка на сервере через объект документа

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


&НаСервере
Процедура ОтсортироватьТабличнуюЧастьНаСервере()
    
    // Преобразуем данные формы в объект документа
    ДокументОбъект = РеквизитФормыВЗначение("Объект");
    
    // Выполняем сортировку по колонкам (например, по реквизитам Номенклатура и Вес)
    ДокументОбъект.Товары.Сортировать("Номенклатура Возр, Вес Убыв");
    
    // Возвращаем измененный объект обратно в данные формы
    ЗначениеВРеквизитФормы(ДокументОбъект, "Объект");
    
КонецПроцедуры

Важный нюанс: метод Сортировать() упорядочивает ссылочные поля по значению ссылки (UUID), что приведет к визуально хаотичному порядку наименований на экране.

Способ 3. Сортировка ссылочных данных по наименованию через запрос

Если в табличной части присутствуют ссылки на справочники и требуется отсортировать строки именно по наименованию (в алфавитном порядке), разберем по шагам решение с использованием выгрузки во временную таблицу или в параметры запроса.


&НаСервере
Процедура ОтсортироватьПоНаименованиюНаСервере()
    
    // Выгружаем табличную часть формы в таблицу значений
    ТаблицаТоваров = Объект.Товары.Выгрузить();
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   ТЧ.*
        |ИЗ
        |   &ТабЧасть КАК ТЧ
        |УПОРЯДОЧИТЬ ПО
        |   ТЧ.Клиент.Наименование ВОЗР,
        |   ТЧ.Вес ВОЗР";
        
    Запрос.УстановитьПараметр("ТабЧасть", ТаблицаТоваров);
    
    // Загружаем результат упорядочивания обратно в табличную часть формы
    Объект.Товары.Загрузить(Запрос.Выполнить().Выгрузить());
    
КонецПроцедуры

Посмотрим на результат выполнения: обращение через точку к реквизиту Клиент.Наименование в секции УПОРЯДОЧИТЬ ПО позволяет базе данных корректно выстроить строки по алфавиту для пользователя, а дополнительное поле Вес упорядочит числовые значения внутри одинаковых клиентов.

← На главную