Как переопределить или настроить пользовательскую сортировку в динамическом списке 1С?

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

При работе с динамическими списками в 1С:Предприятие 8.3 разработчики часто сталкиваются с проблемой «неправильной» сортировки. Типичный пример: текстовое поле содержит числовые значения (например, номера документов или артикулы). При стандартной сортировке платформа выстраивает их в лексикографическом порядке: «1», «10», «100», «2». Для пользователя это выглядит как ошибка, так как он ожидает математическую последовательность. В этой статье мы подробно разберем, как переопределить поведение списка, подменить поля сортировки или вовсе ограничить пользователю возможность менять порядок в «проблемных» колонках.

Метод 1. Использование пользовательских полей (самый эффективный способ)

Разберем ситуацию, когда в списке есть текстовое поле НомерСтрокой и числовое поле НомерЧислом. Мы хотим, чтобы при клике на заголовок текстового поля система фактически выполняла сортировку по числу. Один из самых изящных способов — использование пользовательских полей компоновки данных.

Проанализируем шаги настройки:

  1. Откроем настройки динамического списка (свойство НастройкаСписка в конфигураторе или программно через КомпоновщикНастроек).
  2. Перейдем к созданию Пользовательского поля-выражения.
  3. В поле Выражение детальных записей укажем наше числовое поле: НомерЧислом. Именно по нему будет выполняться физическая сортировка.
  4. В поле Выражение представления укажем текстовое поле: НомерСтрокой. Это то, что увидит пользователь в ячейке.

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

Метод 2. Программное ограничение сортировки по конкретной колонке

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

Посмотрим на пример кода:


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

После выполнения этого кода клик по заголовку колонки «Наименование» перестанет вызывать перестроение списка. Это отличный способ направить пользователя к использованию специально подготовленных кнопок сортировки.

Метод 3. Нормализация строк в запросе (метод дополнения нулями)

Проанализируем ситуацию, когда у нас нет отдельного числового поля, а данные хранятся только в строковом виде (например, «1а», «10б», «2»). В языке запросов 1С нет функции приведения типов CAST AS NUMBER для произвольных строк, но мы можем применить хитрость с дополнением строки ведущими нулями для выравнивания длины.

Рассмотрим пример реализации такого поля в тексте запроса динамического списка:


ВЫБРАТЬ
    Таблица.Ссылка,
    Таблица.Наименование,
    // Создаем скрытое поле для сортировки
    ПРАВО("0000000000" + Таблица.Наименование, 10) КАК ПолеДляСортировки
ИЗ
    Справочник.МойСправочник КАК Таблица

Выясним причину, почему это работает: при добавлении ведущих нулей строки «1», «2» и «10» превратятся в «0000000001», «0000000002» и «0000000010». В этом случае лексикографическая сортировка (посимвольное сравнение) совпадет с математической. Вы можете добавить это поле в настройки порядка по умолчанию, а само поле скрыть от пользователя.

Метод 4. Программное управление порядком (объект Порядок)

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


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

Этот метод позволяет полностью контролировать логику отображения данных, игнорируя стандартные механизмы платформы, которые могут сбивать пользователя с толку.

Важные нюансы при работе с «ВЫРАЗИТЬ»

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

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

← На главную