К статье
Практический материал

Разработка и Конфигурация · 11 мин

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

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

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

Ключевой момент, который часто упускают: сам объект ТабличныйДокумент — это результат, «картинка» из ячеек, а не структура данных. У него нет метода сортировки. Сортировать нужно источник данных — таблицу значений, динамический список, запрос или набор данных СКД — до того, как результат будет выведен в табличный документ. Понимание этого избавляет от бесплодных попыток найти у табличного документа несуществующую команду «Сортировать».

Ниже разобраны рабочие способы для каждого сценария: от интерактивной сортировки на форме до программной сортировки таблицы значений и настройки порядка в запросе и СКД. Отдельно рассмотрены типичные ошибки и способы проверить результат.

Почему табличный документ нельзя отсортировать напрямую

Объект ТабличныйДокумент хранит итоговое представление: ячейки, их текст, оформление, объединения, группировки строк. После вывода области связь ячеек с исходными данными теряется — документ «не знает», что строка 5 относится к товару «Гвоздь 5х120», а строка 6 — к «Шуруп 4х40». Поэтому переставить строки с сохранением смысла штатными средствами нельзя.

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

Интерактивная сортировка таблицы на форме

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

Для динамического списка сортировка работает иначе: порядок задаётся через «Ещё → Настроить список → Сортировка» (в управляемых формах). Там можно добавить несколько полей и задать направление для каждого. Это удобно, когда нужна многоуровневая сортировка — например, сначала по складу, внутри склада по наименованию.

Когда сортировка по клику не работает

Если клик по заголовку не меняет порядок, проверьте два момента. Во-первых, у элемента формы может быть отключено свойство сортировки — разработчик мог запретить её в настройках таблицы. Во-вторых, если таблица связана с динамическим списком, у которого задана произвольная сортировка в запросе, пользовательская сортировка может быть заблокирована настройкой «Доступные поля порядка».

Сортировка таблицы значений перед выводом

Самый частый программный сценарий: данные собраны в таблицу значений, и её нужно вывести в табличный документ в определённом порядке. Для этого используется метод Сортировать(), который принимает строку с перечнем колонок и направлений.

ТаблицаТоваров.Сортировать("Склад Возр, Наименование Возр, Цена Убыв");

Ключевые слова Возр и Убыв задают направление; если направление не указано, по умолчанию применяется возрастание. Колонки перечисляются через запятую — сначала сортировка идёт по первой, при равенстве значений — по второй и так далее. Метод сортирует таблицу «на месте», возвращать результат в новую переменную не нужно.

Альтернатива — объект СравнениеЗначений для нестандартного сравнения, но в типовых задачах он почти не нужен. Важно помнить ограничение: сортировка работает корректно, когда в колонке однотипные данные. Если колонка составного типа (например, строки и числа вперемешку), порядок может оказаться неожиданным, потому что сравнение идёт по правилам платформы, а не по человеческой логике.

bsl
ТаблицаТоваров.Сортировать("Склад Возр, Наименование Возр");
Для Каждого СтрокаТовара Из ТаблицаТоваров Цикл
	ОбластьСтрока.Параметры.Заполнить(СтрокаТовара);
	ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;

Сортировка в запросе и в динамическом списке

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

ВЫБРАТЬ

Товары.Наименование КАК Наименование,

Товары.Остаток КАК Остаток

ИЗ

Справочник.Номенклатура КАК Товары

УПОРЯДОЧИТЬ ПО

Остаток УБЫВ,

Наименование

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

Практическое правило выбора: если данные берутся запросом — сортируйте в запросе; если таблица значений собирается программно из разных источников — сортируйте методом Сортировать() после наполнения; если это динамический список — настраивайте его порядок, а не вмешивайтесь в вывод.

Сравнение вариантов

УПОРЯДОЧИТЬ ПО в запросе

Самый быстрый вариант для данных из БД; не подходит, если порядок зависит от вычислений в коде после запроса.

ТаблицаЗначений.Сортировать()

Универсально для программно собранных данных; на очень больших таблицах медленнее сортировки в запросе.

Порядок динамического списка

Только для списков на форме; не применим к печатным формам и табличным документам.

Настройки СКД

Для отчётов на компоновке данных; пользователь может менять порядок без доработки кода.

Сортировка в отчётах на СКД

Отчёты на системе компоновки данных выводят результат в том числе в табличный документ, и порядок строк здесь управляется настройками отчёта. Пользователь открывает «Настройки → Сортировка», добавляет поле и направление. Разработчик задаёт сортировку по умолчанию в схеме компоновки на закладке «Настройки» либо программно через объект настроек компоновщика.

Важная особенность: сортировка в СКД применяется к каждому уровню группировки. Если в отчёте есть группировка по складам, порядок «по убыванию остатка» будет действовать внутри каждого склада, а сами склады упорядочатся по своим правилам. Чтобы задать порядок групп, сортировку добавляют на уровне конкретной группировки, а не отчёта целиком.

Порядок действий для отчёта на СКД
  1. 1
    Откройте настройки отчёта (кнопка «Настройки» или «Ещё → Изменить вариант»).
  2. 2
    Перейдите на закладку «Сортировка».
  3. 3
    Добавьте нужное поле из доступных и выберите направление.
  4. 4
    Если есть группировки — убедитесь, что сортировка задана на нужном уровне.
  5. 5
    Сформируйте отчёт и проверьте порядок строк в табличном документе.

Типичные ошибки и как их избежать

Самая частая ошибка — попытка отсортировать уже сформированный табличный документ. Второе место занимает сортировка по строковому представлению чисел: если суммы хранятся или выгружаются как строки, «100» окажется раньше «20», потому что сравнение идёт посимвольно. Перед сортировкой убедитесь, что колонка имеет числовой тип.

Ещё одна проблема — смешение сортировки и группировок при выводе макета. Если строки выводятся с группировками (НачатьГруппуСтрок), а данные отсортированы не по группировочным полям, итоги и структура групп «развалятся». Правило простое: порядок сортировки должен начинаться с полей группировки в том же порядке, в каком выводятся группы.

Типичные ошибки
01
Попытка сортировать сам ТабличныйДокумент — метода не существует, нужно менять источник данных.
02
Сортировка чисел, хранящихся как строки — порядок получается лексикографическим, а не числовым.
03
Сортировка не по полям группировки при выводе с группами — ломаются итоги и структура.
04
Сортировка таблицы значений после частичного вывода в документ — часть строк уже выведена в старом порядке.
05
Ожидание, что сортировка на форме сохранится — без записи настроек порядок сбрасывается.

Как проверить результат

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

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

Контрольные точки

Как проверить результат

Порядок строк
Норма

Значения сортируемой колонки монотонно возрастают или убывают

Тревожный признак

Порядок «скачет», значения перемешаны

Тип данных колонки
Норма

Числа сортируются по величине (2, 20, 100)

Тревожный признак

Числа идут как строки (100, 20, 2)

Итоги и группы
Норма

Суммы по группам совпадают с исходными

Тревожный признак

Итоги изменились или группы разорваны

FAQ

Можно ли отсортировать уже сформированный табличный документ?

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

Почему сортировка по колонке с суммами даёт странный порядок?

Почти всегда причина в том, что значения хранятся как строки, а не как числа. Строковое сравнение посимвольное: «100» меньше «20». Приведите колонку к числовому типу при заполнении таблицы значений или в запросе — и порядок станет корректным.

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

Передайте в метод Сортировать() строку с колонками через запятую, например: Таблица.Сортировать("Склад Возр, Наименование Возр"). Сначала строки упорядочиваются по первой колонке, при равенстве — по следующей.

Сохранится ли настроенная пользователем сортировка отчёта?

Для отчётов на СКД настройки, включая сортировку, сохраняются в варианте отчёта, если пользователь сохранит вариант или включено автосохранение настроек. Для таблиц значений на произвольных формах порядок обычно не сохраняется — его нужно запоминать программно, если это требуется.

Что быстрее: сортировать в запросе или таблицу значений?

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

Как отсортировать динамический список программно?

Через свойство Порядок списка: добавьте элемент в Список.Порядок.Элементы, укажите поле и направление (НаправлениеСортировкиКомпоновкиДанных.Возр или Убыв). Это тот же механизм, что и в пользовательских настройках списка.

Итог

Что важно запомнить

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