Работа с табличными документами и временными наборами данных является неотъемлемой частью разработки в платформе 1С:Предприятие. Часто возникает необходимость упорядочить информацию, полученную в результате запроса или сформированную программно, чтобы вывести её пользователю в удобном виде или использовать для дальнейших вычислений.

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

В данной статье мы подробно разберем все доступные способы изменения порядка строк в таблице значений. Мы рассмотрим встроенные методы объекта, особенности сортировки по разным типам данных и нюансы работы с несколькими критериями упорядочивания одновременно.

Основные методы сортировки в 1С

Для изменения порядка записей в объекте ТаблицаЗначений платформа предоставляет встроенный метод СортироватьПо(). Этот метод является наиболее производительным и предпочтительным способом, так как сортировка происходит средствами движка платформы, а не перебором строк в цикле. Использование этого метода гарантирует оптимальную скорость даже при больших объемах данных.

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

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

💡

Метод СортироватьПо() работает значительно быстрее, чем ручная перестановка строк в цикле, особенно на объемах данных более 10 000 записей.

Рассмотрим базовый пример использования. Предположим, у нас есть таблица с товарами, и нам нужно расположить их по наименованию. Мы передаем имя колонки в метод в виде строки.

ТЗ.СортироватьПо("Наименование");

Если требуется обратный порядок, например, от большего к меньшему или от Я до А, используется ключевое слово Убыв. Оно указывается после имени поля через пробел.

ТЗ.СортироватьПо("Количество Убыв");

Сортировка по нескольким полям одновременно

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

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

Логика работы множественной сортировки

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

Допустим, нам нужно вывести список сотрудников, отсортированный сначала по отделу (по возрастанию), а внутри отдела — по фамилии (по убыванию). Синтаксис будет следующим:

ТЗ.СортироватьПо("Отдел, Фамилия Убыв");

Обратите внимание, что направление сортировки (Убыв) указывается только для конкретного поля, после которого оно стоит. Если для поля направление не указано, по умолчанию применяется сортировка по возрастанию (Возр). Можно явно указать Возр для читаемости кода, но это не обязательно.

  • 📊 Приоритет полей: Левое поле в списке всегда главнее правого.
  • 📉 Направление: По умолчанию используется возрастание, если не указано иное.
  • 🔤 Чувствительность: Строковые значения сортируются с учетом регистра, если не задано иное сравнение.

Особенности типов данных при сортировке

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

При сортировке числовых значений всё интуитивно понятно: 1, 2, 10, 100. Однако при сортировке строк, содержащих числа, результат может быть неожиданным для новичка. Строка "10" будет идти раньше строки "2", так как посимвольное сравнение ставит символ '1' перед символом '2'. Это стандартное лексикографическое сравнение.

⚠️ Внимание: Если в колонке хранятся числа в виде строк (например, "1", "10", "2"), сортировка будет посимвольной ("1", "10", "2"). Для корректного числового порядка данные должны иметь тип Число.

Особого внимания заслуживают колонки с типом Дата и Время. Пустые значения даты (0000-00-00) обычно сортируются в самом начале списка при возрастании. Это важно учитывать при формировании отчетов по документам, где дата заполнения может быть не указана.

📊 С каким типом данных чаще всего возникают проблемы при сортировке?
Строки с числами
Даты с пустыми значениями
Ссылки на объекты
Булевы значения

Также стоит упомянуть сортировку по булевым значениям (Истина/Ложь). В 1С значение Ложь (0) обычно считается меньше, чем Истина (1). Поэтому при сортировке по возрастанию строки со значением Ложь окажутся вверху таблицы.

Программная сортировка и пользовательские сравнения

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

Ручная сортировка реализуется через алгоритмы, такие как "пузырьковая сортировка" или "быстрая сортировка", с использованием метода Сравнить() у строк таблицы значений. Этот подход требует написания большего количества кода и работает медленнее встроенного метода.

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

Функция СравнитьСтроки(Строка1, Строка2)

Возврат Строка1.Наименование.Сравнить(Строка2.Наименование);

КонецФункции

⚠️ Внимание: Ручная сортировка в циклах может существенно замедлить работу программы при объеме данных свыше 5000 строк. Используйте её только когда встроенный метод неприменим.

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

Сортировка в запросах до получения ТаблицыЗначений

Наиболее эффективным способом получения отсортированных данных является выполнение сортировки на уровне запроса к базе данных. В этом случае СУБД (SQL Server, PostgreSQL или встроенная база 1С) берет на себя всю работу по упорядочиванию записей перед их передачей в код 1С.

Для этого в тексте запроса используется конструкция УПОРЯДОЧИТЬ ПО. Результат такого запроса сразу попадает в объект ТаблицаЗначений уже в нужном порядке. Это экономит ресурсы процессора сервера приложений и оперативную память.

☑️ Оптимизация производительности

Выполнено: 0 / 4

Пример синтаксиса запроса с сортировкой:

ВЫБРАТЬ

Номенклатура.Наименование,

Номенклатура.Артикул

ИЗ

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

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

Номенклатура.Артикул УБЫВ,

Номенклатура.Наименование ВОЗР

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

Частые ошибки и рекомендации

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

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

Тип ошибки Причина Решение
Синтаксическая ошибка Пробелы в имени поля Использовать скобки: ["Имя Поля"]
Неверный порядок Сортировка строк как чисел Привести тип данных к Число
Тормоза программы Сортировка в цикле Вынести сортировку за пределы цикла
💡

Всегда проверяйте имена колонок на наличие пробелов и специальных символов перед передачей их в метод СортироватьПо.

Еще один важный момент — сохранение порядка при копировании таблиц. Метод Скопировать() создает новую таблицу значений, сохраняя текущий порядок строк. Однако если вы выгружаете таблицу в табличный документ или Excel, порядок может измениться, если не задать параметры выгрузки явно.

⚠️ Внимание: Интерфейс и возможности платформы 1С могут обновляться. Всегда сверяйте синтаксис методов в справочнике разработчика вашей конкретной версии платформы (8.3, 8.4 и т.д.).

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

Что такое стабильность сортировки?

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

FAQ: Часто задаваемые вопросы

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

Для этого передайте в метод СортироватьПо() строку с именами колонок, разделенными запятой. Например: ТЗ.СортироватьПо("Колонка1, Колонка2 Убыв"). Первое поле будет главным критерием сортировки.

Почему числа сортируются неправильно (1, 10, 2)?

Это происходит, если тип данных колонки — Строка. Сортировка происходит посимвольно. Чтобы исправить это, измените тип колонки на Число при создании таблицы значений или преобразуйте данные перед сортировкой.

Можно ли отсортировать таблицу значений по результату вычисляемого поля?

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

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

Встроенный метод СортироватьПо учитывает регистр. Для сортировки без учета регистра (А = а) необходимо использовать ручную сортировку с параметрами сравнения строк или привести все строки к нижнему регистру во вспомогательной колонке перед сортировкой.

Влияет ли сортировка таблицы значений на скорость работы программы?

Да, влияет. Сортировка больших массивов данных (десятки и сотни тысяч строк) требует процессорного времени. Рекомендуется сортировать данные на уровне запроса к базе данных, где это выполняется эффективнее, чем в коде 1С.