При работе с табличными частями документов в типовых и нетиповых конфигурациях на платформе 1С:Предприятие 8.3 (например, 1С:Управление торговлей 11, 1С:ERP или 1С:Комплексная автоматизация) пользователи и разработчики часто сталкиваются с ситуацией, когда по одним колонкам стандартная интерактивная сортировка работает штатно, а по другим — например, по колонке Номенклатура — кнопки сортировки в командной панели и контекстном меню становятся неактивными. Разберем детально, почему возникает такое поведение платформы и как восстановить возможность упорядочивания строк.
В управляемых формах табличная часть документа отображается в виде коллекции ДанныеФормыКоллекция. В отличие от динамических списков, где упорядочивание выполняется на стороне СУБД с помощью SQL-запроса, интерактивная сортировка строк табличной части выполняется платформой непосредственно в памяти клиента. Платформа блокирует кнопки сортировки в следующих случаях:
ГруппаКолонок (например, с группировкой «Вместе в колонке» или «В отдельной колонке с выделением» вместе с артикулом или характеристикой), платформа считает ячейку составной и отключает возможность сортировки по заголовку.Объект.Товары.Номенклатура). Если на форму выведено поле через точку (например, Объект.Товары.Номенклатура.Наименование) или временный реквизит формы, платформа не может применить стандартный механизм сортировки.ПолеНадписи или форматированных строк сортировка по умолчанию недоступна — элемент должен быть настроен как ПолеВвода.Рассмотрим порядок действий для настройки формы, если колонка заблокирована из-за группировки или непрямого пути к данным. Выполнить проверку можно как в конфигураторе, так и в пользовательском режиме:
Товары элемент, отвечающий за отображение номенклатуры.ГруппаКолонок. Если элемент сгруппирован с другими полями, вынесем его на верхний уровень таблицы, сделав самостоятельной колонкой.Объект.Товары.Номенклатура, а не путь через точку или отдельный реквизит формы.ПолеВвода.Если конфигурация находится на поддержке или дизайн формы требует сохранения сложных групп колонок, интерактивную сортировку можно реализовать программно через собственную команду. Поскольку тип ДанныеФормыКоллекция не содержит встроенного метода Сортировать(), выгрузим данные в ТаблицаЗначений, отсортируем их и загрузим обратно.
Проанализируем пример серверной процедуры, реализующей корректную сортировку ссылочных данных:
&НаСервере
Процедура ОтсортироватьТабличнуюЧастьНаСервере(ИмяКолонки, Направление = "Возр")
// Выгружаем данные формы в таблицу значений
ТЗ = Объект.Товары.Выгрузить();
// Объект СравнениеЗначений позволяет корректно и быстро
// упорядочивать ссылочные типы данных без лишних обращений к базе
ОбъектСравнения = Новый СравнениеЗначений;
ТЗ.Сортировать(ИмяКолонки + " " + Направление, ОбъектСравнения);
// Загружаем отсортированные строки обратно в табличную часть
Объект.Товары.Загрузить(ТЗ);
КонецПроцедуры
Разберем вызов этой процедуры из клиентского обработчика команды формы:
&НаКлиенте
Процедура КомандаСортироватьПоНоменклатуре(Команда)
ОтсортироватьТабличнуюЧастьНаСервере("Номенклатура", "Возр");
КонецПроцедуры
Использование объекта СравнениеЗначений при сортировке ссылочных полей («Номенклатура») существенно повышает производительность на больших документах, исключая неявные повторные обращения платформы к базе данных за получением строковых представлений ссылок.