Почему 1С сортирует записи в списке не так, как ожидается, при одинаковых значениях?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Причина «неожиданной» сортировки

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

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

Механизм работы динамических списков

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

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

Как обеспечить предсказуемый порядок записей

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

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

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


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

Такой запрос даст «плавающий» результат. Чтобы зафиксировать порядок, изменим запрос следующим образом:


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

В этом примере мы используем трехуровневую сортировку:

  1. Первичная сортировка по Наименование.
  2. Вторичная сортировка по Код (если наименования совпадают).
  3. Третичная сортировка по Ссылка (дает окончательную гарантию уникальности порядка для системы).

Советы по настройке форм списка

Если вы наблюдаете «странную» сортировку в уже готовой форме списка (Динамический список), выполните следующие действия:

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

← На главную