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