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