Как отсортировать табличную часть документа в 1С 7.7 по произвольному критерию?

Программист 1С v7.7
← На главную

В разработке на платформе 1С:Предприятие 7.7 часто возникает задача упорядочивания строк в табличной части (ТЧ) документа. Трудность заключается в том, что стандартная сортировка по алфавиту или коду не всегда подходит, особенно если порядок строк строго регламентирован законодательством или внутренними правилами компании. Рассмотрим подробно, как реализовать «особую» сортировку, не перегружая интерфейс лишними данными.

Метод 1: Использование скрытой технической колонки

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

Для начала нам необходимо добавить в структуру табличной части документа новую колонку, например, с идентификатором Порядок (тип «Число»). Чтобы этот реквизит не смущал пользователя и не выводился на печать, мы установим его видимость в значение «0». Проанализируем, как это реализовать в модуле формы документа в процедуре ПриОткрытии:

Форма.Порядок.Видимость(0);

Когда табличная часть заполняется (например, при нажатии кнопки «Заполнить» или выборе на основании), мы программно вычисляем «вес» для каждой позиции номенклатуры. Рассмотрим пример алгоритма:

  1. В справочнике «Номенклатура» создаем дополнительный реквизит ВесДляСправки.
  2. При добавлении строки в документ копируем это значение в нашу скрытую колонку Порядок.
  3. Вызываем метод СортироватьСтроки("Порядок+").

Важный нюанс: Использование знака «+» после имени колонки в методе СортироватьСтроки означает сортировку по возрастанию, а «-» — по убыванию. Это позволяет мгновенно упорядочить строки документа в соответствии с требованиями.

Метод 2: Сортировка через объект «Таблица Значений»

Если мы не хотим изменять структуру метаданных документа и добавлять лишние колонки, мы можем воспользоваться мощным механизмом работы с объектом ТаблицаЗначений. Этот метод позволяет произвести все расчеты «в памяти» и вернуть уже отсортированные данные обратно в табличную часть.

Выясним, как выглядит правильный алгоритм программной обработки строк:


// Создаем объект Таблица Значений
ТЗ = СоздатьОбъект("ТаблицаЗначений");

// Выгружаем текущую табличную часть документа в ТЗ
ВыгрузитьТабличнуюЧасть(ТЗ);

// Добавляем колонку для весового коэффициента, если её нет в ТЧ
ТЗ.НоваяКолонка("Вес", "Число");

// Проходим циклом по всем строкам и вычисляем приоритет
ТЗ.ВыбратьСтроки();
Пока ТЗ.ПолучитьСтроку() = 1 Цикл
    // Предположим, приоритет хранится в справочнике Номенклатура
    ТЗ.Вес = ТЗ.Номенклатура.ПорядокПечати;
КонецЦикла;

// Сортируем ТЗ по вычисленному весу
ТЗ.Сортировать("Вес+");

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

Важное предостережение: Метод ЗагрузитьТабличнуюЧасть полностью перезаписывает содержимое документа. Если в ТЗ не попадут какие-то служебные колонки, которые были в документе, данные в них могут быть утеряны. Поэтому всегда рекомендуется сначала выполнять ВыгрузитьТабличнуюЧасть, чтобы сохранить структуру данных.

Метод 3: Сортировка только в печатной форме

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

Проанализируем ситуацию: пользователь нажимает кнопку печати. В этот момент мы подготавливаем данные:

  1. Выгружаем ТЧ в ТаблицаЗначений.
  2. Добавляем необходимые колонки из связанных справочников.
  3. Сортируем ТЗ по нужным критериям (например, сначала по категории, потом по весу, потом по наименованию).
  4. В цикле вывода секций печатной формы используем данные не из документа, а из нашей отсортированной ТЗ.

Пример кода для многоуровневой сортировки:

ТЗ.Сортировать("Категория+, Приоритет-, Наименование+");

Метод 4: Использование внешних компонент (FormEx и 1С++)

Для продвинутых разработчиков, работающих с высоконагруженными системами на 1С 7.7, стандартных средств может быть недостаточно. Рассмотрим применение внешних библиотек.

Компонента FormEx: Позволяет расширить возможности стандартного табличного поля. С её помощью можно реализовать интерактивную сортировку кликом по заголовку колонки, что штатно в версии 7.7 недоступно. Она умеет визуально перехватывать события формы и изменять порядок отображения строк без физической перезаписи данных в ТЗ документа.

Компонента 1С++: Предоставляет объект ИндексированнаяТаблица. Если документ содержит тысячи строк, стандартная ТаблицаЗначений может работать медленно при частых сортировках. ИндексированнаяТаблица работает на порядок быстрее и позволяет строить сложные индексы для мгновенного получения отсортированных данных.

Практические советы по хранению весов

При реализации «законного порядка» товаров в справочнике часто используют систему числовых коэффициентов. Разберем, как лучше их задавать:

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

← На главную