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

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

Как в 1С работает сортировка по ссылке

Почему в 1С сортировка по полю-ссылке даёт неожиданный порядок, как устроен порядок ссылок и как получить сортировку по наименованию или коду.

Разработчики и пользователи 1С регулярно сталкиваются с ситуацией: в запросе или динамическом списке указана сортировка по полю «Контрагент» или «Номенклатура», а строки выводятся в странном порядке — не по алфавиту и не по коду. Причина проста: при сортировке по полю ссылочного типа платформа упорядочивает записи по значению самой ссылки, а не по представлению объекта.

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

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

Что такое ссылка и как платформа её сравнивает

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

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

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

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

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

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

Ещё одна ловушка — сравнение ссылок операторами «больше/меньше» в коде. Оно работает по тем же правилам, что и сортировка, поэтому условие вида Если Ссылка1 > Ссылка2 проверяет не «важность» объектов, а лишь отношение их внутренних идентификаторов.

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

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

Тот же приём работает в динамических списках и СКД: в настройках сортировки выбирайте поле «Контрагент.Наименование» вместо «Контрагент». Для документов аналогично доступны «Номер» и «Дата».

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

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

Автоупорядочивание и конструкция «УПОРЯДОЧИТЬ ПО» в динамических списках

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

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

Сортировка ссылок в коде: СортироватьЗначения и сравнение

Встроенный язык позволяет сортировать массивы и списки значений, содержащие ссылки. Метод СортироватьЗначение() у списка значений и сравнение ссылок в произвольных алгоритмах используют то же правило: сначала тип, затем внутренний идентификатор.

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

Как отсортировать массив ссылок по наименованию
  1. 1
    Создайте таблицу значений с колонками «Ссылка» и «Наименование»
  2. 2
    Заполните таблицу: для каждой ссылки добавьте строку и получите наименование запросом или обращением к реквизиту
  3. 3
    Вызовите Сортировать("Наименование") у таблицы значений
  4. 4
    Обойдите таблицу и заберите ссылки в нужном порядке

Типичные ошибки и как их проверить

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

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

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

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

Порядок строк в результате запроса
Норма

Записи идут по наименованию/коду — сортировка задана по реквизиту

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

Порядок нечитаемый, но стабильный — вероятно, сортировка идёт по ссылке

Запрос в консоли
Норма

В тексте есть УПОРЯДОЧИТЬ ПО с нужным полем

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

Упорядочивание отсутствует или указано по полю ссылочного типа

Повторный запуск
Норма

Порядок одинаков при повторном выполнении

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

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

Когда сортировка по ссылке — правильный выбор

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

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

Маршрут решения

Как выбрать поле сортировки

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

FAQ

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

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

Можно ли отсортировать по ссылке так, чтобы получить порядок создания объектов?

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

Почему сортировка по Наименование через точку работает медленнее?

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

Что происходит при сортировке по полю составного ссылочного типа?

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

Как в СКД отсортировать группировку по контрагентам по алфавиту?

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

Влияет ли пометка удаления объекта на порядок сортировки по ссылке?

Нет. Пометка удаления не меняет внутренний идентификатор, объект остаётся в выборке на своём месте по порядку ссылок, пока не будет физически удалён регламентной операцией.

Итог

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

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