Как реализовать сортировку по столбцу в таблице, созданной в 1С Конфигураторе?

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

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

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

1. Сортировка ТаблицыЗначений (ТЗ)

ТаблицаЗначений является одним из наиболее часто используемых программных объектов для временного хранения и обработки данных в 1С. Если вы создаёте таблицу данных непосредственно в коде, наполняете её строками и колонками, то для её сортировки существует специальный и очень удобный метод – Сортировать().

Метод Сортировать() позволяет нам упорядочить строки ТаблицыЗначений по одному или нескольким столбцам в нужном порядке. Важно помнить, что этот метод изменяет исходную таблицу. Если нам необходимо сохранить исходный порядок данных, мы всегда можем предварительно создать копию ТаблицыЗначений с помощью метода Скопировать().

Синтаксис метода Сортировать()

Синтаксис метода достаточно гибок:

ТаблицаЗначений.Сортировать(Колонки, ОбъектСравнения)

  1. Колонки: Это обязательный строковый параметр. В нём мы перечисляем имена колонок, по которым будет происходить сортировка.
  2. ОбъектСравнения: Этот параметр является необязательным и имеет тип СравнениеЗначений. Мы используем его, когда нужно реализовать нестандартную логику сравнения для значений не примитивных типов (например, для ссылок на объекты, когда мы хотим сравнивать не по их строковому представлению, а по какому-то другому реквизиту объекта). Если этот параметр не указан, сравнение не примитивных типов происходит по их строковому представлению, что не всегда соответствует нашим ожиданиям.

Примеры использования метода Сортировать() для ТаблицыЗначений

Представим, что у нас есть ТаблицаЗначений с данными о сотрудниках, содержащая колонки "Наименование", "Город", "Возраст".


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

ТЗ.Добавить().Заполнить(Новый Массив("Иванов", "Москва", 30));
ТЗ.Добавить().Заполнить(Новый Массив("Петров", "Санкт-Петербург", 25));
ТЗ.Добавить().Заполнить(Новый Массив("Сидоров", "Москва", 35));
ТЗ.Добавить().Заполнить(Новый Массив("Алексеев", "Самара", 28));

// Выведем исходные данные (для демонстрации)
// ...

// Пример 1: Сортировка по колонке "Наименование" по возрастанию (по умолчанию)
ТЗ.Сортировать("Наименование");

// Теперь ТЗ отсортирована по наименованию: Алексеев, Иванов, Петров, Сидоров

// Пример 2: Сортировка по колонке "Город" по возрастанию, затем по "Наименование" по убыванию // Сначала все сотрудники из Москвы, затем из Санкт-Петербурга, затем из Самары, // а внутри Москвы - сначала Сидоров, затем Иванов (т.к. "Наименование Убыв"). ТЗ.Сортировать("Город Возр, Наименование Убыв");

// Теперь ТЗ отсортирована:

// Москва, Сидоров, 35

// Москва, Иванов, 30

// Самара, Алексеев, 28

// Санкт-Петербург, Петров, 25

// Пример 3: Сортировка по колонке "Возраст" по убыванию ТЗ.Сортировать("Возраст Убыв");

Использование метода Сортировать() для ТаблицыЗначений — это самый прямой и эффективный способ программной сортировки данных, если мы работаем с временными данными в оперативной памяти.

2. Сортировка Динамического Списка

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

Пользовательская сортировка в режиме 1С:Предприятие

В режиме "1С:Предприятие" пользователи имеют возможность самостоятельно настраивать сортировку ДинамическогоСписка. Это можно сделать несколькими способами:

  1. Клик по заголовку колонки: Самый интуитивный способ – однократный клик по заголовку колонки устанавливает сортировку по возрастанию, повторный клик меняет её на сортировку по убыванию.
  2. Диалог отбора и сортировки: Пользователь может вызвать специальный диалог (обычно через контекстное меню или кнопку "Настройка списка") для более тонкой настройки порядка и отборов — для этого подойдёт панель быстрого отбора и фильтрации для управляемых форм.

Настройка начальной сортировки в Конфигураторе

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

  1. Откроем форму, на которой расположен ДинамическийСписок.
  2. В свойствах элемента формы, который представляет наш ДинамическийСписок, найдем раздел "Настройка списка".
  3. В этом разделе выберем "Порядок" и добавим нужные поля для сортировки, указав их направление (возрастание/убывание).

Программная сортировка Динамического Списка

Если нам необходимо программно управлять порядком сортировки Динамического Списка, например, в ответ на действия пользователя (кнопка "Сортировать по дате") или в определённый момент выполнения кода, мы можем использовать свойство Порядок элемента формы, связанного с динамическим списком, и его метод Установить().

Свойство Порядок объекта ДинамическийСписок представляет собой коллекцию элементов типа ЭлементПорядкаДинамическогоСписка. Метод Установить() позволяет нам задать порядок сортировки одной строкой, аналогично параметру Колонки метода Сортировать() для ТаблицыЗначений.

Пример программной сортировки динамического списка

Допустим, на нашей форме есть ДинамическийСписок с именем МойДинамическийСписок, который выводит информацию, например, о документах. Мы хотим отсортировать его сначала по номеру документа по возрастанию, а затем по дате по убыванию.


&НаСервере
Процедура ПриНажатииКнопкиСортировать(Команда)
    // Получаем элемент формы, связанный с динамическим списком
    ЭлементСписка = Элементы.МойДинамическийСписок;

    // Устанавливаем новый порядок сортировки
    // Синтаксис: "ИмяКолонки1 Направление1, ИмяКолонки2 Направление2"
    ЭлементСписка.Порядок.Установить("Номер Возр, Дата Убыв");

    // Если список был уже загружен, возможно, потребуется его обновить,
    // но обычно при изменении порядка платформа сама переформировывает список.
КонецПроцедуры

Этот подход очень эффективен, так как он изменяет параметры запроса к базе данных, а не сортирует данные после их получения, что минимизирует нагрузку на клиент и сервер.

3. Сортировка Табличной Части (в управляемых формах)

ТабличныеЧасти — это важная часть объектов метаданных, таких как документы, справочники или планы видов характеристик. Они предназначены для хранения коллекций однородных данных, связанных с основным объектом (например, список товаров в документе "Реализация товаров и услуг"). В управляемых формах ТабличныеЧасти отображаются на форме как табличные поля.

Пользователи могут сортировать табличные части стандартными средствами платформы (кликом по заголовку колонки), если это реквизиты, по которым платформа может построить индекс или выполнить сортировку без значительных затрат. Однако, когда речь заходит о программной сортировке или сортировке по вычисляемым колонкам, ситуация становится сложнее.

Индексирование для Табличных Частей

Для ускорения сортировки и повышения производительности работы с ТабличнымиЧастями очень полезно использовать признак индексирования для колонок, по которым часто производится сортировка или отбор. Мы можем установить флажок "Индексировать" для реквизитов табличной части в Конфигураторе. Это позволяет платформе более эффективно выполнять операции сортировки.

Программная реализация сортировки по вычисляемым колонкам

Одна из распространённых проблем возникает, когда нам нужно отсортировать ТабличнуюЧасть по колонке, которая не является её непосредственным реквизитом, а вычисляется программно (например, "СуммаБезНДС" на основе "Количество" и "Цена"). В таких случаях прямой вызов метода Сортировать() на самой табличной части невозможен, так как он предназначен для ТаблицыЗначений, а не для объектов метаданных. Попытка использования вызовет ошибку "Неверное имя колонки".

В этой ситуации мы применяем шаблон выгрузить - добавить вычисляемые колонки - отсортировать - загрузить обратно. Рассмотрим шаги:

  1. Выгрузка Табличной Части в ТаблицуЗначений: Сначала мы выгружаем все данные из нашей ТабличнойЧасти во временную ТаблицуЗначений с помощью метода Выгрузить().
  2. Добавление вычисляемых колонок: В этой временной ТаблицеЗначений мы добавляем новые колонки, которые нам нужны для сортировки, но которых нет в исходной табличной части (например, "СуммаБезНДС").
  3. Заполнение вычисляемых колонок: Мы обходим строки ТаблицыЗначений и заполняем значения в только что созданных вычисляемых колонках на основе данных из других колонок.
  4. Сортировка ТаблицыЗначений: Теперь, когда у нас есть все необходимые данные во временной ТаблицеЗначений, мы можем использовать уже знакомый нам метод Сортировать() для упорядочивания данных по нужным колонкам, включая вычисляемые.
  5. Загрузка отсортированных данных обратно: После успешной сортировки мы очищаем исходную ТабличнуюЧасть и загружаем в неё отсортированные данные из временной ТаблицыЗначений с помощью метода Загрузить().

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

Предположим, у нас есть табличная часть Товары с колонками Количество и Цена, и мы хотим отсортировать её по вычисляемой колонке Сумма (Количество * Цена).


&НаСервере
Процедура СортироватьТоварыПоСумме(Команда)
    // Получаем данные табличной части в ТаблицуЗначений
    Перем ТЗТовары;
    ТЗТовары = Объект.Товары.Выгрузить();

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

    // Заполняем вычисляемую колонку
    Для Каждого СтрокаТЗ Из ТЗТовары Цикл
        СтрокаТЗ.Сумма = СтрокаТЗ.Количество * СтрокаТЗ.Цена;
    КонецЦикла;

    // Сортируем ТаблицуЗначений по вычисляемой колонке "Сумма"
    ТЗТовары.Сортировать("Сумма Возр"); // Или "Сумма Убыв"

    // Очищаем исходную табличную часть
    Объект.Товары.Очистить();

    // Загружаем отсортированные данные обратно в табличную часть
    Объект.Товары.Загрузить(ТЗТовары);
КонецПроцедуры

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

Также можно создавать кнопки на форме, которые будут вызывать программный код для сортировки табличной части. Эти кнопки могут быть оформлены с иконками стрелок вверх/вниз для интуитивного понимания пользователем.

4. Роль индексации для повышения производительности

Индексы играют критически важную роль в производительности работы с базами данных, особенно когда речь идет о поиске, фильтрации и, конечно же, сортировке данных. Без правильно настроенных индексов даже самый простой запрос с сортировкой по большому набору данных может выполняться очень долго, приводя к замедлению работы всей системы — решить проблему поможет анализатор производительности запросов и планов выполнения.

Что такое индекс и зачем он нужен?

Представьте себе книгу без оглавления и алфавитного указателя. Чтобы найти нужную информацию, вам пришлось бы просматривать каждую страницу. Индекс в базе данных работает аналогично указателю: он представляет собой отдельную структуру данных, которая хранит значения одного или нескольких полей таблицы в упорядоченном виде, а также ссылки на соответствующие строки в основной таблице. Это позволяет СУБД (Системе Управления Базами Данных) очень быстро находить нужные данные без полного сканирования всей таблицы.

Основные преимущества индексов:

  1. Ускорение сортировки: Если мы часто сортируем данные по определённому полю, наличие индекса по этому полю позволяет СУБД использовать уже упорядоченную структуру индекса, а не выполнять ресурсоёмкую операцию сортировки каждый раз.
  2. Ускорение поиска и отбора: Запросы с условиями ГДЕ (WHERE), использующие индексированные поля, выполняются значительно быстрее.
  3. Уникальность данных: Индексы могут обеспечивать уникальность значений в одном или нескольких полях, предотвращая дублирование данных.

Индексы в 1С:Предприятии

В 1С индексы могут создаваться:

  1. Автоматически: Платформа 1С автоматически создает индексы для ключевых полей объектов метаданных (например, Код и Наименование справочников, поля типа Ссылка, измерения регистров).
  2. Явно разработчиком: Мы можем явно указать необходимость индексирования для реквизитов объектов метаданных (справочников, документов, регистров, табличных частей) в Конфигураторе.

Как настроить индексирование в Конфигураторе:

Для реквизитов (а также для измерений регистров, реквизитов табличных частей):

  1. Откроем нужный объект метаданных (например, справочник, документ).
  2. Перейдём на вкладку "Данные".
  3. Выберем нужный реквизит.
  4. В его свойствах найдем свойство "Индексировать".

Здесь нам доступны несколько вариантов:

Важные моменты при работе с индексами:

  1. Занимаемое место: Индексы — это отдельные структуры данных, которые занимают место на диске базы данных — для их контроля есть отчет для анализа структуры таблиц и индексов базы данных.
  2. Влияние на операции записи: Индексы могут замедлять операции записи (добавление, изменение, удаление строк). При каждой такой операции СУБД должна не только изменить основную таблицу, но и обновить все соответствующие индексы. Поэтому не следует создавать слишком много индексов без необходимости.
  3. Выбор полей для индексации: Индексировать следует поля, которые часто используются в условиях отбора (ГДЕ), для сортировки (УПОРЯДОЧИТЬ ПО) или для связывания таблиц (СОЕДИНЕНИЯ).
  4. Составные индексы: Если мы часто используем сортировку или отбор по комбинации полей (например, "Город" и "Наименование"), то имеет смысл создать составной индекс, который включает оба этих поля.

Таким образом, правильное проектирование и использование индексов является неотъемлемой частью создания высокопроизводительных решений в 1С, особенно когда мы стремимся обеспечить быструю и удобную сортировку данных для пользователя.

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

← На главную