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