При разработке и доработке документов на обычных формах часто возникает задача отобразить дополнительные сведения в табличной части (например, МОЛ, текущий остаток или статус). Нередко такую колонку добавляют исключительно в элемент управления Табличное поле на форме, не создавая новый реквизит в метаданных документа. Однако при попытке отсортировать строки по этой колонке разработчики сталкиваются с тем, что стандартные механизмы сортировки платформы не работают. Разберем, почему возникает эта проблема, и рассмотрим практические способы ее решения.
Проанализируем архитектурные особенности платформы 1С:Предприятие при работе с табличными частями и элементами управления формы:
Сортировать() применяется к объекту ТабличнаяЧасть. Он умеет работать только с теми колонками, которые объявлены как реквизиты табличной части в дереве метаданных конфигурации.ПриВыводеСтроки или ПриПолученииДанных, не является полем источника данных. Платформа не может упорядочить строки в оперативной памяти по несуществующему в структуре данных полю.ЭтотОбъект.ОС.Выгрузить() формирует объект ТаблицаЗначений, состав колонок которого строго повторяет реквизиты табличной части документа. Визуальные колонки формы в выгрузку не попадают.Если конфигурация находится на поддержке или добавление реквизита в метаданные нежелательно, можно выполнить сортировку программно при помощи временной таблицы значений. Рассмотрим алгоритм действий:
ТаблицаЗначений.МОЛ).Сортировать().Загрузить(). Лишние колонки, которых нет в метаданных документа, при загрузке автоматически игнорируются.Посмотрим на пример кода, реализующего данный подход для документа инвентаризации:
// Выгружаем данные табличной части
ТЗ_ОС = ЭтотОбъект.ОС.Выгрузить();
// Добавляем недостающую колонку для сортировки
ТЗ_ОС.Колонки.Добавить("МОЛ");
// Получаем актуальные данные по МОЛ через запрос
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Таб.НомерСтроки КАК НомерСтроки,
| Таб.ОсновноеСредство КАК ОсновноеСредство
|ПОМЕСТИТЬ ВТ_Строки
|ИЗ
| &ТЗ_ОС КАК Таб
|;
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ.НомерСтроки КАК НомерСтроки,
| МестонахождениеОССрезПоследних.МОЛ КАК МОЛ
|ИЗ
| ВТ_Строки КАК ВТ
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МестонахождениеОС.СрезПоследних(&Период, ) КАК МестонахождениеОССрезПоследних
| ПО ВТ.ОсновноеСредство = МестонахождениеОССрезПоследних.ОсновноеСредство";
Запрос.УстановитьПараметр("ТЗ_ОС", ТЗ_ОС);
Запрос.УстановитьПараметр("Период", ЭтотОбъект.Дата);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ТЗ_ОС[Выборка.НомерСтроки - 1].МОЛ = Выборка.МОЛ;
КонецЦикла;
// Сортируем таблицу значений
ТЗ_ОС.Сортировать("МОЛ Возр, ОсновноеСредство Возр");
// Загружаем обратно в табличную часть документа
ЭтотОбъект.ОС.Загрузить(ТЗ_ОС);
ЭлементыФормы.ОС.ОбновитьСтроки();
Если изменение структуры метаданных допустимо, наиболее простым и быстродействующим решением является добавление штатного реквизита в табличную часть документа:
МОЛ нужного типа непосредственно в табличную часть ОС.После добавления реквизита в состав табличной части становится доступна как интерактивная сортировка по клику на заголовок колонки, так и штатный программный метод сортировки табличной части:
// Сортировка табличной части встроенным методом объекта
ЭтотОбъект.ОС.Сортировать("МОЛ Возр, ОсновноеСредство Возр");
Выясним частую причину требования сортировки: в большинстве случаев пользователям требуется упорядоченный список не на самой форме документа, а в печатной форме (например, ИНВ-1 или описи ОС). В таких ситуациях менять порядок строк в самом документе необязательно.
Достаточно скорректировать запрос на получение данных для макета печати, добавив в блок УПОРЯДОЧИТЬ ПО соединение с соответствующим регистром сведений и сортировку по полю ответственного лица:
// Фрагмент запроса печатной формы
Запрос.Текст =
"ВЫБРАТЬ
| ДокОС.ОсновноеСредство КАК ОсновноеСредство,
| МестонахождениеОС.МОЛ КАК МОЛ
|ИЗ
| Документ.ИнвентаризацияОС.ОС КАК ДокОС
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МестонахождениеОС.СрезПоследних(&Период, ) КАК МестонахождениеОС
| ПО ДокОС.ОсновноеСредство = МестонахождениеОС.ОсновноеСредство
|ГДЕ
| ДокОС.Ссылка = &Ссылка
|УПОРЯДОЧИТЬ ПО
| МОЛ ВОЗР,
| ОсновноеСредство ВОЗР";
Такой подход позволяет сохранить исходную структуру документа и порядок строк, обеспечив при этом корректное и упорядоченное представление данных в печатных формах и внешних отчетах.