Как программно отсортировать табличную часть на обычной форме в 1С 8.2

Программист 1С v8.3 (Обычные формы)
← На главную

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

Анализ причины ошибки: СправочникСписок против Табличной части

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

Проанализируем механику: если данные элемента управления связаны с реквизитом объекта (например, Объект.Товары), то мы имеем дело с Табличной частью. Попытка вызвать метод СправочникСписок.Порядок.Установить("Розница") приведет к ошибке, так как свойство Порядок существует только у динамических списков (объекты типа СправочникСписок.<Имя> или ДокументСписок.<Имя>), которые считывают данные напрямую из базы данных с помощью SQL-запросов.

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

Метод Сортировать() для табличных частей

Если нам необходимо программно изменить порядок строк в табличной части обработки, мы должны обращаться непосредственно к объекту метаданных. Разберем синтаксис этого метода. Основная форма вызова выглядит следующим образом:


// Синтаксис: ТабличнаяЧасть.Сортировать("ИмяКолонки Направление")
// Пример для ТЧ "Товары" и колонки "Розница"
Товары.Сортировать("Розница Возр"); 

Рассмотрим подробнее параметры этого метода:

  1. Имя колонки: Это строковое имя реквизита табличной части, по которому будет производиться упорядочивание. Важно: имя должно соответствовать имени в конфигураторе, а не заголовку на форме.
  2. Направление: Указывается через пробел после имени колонки. Доступны значения Возр (по возрастанию) и Убыв (по убыванию). Если направление не указано, платформа по умолчанию применит Возр.

Проанализируем пример множественной сортировки. Часто требуется отсортировать данные сначала по категории, а затем по цене. В 1С это делается одной строкой:

Объект.Товары.Сортировать("Категория Возр, Розница Убыв");

Почему колонка «Розница» может быть недоступна для сортировки?

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

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

2. Отсутствие индексации: Хотя для небольших таблиц это не критично, для стабильной работы и при больших объемах данных рекомендуется в свойствах реквизита табличной части установить флаг «Индексировать».

Решение: Чтобы сортировка по колонке «Розница» работала, убедитесь, что в табличной части обработки создан реквизит Розница с соответствующим типом данных (например, Число).

Альтернативный метод: Использование Таблицы Значений

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

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

Пример программного кода для реализации этого метода:


// Выгружаем ТЧ в ТЗ
ТЗ = Товары.Выгрузить();

// Добавляем колонку, если её нет
ТЗ.Колонки.Добавить("СложныйРасчет");

Для Каждого СтрокаТЗ Из ТЗ Цикл
    // Выполняем вычисления
    СтрокаТЗ.СложныйРасчет = МояФункцияРасчета(СтрокаТЗ.Товар);
КонецЦикла;

// Сортируем ТЗ
ТЗ.Сортировать("СложныйРасчет Убыв");

// Загружаем обратно в ТЧ документа/обработки
Товары.Загрузить(ТЗ);

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

Визуальное отображение сортировки для пользователя

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

Проанализируем ситуацию из обсуждения: автор решил, что пользователям проще использовать контекстное меню (правой кнопкой мыши -> Сортировать). Это действительно стандартный функционал 1С, который не требует написания кода, если данные в колонке типизированы.

Итоги и рекомендации

Подведем итог нашему разбору. Для успешной сортировки данных на форме в 1С 8.2 необходимо четко разделять тип объекта. Если это СправочникСписок — используйте свойства объекта Порядок. Если это Табличная часть — используйте метод Сортировать(), предварительно убедившись, что реквизит существует в метаданных.

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

← На главную