Как работает сортировка по умолчанию в регистре сведений 1С и как управлять порядком записей

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

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

Почему возникает иллюзия случайного порядка записей

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

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

  1. Кластерный индекс таблицы: В СУБД физический порядок хранения строк непериодического независимого регистра строится по кластерному индексу, сформированному всеми его измерениями: Измерение1 + Измерение2 + ....
  2. Бинарный порядок ссылочных полей (GUID): Если измерения имеют ссылочный тип (например, ссылки на справочники или документы), в базе данных они хранятся в виде 16-байтных бинарных идентификаторов (UUID / GUID). СУБД сортирует записи не по алфавиту наименований, а по значению байтов идентификатора. Если у вручную добавленных элементов бинарные GUID оказались «старше» сгенерированных программно, такие записи всегда будут выводиться в самом конце таблицы.
  3. Порционная выборка динамического списка: Для постраничного чтения данных платформа неявно добавляет к SQL-запросу выборки предложение упорядочивания по ключевым полям таблицы (по всем измерениям). Поэтому результат выборки строго следует порядку кластерного индекса СУБД.

Способ 1. Добавление служебных полей для фиксации хронологии

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

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

Способ 2. Явная программная настройка порядка в динамическом списке

Разберем, как принудительно зафиксировать сортировку динамического списка формы программным способом через компоновщик настроек. Добавим необходимый код в модуль формы списка:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Очищаем текущие фиксированные настройки порядка при необходимости
    Список.КомпоновщикНастроек.ФиксированныеНастройки.Порядок.Элементы.Очистить();
    
    // Создаем элемент порядка компоновки данных
    ЭлементПорядка = Список.КомпоновщикНастроек.ФиксированныеНастройки.Порядок.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных"));
    ЭлементПорядка.Поле = Новый ПолеКомпоновкиДанных("ИмяИзмерения");
    ЭлементПорядка.ТипУпорядочивания = ТипУпорядочиванияКомпоновкиДанных.Возр;
    ЭлементПорядка.Использование = Истина;
    
КонецПроцедуры

Важный момент: если сортировка настраивается по ссылочному полю, платформа выполняет неявное соединение (LEFT JOIN) с таблицей соответствующего ссылочного объекта для сортировки по строковому представлению (наименованию или коду). На больших объемах данных это может влиять на скорость открытия формы.

Способ 3. Интерактивная настройка порядка в свойствах динамического списка

Посмотрим, как задать порядок отображения строк без написания программного кода:

  1. Откроем форму списка регистра сведений в конфигураторе.
  2. Выделим реквизит формы Список (динамический список).
  3. В палитре свойств найдем свойство Настройки списка и нажмем кнопку открытия (три точки).
  4. Перейдем на вкладку Порядок, добавим нужные поля и выберем направление сортировки (по возрастанию или по убыванию).

Способ 4. Использование произвольного запроса в динамическом списке

Выясним, как управлять сортировкой с помощью текста запроса динамического списка:

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

ВЫБРАТЬ
    Регистр.Измерение1 КАК Измерение1,
    Регистр.Измерение2 КАК Измерение2,
    Регистр.Ресурс1 КАК Ресурс1
ИЗ
    РегистрСведений.МойРегистрСведений КАК Регистр
УПОРЯДОЧИТЬ ПО
    Измерение1 ВОЗР,
    Измерение2 ВОЗР

Использование явного упорядочивания делает отображение данных детерминированным и предсказуемым для пользователей, устраняя зависимость от внутреннего бинарного порядка ссылок в СУБД.

← На главную