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

Быстрый старт · 10 мин

Как сделать сортировку в 1С: от простого списка до запроса

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

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

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

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

Сортировка списка в пользовательском режиме

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

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

Учтите, что сортировка по нескольким полям задаётся только через «Сортировать список»: там можно добавить два-три поля и выстроить их приоритет. Например, сначала по контрагенту, затем по дате документа. Порядок полей в настройке определяет, какое из них главное.

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

Настройка порядка в динамическом списке формы

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

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

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

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

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

Ключевые слова направления — Возр (по возрастанию) и Убыв (по убыванию). Если направление не указано, применяется сортировка по возрастанию. Метод сортирует таблицу «на месте», то есть изменяет исходную коллекцию, возвращаемого значения у него нет — это частая причина путаницы у новичков.

Для массивов штатного метода сортировки нет. Стандартный приём — выгрузить массив в таблицу значений, отсортировать её и выгрузить обратно, либо реализовать собственный алгоритм. Если массив содержит структуры или строки таблиц, проще сразу работать с таблицей значений.

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

bsl
ТаблицаТоваров.Сортировать("Номенклатура Возр, Количество Убыв");

Упорядочивание в запросе

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

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

Есть тонкость с итогами: если в запросе используется ИТОГИ ПО, упорядочивание по полю итогов упрощает обход выборки методом ОбходРезультатаЗапроса.ПоГруппировкам. Без сортировки по группировочным полям обход может дать неожиданный порядок строк.

Не забывайте, что УПОРЯДОЧИТЬ ПО нельзя применять к полям типа «ХранилищеЗначения» и строкам неограниченной длины — запрос выдаст ошибку. Такие поля нужно исключать из сортировки или предварительно приводить к сортируемому типу.

bsl
ВЫБРАТЬ Номенклатура, Количество ИЗ РегистрНакопления.ТоварыНаСкладах.Остатки УПОРЯДОЧИТЬ ПО Количество УБЫВ

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

В отчётах, построенных на системе компоновки данных, сортировка задаётся на вкладке «Сортировка» в настройках отчёта. Пользователь может открыть «Ещё → Изменить вариант» (или кнопку настроек), перейти на эту вкладку и добавить поля с направлением. Порядок полей в списке определяет приоритет сортировки.

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

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

Типичные ошибки
01
Сортировка таблицы значений после запроса вместо УПОРЯДОЧИТЬ ПО — лишняя нагрузка и медленнее на больших объёмах
02
Попытка сортировать по полю типа ХранилищеЗначения или строке неограниченной длины — запрос падает с ошибкой
03
Ожидание, что Сортировать() вернёт новую таблицу — метод меняет исходную коллекцию и ничего не возвращает
04
Сортировка табличной части объекта без необходимости — изменённый порядок строк записывается в базу
05
Сортировка на уровне отчёта вместо уровня группировки — строки внутри групп остаются неупорядоченными

Проверка результата и границы самостоятельной работы

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

Обратите внимание на сортировку строк с кириллицей и латиницей: порядок зависит от настроек базы данных, и смешанные значения могут располагаться не так, как ожидает пользователь. Числовые коды, хранящиеся как строки («1», «10», «2»), сортируются посимвольно — «10» окажется раньше «2». Это не ошибка платформы, а следствие типа данных; исправляется приведением к числу или дополнением кодов лидирующими нулями.

Если сортировка «не работает» в динамическом списке, проверьте три вещи: нет ли УПОРЯДОЧИТЬ ПО в произвольном запросе, не задан ли жёсткий порядок в настройках списка и доступно ли выбранное поле для сортировки. В большинстве случаев причина находится в одном из этих пунктов.

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

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

Порядок значений в ключевой колонке
Норма

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

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

Порядок хаотичный или сбрасывается после части строк

Сортировка строковых кодов
Норма

Коды идут 1, 2, 10 — значит тип числовой или есть лидирующие нули

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

Порядок 1, 10, 2 — поле строковое, нужна корректировка

Поведение при смене настройки пользователем
Норма

Список реагирует на «Сортировать список»

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

Настройка игнорируется — в запросе жёсткое УПОРЯДОЧИТЬ ПО

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

Итог

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

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

Частые вопросы

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

Через меню «Ещё → Сортировать список» добавьте несколько полей и выстройте их порядок кнопками перемещения. Верхнее поле — главный критерий, следующие применяются внутри групп одинаковых значений. Щелчок по заголовку колонки задаёт сортировку только по одному полю.

Почему коды сортируются как 1, 10, 2, а не 1, 2, 10?

Код хранится как строка, а строки сравниваются посимвольно: символ «1» меньше «2», поэтому «10» идёт раньше «2». Решения: хранить код как число, использовать лидирующие нули («001», «002», «010») или сортировать в запросе по приведённому к числу значению.

Можно ли запретить пользователю менять сортировку списка?

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

Что быстрее: Сортировать() в коде или УПОРЯДОЧИТЬ ПО в запросе?

На больших объёмах быстрее упорядочивание в запросе, потому что сортировку выполняет СУБД с использованием индексов. Метод Сортировать() оправдан для небольших таблиц значений, собранных программно, или когда данные уже получены и повторный запрос невыгоден.

Как отсортировать справочник с учётом иерархии?

В запросе используйте конструкцию УПОРЯДОЧИТЬ ПО Ссылка ИЕРАРХИЯ — элементы выстроятся деревом: группа, затем вложенные элементы и подгруппы. В пользовательском режиме иерархический порядок обычно включается кнопкой «Режим просмотра → Иерархический список» в форме списка справочника.

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

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