Разберем ситуацию, которая часто встречается при разработке интерфейсов на платформе 1С:Предприятие, применяя несколько приемов построения эффективных интерфейсов. Представим, что у нас есть форма со списком документов, реализованная через Динамический список. Мы настроили произвольный запрос, вывели колонки, но при попытке нажать на заголовок колонки в режиме пользователя ничего не происходит — сортировка либо не работает вовсе, либо жестко зафиксирована по одному полю (обычно по дате). Выясним причину такого поведения и рассмотрим шаги по исправлению ситуации.
Проанализируем фрагмент кода из запроса динамического списка, который часто становится камнем преткновения. Рассмотрим конструкцию ВЫБОР (CASE), используемую для формирования вычисляемых колонок:
ВЫБОР
КОГДА ЖурналДокументовitilprofServiceDesk.Статус.Порядок = 4
ИЛИ ЖурналДокументовitilprofServiceDesk.Проведен
ТОГДА ДОБАВИТЬКДАТЕ(ЖурналДокументовitilprofServiceDesk.Дата, ЧАС, &Смещение)
ИНАЧЕ ""
КОНЕЦ КАК ДатаИВремяЗавершения
В чем здесь кроется ошибка? Обратим внимание на возвращаемые значения. В первом случае (ветка ТОГДА) функция ДОБАВИТЬКДАТЕ возвращает значение типа Дата. Во втором случае (ветка ИНАЧЕ) возвращается пустая строка "". В результате колонка ДатаИВремяЗавершения получает составной тип данных (Дата и Строка).
Важный момент: Платформа 1С не может корректно выполнять индексацию и сортировку по колонкам с составным типом данных в динамическом списке. Для обеспечения работоспособности интерактивной сортировки все ветки условия должны возвращать значения одного типа. Вместо пустой строки следует использовать пустую дату.
Исправим запрос, приведя его к корректному виду:
ВЫБОР
КОГДА ЖурналДокументовitilprofServiceDesk.Статус.Порядок = 4
ИЛИ ЖурналДокументовitilprofServiceDesk.Проведен
ТОГДА ДОБАВИТЬКДАТЕ(ЖурналДокументовitilprofServiceDesk.Дата, ЧАС, &Смещение)
ИНАЧЕ ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
КОНЕЦ КАК ДатаИВремяЗавершения
Теперь колонка имеет строго определенный тип Дата, что позволяет механизму динамического списка включать её в индексы и выполнять сортировку на уровне СУБД.
Рассмотрим свойства самого динамического списка в конфигураторе. Когда мы включаем флаг «Произвольный запрос», под ним появляется поле «Основная таблица». Если оставить это поле пустым, динамический список лишается значительной части своего функционала.
Проанализируем, на что влияет этот параметр:
В нашем примере в качестве основной таблицы следует выбрать ЖурналДокументов.компы_СервисДеск. Это даст платформе понимание структуры данных и «разблокирует» штатные механизмы сортировки.
Посмотрим на следующую строку в запросе:
ВЫРАЗИТЬ(ЖурналДокументовitilprofServiceDesk.Номер КАК СТРОКА(24)) КАК Номер.
Если поле Номер в журнале документов изначально является строковым, то использование ВЫРАЗИТЬ избыточно. Однако, если оно преобразуется из другого типа, это создает «виртуальное» поле. СУБД не может использовать стандартный индекс поля Номер для сортировки результата функции. В некоторых случаях это приводит к тому, что платформа отключает возможность сортировки по данной колонке в динамическом списке для предотвращения критического падения производительности.
Рекомендуется выводить поля «как есть», без лишних преобразований типов внутри текста запроса, если по ним планируется активная работа пользователя (поиск, фильтрация, сортировка).
В исследуемом запросе мы видим использование левого соединения:
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.itilСобытияОбращенийДляИсполнителей КАК СобытияОбращений
ПО (СобытияОбращений.Обращение = ЖурналДокументовitilprofServiceDesk.Ссылка)
И (СобытияОбращений.Пользователь = &Пользователь)
Выясним, как это влияет на сортировку. Если пользователь попытается отсортировать список по полю ИндексКартинкиСобытия, которое зависит от наличия записи в таблице СобытияОбращений, платформа должна будет выполнить полное соединение таблиц перед сортировкой. Если в присоединенной таблице (регистре сведений) отсутствуют подходящие индексы по полям связи (Обращение, Пользователь), производительность резко упадет. Платформа 1С может превентивно ограничивать сортировку по таким полям в динамических списках с большой нагрузкой.
Иногда корень проблемы лежит не в запросе, а в свойствах самого элемента формы. Если визуальные настройки вызывают сложности, можно использовать редактор форм в режиме предприятия для анализа свойств объектов. Разберем шаги проверки интерфейсных настроек:
Таблица, связанный с нашим динамическим списком.Использовать при сортировке (или Разрешить сортировку в зависимости от версии платформы). Если там стоит значение «Нет» или «Ложь», клик по шапке не будет давать эффекта.Если в окне настройки списка пользователь видит только вкладку «Основные», это означает, что настройки сортировки скрыты программно или через свойства ДС. Помимо стандартного поведения, в современных интерфейсах часто требуется программное перемещение колонки динамического списка или интеграция элементов управления, таких как флажок в динамическом списке. Проанализируем настройки состава настроек:
В окне редактирования динамического списка на вкладке «Настройки» (внизу под текстом запроса) необходимо убедиться, что нужные поля включены в «Пользовательские настройки». Для этого нужно нажать на иконку «звездочки» или «шестеренки» рядом с полем. Если поле не включено в состав пользовательских настроек, оно может быть недоступно для интерактивной манипуляции в режиме предприятия.
Для восстановления работоспособности сортировки выполним следующие действия:
"" в CASE на ДАТАВРЕМЯ(1, 1, 1) или 0 (в зависимости от типа колонки).ПО при соединениях, проиндексированы.Таблица была разрешена сортировка, а в настройках самого списка поля были открыты для пользовательских правок.Применение этих шагов позволит вернуть динамическому списку его стандартное поведение, обеспечив пользователю удобный и быстрый поиск информации через клики по заголовкам колонок.