Разработка и Конфигурация · 12 мин
Как сделать сортировку по полю в 1С
Разбираем сортировку по полю в 1С: конструкция УПОРЯДОЧИТЬ ПО в запросе, настройка порядка в динамических списках, сортировка таблиц значений и списков в режиме предприятия.
Сортировка по полю — одна из базовых операций в 1С, которая встречается везде: в запросах к базе данных, в динамических списках документов, в таблицах значений и в обычных формах списков, с которыми работает пользователь. При этом механизм сортировки отличается в зависимости от контекста: то, что работает в запросе, неприменимо к таблице значений, а настройка порядка в форме списка делается вообще без программирования.
Неправильно выбранный способ сортировки приводит к типичным проблемам: список документов «скачет», отчёт выводит данные в случайном порядке, а сортировка строки с числами внезапно даёт «1, 10, 2» вместо ожидаемого «1, 2, 10». Причина почти всегда в том, что разработчик не учёл тип поля или применил сортировку не на том уровне.
Ниже разобраны все основные способы: конструкция УПОРЯДОЧИТЬ ПО в языке запросов, метод Сортировать() для таблиц и списков значений, настройка порядка в динамических списках и в пользовательском режиме, а также типичные ошибки и способы проверки результата.
Сортировка в запросе: конструкция УПОРЯДОЧИТЬ ПО
Основной и самый надёжный способ — сортировка на уровне запроса к базе данных. За это отвечает конструкция УПОРЯДОЧИТЬ ПО (в английском синтаксисе — ORDER BY). Она размещается в самом конце текста запроса, после выборки, группировок и итогов.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Наименование КАК Наименование,
| Номенклатура.Артикул КАК Артикул
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|УПОРЯДОЧИТЬ ПО
| Наименование ВОЗР";
Направление сортировки задаётся ключевыми словами ВОЗР (по возрастанию, используется по умолчанию, можно не писать) и УБЫВ (по убыванию). Можно сортировать по нескольким полям — они перечисляются через запятую, и для каждого направление указывается отдельно. Например: УПОРЯДОЧИТЬ ПО Дата УБЫВ, Номер ВОЗР выведет сначала свежие документы, а внутри одной даты — по возрастанию номера.
Важная деталь: сортировать можно не только по выбранным полям, но и по полям, которые не входят в результат запроса, если они доступны в источнике. Однако при использовании РАЗЛИЧНЫЕ или группировки сортировка возможна только по полям выборки и агрегатным функциям — иначе запрос выдаст ошибку.
Сортировка по полю с разными типами данных
Если поле имеет составной тип (например, строка и число одновременно), результат сортировки может оказаться неожиданным: значения сравниваются сначала по типу, потом по значению. Числа в строковом поле сортируются как строки: «10» окажется раньше «2». Если нужен числовой порядок, храните значения в числовом поле или приводите тип функцией ВЫРАЗИТЬ — но помните, что приведение нечисловой строки к числу даст ошибку или 0 в зависимости от СУБД.
Автоупорядочивание и сортировка по представлению
Когда в запросе выбирается ссылка на справочник или документ, платформа может автоматически упорядочить результат по представлению ссылки, если включена конструкция АВТОУПОРЯДОЧИВАНИЕ. Она ставится после УПОРЯДОЧИТЬ ПО и применяется к полям-ссылкам, по которым не задан явный порядок.
На практике автоупорядочивание лучше использовать осторожно: оно добавляет скрытые соединения с таблицами и может замедлить запрос на больших объёмах. Надёжнее явно указать поле сортировки, например УПОРЯДОЧИТЬ ПО Номенклатура.Наименование, — тогда порядок предсказуем и виден прямо в тексте запроса.
Сортировка таблицы значений методом Сортировать()
Если данные уже получены и находятся в таблице значений (например, результат запроса выгружен через Выгрузить()), порядок строк меняется методом Сортировать(). В параметре передаётся строка с именами колонок и направлением:
ТаблицаРезультата = Запрос.Выполнить().Выгрузить();
ТаблицаРезультата.Сортировать("Наименование Возр");
// Сортировка по двум колонкам:
ТаблицаРезультата.Сортировать("Дата Убыв, Сумма Возр");
Метод сортирует таблицу «на месте», ничего не возвращая. Направление задаётся словами Возр и Убыв, колонки разделяются запятыми. Если указать имя несуществующей колонки, платформа вызовет исключение, поэтому при динамическом формировании строки сортировки стоит проверять наличие колонки через ТаблицаРезультата.Колонки.Найти(ИмяКолонки).
Аналогично работает сортировка списка значений: у объекта СписокЗначений есть методы СортироватьПоЗначению() и СортироватьПоПредставлению() с параметром направления НаправлениеСортировки.Возр или .Убыв. Это удобно для выпадающих списков выбора.
ТЗ.Сортировать("Количество Убыв, Наименование Возр");Сортировка в динамическом списке
Динамический список — основа большинства форм списков в управляемом приложении. Порядок записей в нём задаётся двумя путями: через настройку «Порядок» в конфигураторе (или в пользовательских настройках) и программно через свойство Порядок объекта динамического списка.
В конфигураторе откройте форму списка, выделите реквизит списка, в палитре свойств нажмите «Открыть» у свойства «Настройка списка» и перейдите на закладку «Порядок». Перенесите нужное поле в правую часть и выберите направление. Поля, доступные для сортировки, определяются запросом динамического списка — если поле не выбрано в запросе, отсортировать по нему не получится.
Программная установка порядка выглядит так:
ПорядокСписка = Список.Порядок;
ЭлементПорядка = ПорядокСписка.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных"));
ЭлементПорядка.Поле = Новый ПолеКомпоновкиДанных("Дата");
ЭлементПорядка.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Убыв;
ЭлементПорядка.Использование = Истина;
Учтите ограничение: если в динамическом списке включён «Основной реквизит» со стандартной динамической сортировкой (например, список документов по дате), пользовательская сортировка может конфликтовать с ней. Для произвольного порядка иногда приходится отключать свойство «Произвольный запрос» и настраивать порядок полностью вручную.
- 1Откройте форму списка и выделите реквизит динамического списка
- 2В палитре свойств откройте «Настройка списка»
- 3Перейдите на закладку «Порядок» и перенесите нужное поле вправо
- 4Укажите направление сортировки для поля
- 5Сохраните форму и проверьте порядок записей в режиме предприятия
Сортировка для пользователя в режиме «Предприятие»
Пользователю не нужно программирование, чтобы отсортировать список. В управляемых формах сортировка доступна через меню «Ещё» → «Настроить список» → закладка «Сортировка», где выбирается поле и направление. Во многих формах также работает клик по заголовку колонки таблицы — он переключает сортировку по возрастанию и убыванию.
В обычных формах (толстый клиент) сортировка табличного поля включается через контекстное меню колонки или стандартную команду «Сортировать по возрастанию/убыванию». Если кнопки недоступны, значит у табличного поля отключено свойство сортировки или список имеет фиксированный порядок, заданный разработчиком.
Настройки сортировки, сделанные пользователем, платформа обычно сохраняет автоматически и восстанавливает при следующем открытии формы. Если настройки «сбиваются», проверьте, не переустанавливает ли код формы порядок программно при каждом открытии — это частая причина жалоб пользователей.
Сравнение способов сортировки
Самый быстрый способ, сортировка выполняется на сервере СУБД. Подходит для любых выборок, но требует изменения текста запроса.
Применяется к уже полученным данным в памяти. Удобно для постобработки, но на больших таблицах медленнее сортировки в запросе.
Для форм списков в управляемом приложении. Настраивается без кода, но ограничен полями запроса списка.
Через «Ещё» → «Настроить список». Не требует прав доступа к конфигуратору, но действует только для текущего пользователя.
Типичные ошибки и как их избежать
Самая распространённая ошибка — сортировка строкового поля, в котором хранятся числа. Результат «1, 10, 2, 25» выглядит как сбой, но это корректная лексикографическая сортировка строк. Решение — хранить числа в числовых полях, а если тип менять нельзя, дополнять строку ведущими нулями до фиксированной длины.
Вторая частая проблема — попытка отсортировать по полю, которого нет в выборке при использовании РАЗЛИЧНЫЕ или СГРУППИРОВАТЬ ПО. Запрос просто не выполнится. Нужно либо добавить поле в выборку, либо сортировать по агрегатной функции, например УПОРЯДОЧИТЬ ПО СУММА(Сумма) УБЫВ.
Третья ошибка — сортировка по представлению ссылки вместо самой ссылки или конкретного поля. Представление может формироваться неочевидно (с учётом настроек объекта), и порядок окажется не тем, что ожидался. Всегда сортируйте по конкретному реквизиту: Наименование, Дата, Номер.
Как проверить результат сортировки
После настройки порядка проверьте результат на контрольных данных. Для запроса достаточно выполнить его в консоли запросов и визуально убедиться, что значения целевого поля идут в нужном порядке. Обратите внимание на граничные случаи: пустые значения, NULL, одинаковые значения в поле сортировки.
NULL в сортировке ведёт себя по-разному в зависимости от СУБД: NULL-значения могут оказаться в начале или в конце выборки. Если порядок критичен, обработайте NULL функцией ЕСТЬNULL(Поле, ЗначениеПоУмолчанию) прямо в запросе — тогда порядок станет детерминированным.
При одинаковых значениях основного поля сортировки порядок строк внутри группы не гарантирован. Если нужна стабильная последовательность (например, для нумерации строк в отчёте), добавьте вторым полем уникальный идентификатор — ссылку или номер строки.
Как проверить результат
Значения монотонно возрастают или убывают по всей выборке
Порядок нарушается на строках с NULL или строковыми числами
Внутри группы строки упорядочены по второму полю
Порядок строк в группе меняется от выполнения к выполнению
Запрос выполняется за приемлемое время
Сортировка по неиндексированному полю заметно тормозит выборку
FAQ: частые вопросы о сортировке в 1С
Как отсортировать по нескольким полям в запросе?
Перечислите поля через запятую после УПОРЯДОЧИТЬ ПО, указывая направление для каждого: «УПОРЯДОЧИТЬ ПО Контрагент ВОЗР, Дата УБЫВ». Сначала записи сортируются по первому полю, при равенстве значений — по второму и так далее.
Почему числа сортируются как 1, 10, 2?
Поле имеет строковый тип, и сортировка идёт посимвольно. Решения: изменить тип реквизита на числовой, хранить значения с ведущими нулями фиксированной длины или использовать ВЫРАЗИТЬ для приведения к числу, если все значения гарантированно числовые.
Можно ли отсортировать динамический список по полю, которого нет в запросе?
Нет. Динамический список сортируется только по полям, доступным в его запросе. Добавьте нужное поле в текст запроса списка (его не обязательно выводить в таблицу формы), после чего оно станет доступным для сортировки.
Как пользователю вернуть сортировку списка «по умолчанию»?
Откройте «Ещё» → «Настроить список», перейдите на закладку «Сортировка» и удалите добавленные поля либо воспользуйтесь командой установки стандартных настроек. Альтернатива — «Ещё» → «Установить стандартные настройки» для всей формы.
Что быстрее: сортировка в запросе или методом Сортировать()?
Почти всегда быстрее сортировка в запросе, особенно если по полю есть индекс — СУБД использует его и не выполняет физическую сортировку. Метод Сортировать() оправдан, когда данные уже в памяти или порядок формируется динамически после выборки.
Как отсортировать табличную часть документа?
Выгрузите табличную часть в таблицу значений методом Выгрузить(), отсортируйте её методом Сортировать() и загрузите обратно методом Загрузить(). Учтите, что при этом перенумеруются строки, а сортировка сохранится в документе только после его записи.
Что важно запомнить
В запросе используйте УПОРЯДОЧИТЬ ПО с явным указанием поля и направления — это самый быстрый и предсказуемый способ. Таблицы значений сортируются методом Сортировать(), динамические списки — через настройку «Порядок», а пользователь меняет сортировку через «Настроить список». Следите за типами полей и добавляйте второе поле сортировки для стабильного порядка.