Почему не работает сортировка по шапке в динамическом списке 1С и как это исправить?

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

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

Проблема 1: Несоответствие типов данных в полях запроса

Проанализируем фрагмент кода из запроса динамического списка, который часто становится камнем преткновения. Рассмотрим конструкцию ВЫБОР (CASE), используемую для формирования вычисляемых колонок:


ВЫБОР
    КОГДА ЖурналДокументовitilprofServiceDesk.Статус.Порядок = 4
            ИЛИ ЖурналДокументовitilprofServiceDesk.Проведен
        ТОГДА ДОБАВИТЬКДАТЕ(ЖурналДокументовitilprofServiceDesk.Дата, ЧАС, &Смещение)
    ИНАЧЕ ""
КОНЕЦ КАК ДатаИВремяЗавершения

В чем здесь кроется ошибка? Обратим внимание на возвращаемые значения. В первом случае (ветка ТОГДА) функция ДОБАВИТЬКДАТЕ возвращает значение типа Дата. Во втором случае (ветка ИНАЧЕ) возвращается пустая строка "". В результате колонка ДатаИВремяЗавершения получает составной тип данных (Дата и Строка).

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

Исправим запрос, приведя его к корректному виду:


ВЫБОР
    КОГДА ЖурналДокументовitilprofServiceDesk.Статус.Порядок = 4
            ИЛИ ЖурналДокументовitilprofServiceDesk.Проведен
        ТОГДА ДОБАВИТЬКДАТЕ(ЖурналДокументовitilprofServiceDesk.Дата, ЧАС, &Смещение)
    ИНАЧЕ ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
КОНЕЦ КАК ДатаИВремяЗавершения

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

Проблема 2: Отсутствие настройки «Основная таблица»

Рассмотрим свойства самого динамического списка в конфигураторе. Когда мы включаем флаг «Произвольный запрос», под ним появляется поле «Основная таблица». Если оставить это поле пустым, динамический список лишается значительной части своего функционала.

Проанализируем, на что влияет этот параметр:

  1. Оптимизация выборки: Без основной таблицы система не знает, по какому ключу (ссылке) наиболее эффективно позиционироваться и выбирать данные порциями.
  2. Интерактивные возможности: Стандартные команды «Установить отбор», «Сортировка по возрастанию/убыванию» и «Найти» часто блокируются для полей, которые не принадлежат явно указанной основной таблице.
  3. Состав настроек: Именно наличие основной таблицы позволяет пользователю в режиме «Все действия» — «Настроить список» видеть вкладки «Сортировка», «Группировка» и «Условное оформление».

В нашем примере в качестве основной таблицы следует выбрать ЖурналДокументов.компы_СервисДеск. Это даст платформе понимание структуры данных и «разблокирует» штатные механизмы сортировки.

Проблема 3: Использование функции ВЫРАЗИТЬ для ключевых полей

Посмотрим на следующую строку в запросе: ВЫРАЗИТЬ(ЖурналДокументовitilprofServiceDesk.Номер КАК СТРОКА(24)) КАК Номер.

Если поле Номер в журнале документов изначально является строковым, то использование ВЫРАЗИТЬ избыточно. Однако, если оно преобразуется из другого типа, это создает «виртуальное» поле. СУБД не может использовать стандартный индекс поля Номер для сортировки результата функции. В некоторых случаях это приводит к тому, что платформа отключает возможность сортировки по данной колонке в динамическом списке для предотвращения критического падения производительности.

Рекомендуется выводить поля «как есть», без лишних преобразований типов внутри текста запроса, если по ним планируется активная работа пользователя (поиск, фильтрация, сортировка).

Проблема 4: Ограничения при использовании соединений (JOIN)

В исследуемом запросе мы видим использование левого соединения:


ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.itilСобытияОбращенийДляИсполнителей КАК СобытияОбращений
ПО (СобытияОбращений.Обращение = ЖурналДокументовitilprofServiceDesk.Ссылка)
    И (СобытияОбращений.Пользователь = &Пользователь)

Выясним, как это влияет на сортировку. Если пользователь попытается отсортировать список по полю ИндексКартинкиСобытия, которое зависит от наличия записи в таблице СобытияОбращений, платформа должна будет выполнить полное соединение таблиц перед сортировкой. Если в присоединенной таблице (регистре сведений) отсутствуют подходящие индексы по полям связи (Обращение, Пользователь), производительность резко упадет. Платформа 1С может превентивно ограничивать сортировку по таким полям в динамических списках с большой нагрузкой.

Проблема 5: Настройки элемента формы «Таблица»

Иногда корень проблемы лежит не в запросе, а в свойствах самого элемента формы. Если визуальные настройки вызывают сложности, можно использовать редактор форм в режиме предприятия для анализа свойств объектов. Разберем шаги проверки интерфейсных настроек:

  1. Откроем форму в конфигураторе и выберем элемент Таблица, связанный с нашим динамическим списком.
  2. Проверим свойство «Разрешить изменение порядка» (для управляемых форм) или наличие галочки «Сортировка» в составе командной панели. Для автоматизации подобных действий разработчиками часто используется программное изменение форм.
  3. Раскроем дерево колонок таблицы. Для каждой колонки, по которой должна работать сортировка, проверим свойство Использовать при сортировке (или Разрешить сортировку в зависимости от версии платформы). Если там стоит значение «Нет» или «Ложь», клик по шапке не будет давать эффекта.

Проблема 6: Доступность пользовательских настроек

Если в окне настройки списка пользователь видит только вкладку «Основные», это означает, что настройки сортировки скрыты программно или через свойства ДС. Помимо стандартного поведения, в современных интерфейсах часто требуется программное перемещение колонки динамического списка или интеграция элементов управления, таких как флажок в динамическом списке. Проанализируем настройки состава настроек:

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

Итоговые рекомендации по исправлению

Для восстановления работоспособности сортировки выполним следующие действия:

  1. Унифицируем типы: Заменим все пустые строки "" в CASE на ДАТАВРЕМЯ(1, 1, 1) или 0 (в зависимости от типа колонки).
  2. Назначим основную таблицу: В свойствах динамического списка укажем главную таблицу метаданных.
  3. Проверим индексы: Убедимся, что поля, участвующие в ПО при соединениях, проиндексированы.
  4. Включим настройки: Проверим, чтобы в элементе формы Таблица была разрешена сортировка, а в настройках самого списка поля были открыты для пользовательских правок.

Применение этих шагов позволит вернуть динамическому списку его стандартное поведение, обеспечив пользователю удобный и быстрый поиск информации через клики по заголовкам колонок.

← На главную