Как настроить сортировку по булевому реквизиту в табличной части на обычных формах 1С?

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

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

Выясняем причину: почему стандартная сортировка недоступна?

Для начала проанализируем ситуацию и поймем логику работы самой платформы 1С. Возможность интерактивной сортировки колонки табличного поля напрямую зависит от того, заполнено ли свойство «Данные» (Data) этой колонки.

Когда мы выводим булево поле на форму в виде флажка, стандартный и наиболее очевидный путь — настроить свойство ДанныеФлажка (указав туда наш реквизит, например, ИмяРеквизитаБулево), а свойство Данные оставить пустым. Мы делаем так для того, чтобы в ячейке отображался только красивый флажок (галочка) без сопутствующего текста «Да» или «Нет», который дублирует информацию и перегружает интерфейс.

Но здесь кроется подвох: если свойство Данные у колонки пустое, платформа считает эту колонку несвязанной с физическим реквизитом напрямую. Как результат, контекстное меню «Сортировать по возрастанию / убыванию» для этой колонки становится недоступным, а кнопки сортировки на командной панели не реагируют на выбор этого поля. Наша задача — обойти это ограничение, сохранив при этом лаконичный внешний вид флажка без лишнего текста.

---

Решение 1. Использование свойства «Данные» и очистка текста при выводе строк

Рассмотрим самый надежный и производительный способ, который позволяет задействовать штатные механизмы платформы 1С без написания сложного кода сортировки. Идея заключается в том, чтобы обмануть платформу: мы укажем реквизит в свойстве Данные, чтобы активировать сортировку, а мешающий нам текст «Да»/«Нет» будем оперативно удалять программно при отрисовке интерфейса.

Выполним настройку по шагам:

  1. Откроем свойства проблемной колонки в конфигураторе на нашей обычной форме.
  2. Найдем свойство «Данные» и выберем в нем наш реквизит табличной части (например, Акция или Выбрано).
  3. В свойстве «ДанныеФлажка» укажем этот же реквизит.
  4. Запустим отладку. Теперь мы увидим, что сортировка стала доступна! Но в ячейках рядом с флажками появился текст «Да» или «Нет». Избавимся от него.

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

Создадим обработчик события табличного поля и напишем следующий код:


Процедура ИмяТабличногоПоляПриПолученииДанных(Элемент, ОформленияСтрок)
    
    // Перебираем коллекцию оформлений строк, которые выводятся на экран
    Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
        
        // Очищаем текстовое представление в ячейке нашей булевой колонки
        ОформлениеСтроки.Ячейки.ИмяКолонкиБулево.Текст = "";
        
    КонецЦикла;

КонецПроцедуры

В этом коде замените ИмяКолонкиБулево на реальное имя колонки на вашей форме. Теперь при выводе строк на экран платформа будет формировать стандартное представление, но перед показом пользователю код очистит текст, оставив только аккуратный интерактивный флажок. Сортировка при этом продолжит прекрасно работать!

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


Процедура ИмяТабличногоПоляПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
    
    // Очищаем текст конкретной выводимой ячейки
    ОформлениеСтроки.Ячейки.ИмяКолонкиБулево.Текст = "";

КонецПроцедуры

---

Решение 2. Программная сортировка по клику на заголовок колонки

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

Проанализируем этот подход по шагам:

  1. Для начала запретим пользователю перетаскивать эту колонку, чтобы клик по заголовку обрабатывался однозначно. Для этого у колонки табличного поля установим свойство «Разрешить перетаскивание» в значение Ложь.
  2. Для обработки клика по заголовку нам потребуется использовать событие табличного поля ЗаголовокНажатие.
  3. Внутри обработчика мы будем вызывать стандартный метод табличной части Сортировать().

Посмотрим на пример реализации такого обработчика:


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

КонецПроцедуры

При использовании этого метода нам не нужно привязывать колонку через свойство Данные и очищать текст, так как колонка может работать исключительно через ДанныеФлажка. Однако стоит учитывать, что этот метод физически меняет порядок строк в самом объекте (в табличной части документа или справочника), что приведет к модификации объекта и необходимости его перезаписи пользователем при закрытии формы.

---

Нюансы для динамических списков (справочники и документы)

Важно не путать табличную часть объекта (которую мы рассмотрели выше) и динамические списки (например, форму списка документов или справочника). В динамических списках на обычных формах за сортировку и отборы отвечает специальный объект платформы — НастройкаПорядка.

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


ЭлементыФормы.ИмяСписка.НастройкаПорядка.ИмяБулевоРеквизита.Доступность = Истина;

Но поскольку для табличных частей объектов класс НастройкаПорядка платформой не предусмотрен, для них применимы только два подробно описанных нами выше сценария (с заполнением свойства Данные и очисткой текста, либо с прямой программной сортировкой коллекции).

Подводя итог, наиболее красивым и стандартным решением для обычных форм является Решение 1. Оно сохраняет стандартное поведение платформы, не нагружает базу данных физическим изменением порядка строк в документе и требует написания всего нескольких строк простого и понятного кода. Используйте его в своих проектах для создания удобных и интуитивно понятных интерфейсов!

← На главную