В процессе разработки на платформе 1С:Предприятие 8.3 программисты часто сталкиваются с ситуацией, когда настройки динамического списка (отборы, сортировка, условное оформление), заданные в конфигураторе, «игнорируются» системой в пользовательском режиме. Особенно часто это касается сортировки (порядка). Вы можете настроить идеальный порядок строк в окне свойств динамического списка, но при запуске предприятия список остается неупорядоченным или сохраняет старую сортировку. Разберем детально, почему это происходит и как гарантированно применить нужные настройки.
Первое и самое важное, что нам необходимо понять: система компоновки данных (СКД), на которой базируется динамический список, имеет строгую иерархию настроек. Рассмотрим этот «слоеный пирог» подробнее:
ПриСозданииНаСервере).Проблема заключается в том, что пользовательские настройки имеют приоритет над настройками разработчика. Если вы изменили сортировку в конфигураторе, но у пользователя уже сохранены старые (или пустые) настройки, 1С применит именно их. Чтобы проверить эту версию, попробуйте в пользовательском режиме нажать кнопку «Еще» — «Установить стандартные настройки». Если после этого сортировка появилась — значит, дело было именно в кэшированных настройках пользователя.
Проанализируем свойства самой формы. У формы есть свойство АвтоматическоеСохранениеДанныхВНастройках. Если оно включено, и в списке сохраняемых реквизитов отмечен наш динамический список, то 1С будет при открытии формы восстанавливать состояние списка (включая положение курсора, группировки и сортировку) из последнего сеанса. Это поведение часто перекрывает любые попытки задать настройки «статично» в конфигураторе.
Если нам нужно, чтобы пользователь не мог изменять или сбрасывать установленную нами сортировку, следует использовать механизм фиксированных настроек. Выясним разницу:
Список.КомпоновщикНастроек.Настройки — это те настройки, которые доступны пользователю через меню «Настроить список».Список.КомпоновщикНастроек.ФиксированныеНастройки — это «жесткие» настройки. Они накладываются поверх всех остальных, не видны пользователю в стандартном окне настройки и не могут быть им изменены.Если ваша задача — принудительно задать порядок, который не должен меняться, фиксированные настройки — лучший выбор.
Рассмотрим наиболее надежный способ — установку сортировки программным кодом при открытии формы. Это позволяет обойти проблемы с кэшем и гарантирует, что при каждом открытии список будет выглядеть именно так, как задумал разработчик. Посмотрим на пример кода, который можно разместить в процедуре ПриСозданииНаСервере:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// 1. Очищаем текущие настройки порядка, если они есть
ЭтаФорма.Список.Порядок.Элементы.Очистить();
// 2. Добавляем сортировку по полю "ДатаДокумента"
ЭлементПорядка = ЭтаФорма.Список.Порядок.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных"));
ЭлементПорядка.Поле = Новый ПолеКомпоновкиДанных("Дата"); // Имя поля из запроса или метаданных
ЭлементПорядка.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Возр;
ЭлементПорядка.Использование = Истина;
ЭлементПорядок.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный;
// 3. Добавляем второстепенную сортировку по ссылке для стабильности результата
ЭлементПорядкаСсылка = ЭтаФорма.Список.Порядок.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных"));
ЭлементПорядкаСсылка.Поле = Новый ПолеКомпоновкиДанных("Ссылка");
ЭлементПорядкаСсылка.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Возр;
ЭлементПорядкаСсылка.Использование = Истина;
КонецПроцедуры
В данном примере мы сначала очищаем коллекцию Порядок.Элементы. Это важно, так как если там уже были элементы (например, от пользователя), наш новый элемент просто добавится в конец, и приоритет будет у первого элемента в списке.
Разберем еще один важный нюанс. Чтобы пользователь видел, какая сортировка установлена, и мог ею управлять прямо на форме (без захода в глубокие настройки), мы можем использовать свойство «Группа пользовательских настроек».
Список найдите поле ГруппаПользовательскихНастроек и выберите созданную группу.После этого элементы управления сортировкой появятся прямо над списком. Однако помните: если вы программно меняете Список.КомпоновщикНастроек.Настройки.Порядок, эти изменения должны корректно отразиться в этой группе.
Проанализируем ситуацию, когда сортировка вроде бы задана, но список «тормозит» или данные отображаются хаотично. Проверьте свойство ОсновнаяТаблица в настройках динамического списка. Если динамический список строится по произвольному запросу и основная таблица не указана, платформа не может эффективно оптимизировать SQL-запрос. В этом случае сортировка по полям, которые выбираются через ЛЕВОЕ СОЕДИНЕНИЕ, может работать некорректно или крайне медленно.
Совет: Всегда указывайте основную таблицу, если это возможно. Это позволит платформе использовать индексацию таблиц базы данных при выполнении сортировки.
Выяснив причины, мы можем составить краткий алгоритм действий, если сортировка не работает:
ФиксированныеНастройки.Порядок.Элементы в процедуре ПриСозданииНаСервере.