Часто в процессе разработки на платформе 1С:Предприятие мы сталкиваемся с ситуацией, когда данные в форме списка или в результате запроса при упорядочивании по строковому полю (например, Наименование) отображаются в «случайном» порядке, если в этом поле содержатся дубликаты. Давайте разберемся, почему это происходит и как сделать сортировку предсказуемой.
Когда вы используете инструкцию УПОРЯДОЧИТЬ ПО в запросе 1С, платформа передает команду СУБД. Если в целевом поле встречаются одинаковые значения, то для базы данных записи становятся эквивалентными в рамках критерия сортировки. В этом случае СУБД может вернуть строки в любом порядке, зависящем от:
Поведение платформы в данном случае не является ошибкой, это фундаментальный принцип работы с базами данных: если мы не задали второй или третий уровень сортировки, система не гарантирует порядок для одинаковых значений.
В управляемых формах 1С использует Динамический список. Вы могли заметить, что иногда записи в списке «прыгают» при обновлении. Это происходит, если платформа не может однозначно идентифицировать строку. Для обеспечения стабильности интерфейса разработчики часто добавляют неявную сортировку по Ссылка.
Сортировка по ссылке — это сортировка по уникальному идентификатору (GUID) объекта. Так как GUID уникален для каждой записи, добавление его вторым параметром в УПОРЯДОЧИТЬ ПО гарантирует, что даже при полном совпадении Наименований, записи всегда будут выводиться в одном и том же порядке.
Чтобы гарантированно управлять порядком строк в списке или выборке, всегда следуйте правилу: добавляйте в УПОРЯДОЧИТЬ ПО поля, которые делают сортировку уникальной для каждой записи.
Рассмотрим пример правильного построения запроса:
Допустим, нам нужно отсортировать справочник Сотрудники. Обычный запрос выглядит так:
ВЫБРАТЬ
Сотрудники.Наименование КАК Наименование,
Сотрудники.Код КАК Код,
Сотрудники.Ссылка КАК Ссылка
ИЗ
Справочник.Сотрудники КАК Сотрудники
УПОРЯДОЧИТЬ ПО
Наименование
Такой запрос даст «плавающий» результат. Чтобы зафиксировать порядок, изменим запрос следующим образом:
ВЫБРАТЬ
Сотрудники.Наименование КАК Наименование,
Сотрудники.Код КАК Код,
Сотрудники.Ссылка КАК Ссылка
ИЗ
Справочник.Сотрудники КАК Сотрудники
УПОРЯДОЧИТЬ ПО
Наименование,
Код,
Ссылка
В этом примере мы используем трехуровневую сортировку:
Наименование.Код (если наименования совпадают).Ссылка (дает окончательную гарантию уникальности порядка для системы).Если вы наблюдаете «странную» сортировку в уже готовой форме списка (Динамический список), выполните следующие действия:
Порядок. Если вы видите, что там нет явных полей, платформа может использовать настройки по умолчанию или динамически добавлять сортировку по Ссылка.Список.Порядок.Установить(), убедитесь, что в качестве аргументов переданы все необходимые поля для однозначного определения порядка.Основное представление в 1С — это настройка визуального отображения, но для алгоритмов сортировки запроса критически важно оперировать физическими полями объекта, такими как Наименование, Код или Ссылка.Разбирая такие ситуации, мы всегда должны помнить, что предсказуемость — залог стабильной работы пользовательского интерфейса. Добавляя Ссылка в критерии сортировки, вы навсегда исключаете неопределенность в отображении данных.