Как отсортировать строки документа по дополнительной колонке табличного поля в 1С

Программист 1С v8.3 (Обычные формы) 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

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

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

Проанализируем архитектурные особенности платформы 1С:Предприятие при работе с табличными частями и элементами управления формы:

  1. Разделение данных и отображения: Метод Сортировать() применяется к объекту ТабличнаяЧасть. Он умеет работать только с теми колонками, которые объявлены как реквизиты табличной части в дереве метаданных конфигурации.
  2. Отсутствие данных в источнике: Колонка, созданная только в табличном поле формы и заполняемая в обработчиках ПриВыводеСтроки или ПриПолученииДанных, не является полем источника данных. Платформа не может упорядочить строки в оперативной памяти по несуществующему в структуре данных полю.
  3. Ограничение метода выгрузки: Вызов ЭтотОбъект.ОС.Выгрузить() формирует объект ТаблицаЗначений, состав колонок которого строго повторяет реквизиты табличной части документа. Визуальные колонки формы в выгрузку не попадают.

Способ 1. Программная сортировка через промежуточную таблицу значений без изменения конфигурации

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

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

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


// Выгружаем данные табличной части
ТЗ_ОС = ЭтотОбъект.ОС.Выгрузить();

// Добавляем недостающую колонку для сортировки
ТЗ_ОС.Колонки.Добавить("МОЛ");

// Получаем актуальные данные по МОЛ через запрос
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   Таб.НомерСтроки КАК НомерСтроки,
    |   Таб.ОсновноеСредство КАК ОсновноеСредство
    |ПОМЕСТИТЬ ВТ_Строки
    |ИЗ
    |   &ТЗ_ОС КАК Таб
    |;
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |   ВТ.НомерСтроки КАК НомерСтроки,
    |   МестонахождениеОССрезПоследних.МОЛ КАК МОЛ
    |ИЗ
    |   ВТ_Строки КАК ВТ
    |   ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МестонахождениеОС.СрезПоследних(&Период, ) КАК МестонахождениеОССрезПоследних
    |       ПО ВТ.ОсновноеСредство = МестонахождениеОССрезПоследних.ОсновноеСредство";

Запрос.УстановитьПараметр("ТЗ_ОС", ТЗ_ОС);
Запрос.УстановитьПараметр("Период", ЭтотОбъект.Дата);

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    ТЗ_ОС[Выборка.НомерСтроки - 1].МОЛ = Выборка.МОЛ;
КонецЦикла;

// Сортируем таблицу значений
ТЗ_ОС.Сортировать("МОЛ Возр, ОсновноеСредство Возр");

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

Способ 2. Добавление реквизита в метаданные табличной части

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

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

После добавления реквизита в состав табличной части становится доступна как интерактивная сортировка по клику на заголовок колонки, так и штатный программный метод сортировки табличной части:


// Сортировка табличной части встроенным методом объекта
ЭтотОбъект.ОС.Сортировать("МОЛ Возр, ОсновноеСредство Возр");

Способ 3. Переопределение порядка при формировании печатных форм

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

Достаточно скорректировать запрос на получение данных для макета печати, добавив в блок УПОРЯДОЧИТЬ ПО соединение с соответствующим регистром сведений и сортировку по полю ответственного лица:


// Фрагмент запроса печатной формы
Запрос.Текст = 
    "ВЫБРАТЬ
    |   ДокОС.ОсновноеСредство КАК ОсновноеСредство,
    |   МестонахождениеОС.МОЛ КАК МОЛ
    |ИЗ
    |   Документ.ИнвентаризацияОС.ОС КАК ДокОС
    |   ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МестонахождениеОС.СрезПоследних(&Период, ) КАК МестонахождениеОС
    |       ПО ДокОС.ОсновноеСредство = МестонахождениеОС.ОсновноеСредство
    |ГДЕ
    |   ДокОС.Ссылка = &Ссылка
    |УПОРЯДОЧИТЬ ПО
    |   МОЛ ВОЗР,
    |   ОсновноеСредство ВОЗР";

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

← На главную