Как в табличном документе отсортировать колонку сумма?

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

При разработке отчетов и печатных форм в среде 1С:Предприятие начинающие разработчики часто ищут метод Сортировать() у объекта ТабличныйДокумент. Однако важно понимать, что этот объект предназначен исключительно для отображения и печати уже сформированных данных, и встроенного механизма сортировки строк (аналогичного Excel) он не имеет. Чтобы данные в колонке "Сумма" (или любой другой) выстроились в нужном порядке, необходимо реализовать сортировку на этапе подготовки этих данных.

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

Метод 1: Динамическое формирование блока УПОРЯДОЧИТЬ ПО в запросе

Самый правильный с точки зрения производительности путь — заставить СУБД отсортировать данные еще в момент выполнения запроса. Если ваш отчет строится на базе сложного динамического текста запроса, где условия и группировки зависят от выбора пользователя, мы можем применить вложенные тернарные операторы для формирования блока УПОРЯДОЧИТЬ ПО.

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


|УПОРЯДОЧИТЬ ПО "+
?(ПараметрыОтчета.ОтборВыбратьПервые, "вр_Осн.Остаток УБЫВ ",
    ?(не ПараметрыОтчета.ВыводитьИтогиПоКонтрагенту, "вр_Осн.Регистратор.Договор.Дата ",
        ?(ПараметрыОтчета.СортироватьПоСуммеОплат, "СуммаОплата УБЫВ ", 
            "вр_Осн.КонтрагентНаименование,
            |вр_Осн.ДоговорНаименование,
            |вр_Осн.ОсновноеСредствоНаименование"
        )
    )
) + "
|ИТОГИ
|   МАКСИМУМ(Остаток),
|   МАКСИМУМ(СуммаОплата)
|ПО
|   "+?(не ПараметрыОтчета.ВыводитьИтогиПоКонтрагенту, "ОБЩИЕ,", "Контрагент,")+"
|   Регистратор"

В данном примере мы видим использование переменной ПараметрыОтчета.СортироватьПоСуммеОплат. Если пользователь устанавливает этот флаг, запрос подставляет строку СуммаОплата УБЫВ. Обратите внимание, что при использовании конструкции ИТОГИ, сортировка будет применяться к тем уровням группировки, которые указаны в блоке УПОРЯДОЧИТЬ ПО.

Метод 2: Сортировка через промежуточную Таблицу Значений

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

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

Посмотрим на пример кода:


// 1. Получаем таблицу из результата запроса
ТаблицаРезультат = РезультатЗапроса.Выгрузить();

// 2. Сортируем по колонке "СуммаОплата" по убыванию
ТаблицаРезультат.Сортировать("СуммаОплата Убыв");

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

Этот способ крайне надежен и прост в отладке. Вы всегда можете программно проверить содержимое ТаблицыЗначений перед тем, как она попадет в печатную форму.

Метод 3: Использование Системы компоновки данных (СКД)

Если вы создаете отчет с нуля, настоятельно рекомендуем использовать СКД. В этом случае вам вообще не придется писать код для сортировки. Система компоновки данных берет на себя всю работу по трансформации запроса.

Проанализируем, как это настроить:

  1. Перейдите на вкладку Настройки в схеме компоновки данных.
  2. Выберите нужную группировку (например, "Контрагент") или весь отчет в целом.
  3. Перейдите на закладку Сортировка.
  4. Добавьте поле Сумма и укажите направление "По убыванию".

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

Метод 4: Программная перестановка областей в готовом документе

Это наиболее трудозатратный способ, который применяется в исключительных случаях, когда документ уже сформирован и у нас нет доступа к источнику данных. Мы можем прочитать данные из ячеек ТабличногоДокумента, поместить их в массив или таблицу значений, отсортировать, а затем перерисовать документ.

Для этого используются методы:

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

Выводы и рекомендации

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

Если это ваш собственный запрос — модифицируйте блок УПОРЯДОЧИТЬ ПО. Если запрос "чужой" и вы боитесь его сломать — используйте промежуточную ТаблицуЗначений. И всегда помните про СКД, которая является современным стандартом разработки отчетов в 1С и избавляет от необходимости вручную прописывать логику сортировки в коде.

← На главную