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