Как реализовать сортировку таблицы значений на форме в 1С

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

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

Почему не работает клик по шапке и какие есть альтернативы

Для начала проанализируем ситуацию: объект ТаблицаЗначений на форме — это не просто таблица в базе данных, это временный набор данных в памяти. Платформа 1С резервирует функционал сортировки по клику для Динамических списков. Для обычных таблиц значений разработчику приходится реализовывать этот механизм "вручную" или использовать встроенные команды командной панели.

Мы рассмотрим три основных подхода:

  1. Использование Динамического списка (наиболее профессиональный подход).
  2. Программная реализация кнопок сортировки в командной панели.
  3. Использование стандартных команд платформы (сортировка по текущей колонке).

Вариант 1: Переход на Динамический список

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

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

Для реализации программной настройки порядка в динамическом списке можно использовать следующий код:


&НаКлиенте
Процедура НастроитьПорядокСписка()
    Список.Порядок.Элементы.Очистить();
    НовыйПорядок = Список.Порядок.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных"));
    
    // Указываем направление сортировки
    НовыйПорядок.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Возр;
    
    // Указываем поле, по которому сортируем (например, Код или Сумма)
    НовыйПорядок.Поле = Новый ПолеКомпоновкиДанных("Код");
    НовыйПорядок.Использование = Истина;
    НовыйПорядок.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный;
КонецПроцедуры

Вариант 2: Программная сортировка через метод Сортировать()

Если переделывать таблицу в динамический список нецелесообразно, разберем, как сделать сортировку через кнопки. Мы можем создать в командной панели таблицы кнопки "По сумме", "По дате" или одну универсальную кнопку "Сортировать".

Проанализируем пример кода, который позволяет сортировать таблицу по текущей выделенной колонке. Это очень удобно: пользователь встает курсором в любую ячейку нужной колонки и нажимает кнопку сортировки.


&НаКлиенте
Процедура КомандаСортировка(Команда)
    // Получаем текущий элемент (колонку), на которой стоит курсор
    ТекущийЭлементТаблицы = Элементы.СписокРабот.ТекущийЭлемент;
    
    Если ТекущийЭлементТаблицы = Неопределено Тогда
        Возврат;
    КонецЕсли;

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

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

Важный нюанс: Обратите внимание, что на управляемых формах переменная таблицы является типом ДанныеФормыКоллекция. У этого типа отсутствует метод Сортировать(). Чтобы выполнить операцию, мы обязательно используем связку РеквизитФормыВЗначение и ЗначениеВРеквизитФормы.

Вариант 3: Стандартные команды платформы

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

  1. Откройте форму в конфигураторе.
  2. Выберите элемент управления "Таблица".
  3. В свойствах найдите пункт "Состав команд".
  4. Включите команды Сортировать по возрастанию и Сортировать по убыванию.

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

Тонкости и оптимизация: Индексация данных

Рассмотрим ситуацию, когда в таблице значений тысячи строк. Простая сортировка может вызвать кратковременное зависание интерфейса. Чтобы этого избежать, проанализируем механизм индексации. Если вы знаете, что по определенным колонкам (например, "Артикул" или "Контрагент") будет часто проводиться сортировка или поиск, их нужно проиндексировать в момент создания таблицы значений в коде:


// Пример индексации при заполнении таблицы
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число"));
ТЗ.Колонки.Добавить("ДатаДокумента", Новый ОписаниеТипов("Дата"));

// Добавляем индексы для ускорения сортировки и поиска
ТЗ.Индексы.Добавить("Сумма");
ТЗ.Индексы.Добавить("ДатаДокумента");

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

Сортировка по нескольким полям

Метод Сортировать() позволяет выполнять многоуровневую сортировку. Например, если мы хотим, чтобы внутри одного контрагента документы шли по дате, мы можем передать строку с именами полей через запятую:

ТЗ.Сортировать("Контрагент ВОЗР, ДатаДокумента УБЫВ");

Это особенно полезно при формировании сложных отчетов или реестров на форме, где важна логическая последовательность данных. Помните также о том, что сортировка по ссылочным полям (например, по колонке со справочником "Номенклатура") выполняется по внутреннему идентификатору (UUID), а не по наименованию. Если вам нужна алфавитная сортировка по названиям, рекомендуется добавить в таблицу скрытую текстовую колонку с представлением объекта и сортировать именно по ней.

Подводя итог, мы выяснили, что хотя прямого способа "кликнуть по шапке" для ТаблицыЗначений в 1С не существует, у разработчика есть богатый арсенал инструментов для имитации этого поведения: от мощных Динамических списков до простых стандартных команд в Командной панели.

← На главную