Почему в табличной части документа 1С не работает стандартная сортировка по колонке Номенклатура и как это исправить?

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

При работе с табличными частями документов в типовых и нетиповых конфигурациях на платформе 1С:Предприятие 8.3 (например, 1С:Управление торговлей 11, 1С:ERP или 1С:Комплексная автоматизация) пользователи и разработчики часто сталкиваются с ситуацией, когда по одним колонкам стандартная интерактивная сортировка работает штатно, а по другим — например, по колонке Номенклатура — кнопки сортировки в командной панели и контекстном меню становятся неактивными. Разберем детально, почему возникает такое поведение платформы и как восстановить возможность упорядочивания строк.

Причины недоступности интерактивной сортировки на управляемой форме

В управляемых формах табличная часть документа отображается в виде коллекции ДанныеФормыКоллекция. В отличие от динамических списков, где упорядочивание выполняется на стороне СУБД с помощью SQL-запроса, интерактивная сортировка строк табличной части выполняется платформой непосредственно в памяти клиента. Платформа блокирует кнопки сортировки в следующих случаях:

  1. Колонка находится внутри группы колонок. Если элемент формы помещен внутрь контейнера ГруппаКолонок (например, с группировкой «Вместе в колонке» или «В отдельной колонке с выделением» вместе с артикулом или характеристикой), платформа считает ячейку составной и отключает возможность сортировки по заголовку.
  2. Непрямой путь к данным (разыменование через точку). Сортировка доступна только для полей, путь к данным которых напрямую указывает на реквизит табличной части (например, Объект.Товары.Номенклатура). Если на форму выведено поле через точку (например, Объект.Товары.Номенклатура.Наименование) или временный реквизит формы, платформа не может применить стандартный механизм сортировки.
  3. Составной тип данных реквизита. Если реквизит табличной части имеет составной тип данных, клиентский механизм не может однозначно определить правила упорядочивания значений разной природы.
  4. Иерархический режим таблицы. Если табличная часть отображается в режиме дерева (например, при использовании группировок по наборам или заказам), сортировка блокируется платформой для сохранения целостности иерархии строк.
  5. Вид элемента управления. Для элементов вида ПолеНадписи или форматированных строк сортировка по умолчанию недоступна — элемент должен быть настроен как ПолеВвода.

Способ 1. Проверка структуры формы и вынесение колонки из группы

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

  1. Откроем форму документа и нажмем Еще — Изменить форму (либо откроем форму в конфигураторе).
  2. Найдем в дереве элементов таблицы Товары элемент, отвечающий за отображение номенклатуры.
  3. Проверим, не вложен ли этот элемент в родительский узел ГруппаКолонок. Если элемент сгруппирован с другими полями, вынесем его на верхний уровень таблицы, сделав самостоятельной колонкой.
  4. Проверим свойство ПутьКДанным: убедимся, что указан реквизит Объект.Товары.Номенклатура, а не путь через точку или отдельный реквизит формы.
  5. Убедимся, что свойство Вид установлено в значение ПолеВвода.

Способ 2. Программная сортировка табличной части на сервере

Если конфигурация находится на поддержке или дизайн формы требует сохранения сложных групп колонок, интерактивную сортировку можно реализовать программно через собственную команду. Поскольку тип ДанныеФормыКоллекция не содержит встроенного метода Сортировать(), выгрузим данные в ТаблицаЗначений, отсортируем их и загрузим обратно.

Проанализируем пример серверной процедуры, реализующей корректную сортировку ссылочных данных:


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

Разберем вызов этой процедуры из клиентского обработчика команды формы:


&НаКлиенте
Процедура КомандаСортироватьПоНоменклатуре(Команда)
    ОтсортироватьТабличнуюЧастьНаСервере("Номенклатура", "Возр");
КонецПроцедуры

Использование объекта СравнениеЗначений при сортировке ссылочных полей («Номенклатура») существенно повышает производительность на больших документах, исключая неявные повторные обращения платформы к базе данных за получением строковых представлений ссылок.

← На главную