Почему не работает сортировка в динамическом списке по клику на колонку и как это исправить

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

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

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

Влияние структуры запроса: Группировки и объединения

Проанализируем самую частую причину блокировки — текст запроса динамического списка. Платформа 1С проектирует SQL-запросы к базе данных динамически. Когда пользователь кликает по шапке, система пытается добавить в итоговый запрос конструкцию УПОРЯДОЧИТЬ ПО (ORDER BY). Однако существуют правила языка запросов, которые делают это невозможным.

Разберем ситуацию, когда в запросе используется оператор СГРУППИРОВАТЬ ПО (GROUP BY). Если ваш основной запрос содержит группировку, платформа не может просто так добавить поле в секцию порядка, если это поле не входит в агрегатные функции или список группировки. В результате интерактивная сортировка отключается. Аналогичная проблема возникает при использовании оператора ОБЪЕДИНИТЬ (UNION).

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

Допустим, у нас был такой запрос:


ВЫБРАТЬ
    Документ.Ссылка КАК Ссылка,
    СУММА(Документ.Сумма) КАК СуммаИтого
ИЗ
    Документ.Продажи КАК Документ
СГРУППИРОВАТЬ ПО
    Документ.Ссылка

Чтобы сортировка заработала, обернем его во вложенный запрос:


ВЫБРАТЬ
    ВложенныйЗапрос.Ссылка,
    ВложенныйЗапрос.СуммаИтого
ИЗ
    (ВЫБРАТЬ
        Документ.Ссылка КАК Ссылка,
        СУММА(Документ.Сумма) КАК СуммаИтого
    ИЗ
        Документ.Продажи КАК Документ
    СГРУППИРОВАТЬ ПО
        Документ.Ссылка) КАК ВложенныйЗапрос

Важно помнить, что использовать нужно именно вложенный запрос, а не временные таблицы, так как динамический список не поддерживает работу с временными таблицами в основном тексте запроса без дополнительных программных манипуляций.

Наличие жесткой сортировки в тексте запроса

Еще одна типичная ошибка — включение конструкции УПОРЯДОЧИТЬ ПО непосредственно в текст запроса динамического списка в конструкторе. Если в самом тексте запроса прописан жесткий порядок, это часто конфликтует с механизмом интерактивной сортировки.

Рассмотрим правильный подход: удалите УПОРЯДОЧИТЬ ПО из текста запроса. Если вам нужно, чтобы при открытии формы список всегда был отсортирован определенным образом, используйте вкладку «Настройки компоновки данных» в окне редактирования динамического списка. Перейдите на закладку «Порядок» и укажите нужные поля там. В этом случае платформа установит начальный порядок, но позволит пользователю менять его кликом по шапке.

Настройки пользовательской видимости порядка

Иногда причина кроется не в коде, а в свойствах компоновщика настроек. Динамический список работает на базе Системы компоновки данных (СКД). Выясним, как настройки влияют на доступность полей.

Посмотрим на настройки динамического списка в конфигураторе:

  1. Откройте свойства динамического списка.
  2. Нажмите на ссылку «Открыть» у параметра Настройки компоновки данных.
  3. Перейдите на закладку «Порядок».
  4. Найдите в нижней части окна таблицу «Пользовательские настройки» (флажок с изображением человека).

Если для настройки порядка не стоит флаг «Включать в пользовательские настройки», это в некоторых версиях платформы может приводить к невозможности интерактивного изменения порядка. Убедитесь, что пользователь имеет право управлять порядком этих полей.

Ограничения типов данных

Проанализируем поля, по которым не удается совершить сортировку. Платформа 1С накладывает фундаментальные ограничения на некоторые типы данных, так как СУБД (например, MS SQL Server или PostgreSQL) не могут эффективно или однозначно их индексировать и упорядочивать.

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

Визуальные группы и свойства элементов формы

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

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

Особенности даты и времени

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

Программный запрет в коде формы

Если все настройки в конфигураторе верны, но сортировка всё равно не работает, стоит заглянуть в модуль формы. Проанализируем процедуру ПриСозданииНаСервере. Разработчики иногда жестко фиксируют настройки списка, что блокирует действия пользователя.

Пример кода, который может влиять на поведение:


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

Также стоит проверить свойство таблицы «Режим выделения». Если установлен иерархический режим, помните, что сортировка происходит внутри каждой группы (папки) отдельно. Это стандартное поведение платформы: элементы не выстраиваются в «плоский» список, а ранжируются только среди своих «соседей» по иерархии.

Резюме: контрольный список для проверки

Если у вас не работает сортировка по клику, пройдите по следующим шагам:

  1. Проверьте текст запроса на наличие СГРУППИРОВАТЬ, ОБЪЕДИНИТЬ или УПОРЯДОЧИТЬ ПО. Удалите их или используйте вложенный запрос.
  2. Убедитесь, что поле не является строкой неограниченной длины.
  3. Проверьте вкладку «Порядок» в настройках компоновки данных списка — включены ли поля в пользовательские настройки.
  4. Убедитесь, что колонка на форме не спрятана внутрь группы, скрывающей заголовки дочерних элементов.
  5. Проверьте, нет ли программной перезаписи порядка в модуле формы, которая может блокировать интерактивность.

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

← На главную