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

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

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

Метод 1: Использование перехвата событий мыши через FormEx

Данный подход базируется на определении координат курсора в момент клика и сопоставлении их с областью заголовка таблицы. Мы будем использовать расширение ФормаРасш, предоставляемое компонентой FormEx.

Для реализации этого метода нам необходимо в модуле формы перехватить событие ПриНажатииЛевойКнопки. Рассмотрим алгоритм действий по шагам:

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

Пример программного кода для реализации данной логики:


Процедура ПриНажатииЛевойКнопки(сост, х , у, ФСО)
    Атр = ФормаРасш.ПолучитьАтрибутПоКоординатам(х,у);
    Если ТипЗначенияСтр(Атр) = "АтрибутФормы" Тогда
        Если Атр.Заголовок = "МногострочнаяЧасть" Тогда
            // Получаем координаты текущей ячейки для расчета области
            ФормаРасш.ПолучитьКоординатыТекущейЯчейки("МногострочнаяЧасть",_хх,_уу,_ххх,_ууу,0);
            ФормаРасш.ПолучитьКоординатыЯчейки("МногострочнаяЧасть",0,0,хх,уу,ххх,ууу,0);
            
            // Если клик произошел в пределах области заголовка
            Если (у > 0) и (у < хх) Тогда
                КолонкаСортировки = Форма.ТекущаяКолонка();
                Конт = глКонтекст(Контекст);
                Спр = Метаданные.Справочник(Конт.Вид());
                
                // Выполняем сортировку по выбранному полю
                Если КолонкаСортировки = "Наименование" Тогда
                    Сортировка("Наименование");
                ИначеЕсли КолонкаСортировки = "Код" Тогда
                    Сортировка("Код");
                Иначе
                    // Проверяем возможность сортировки по реквизиту
                    Если Спр.Реквизит(КолонкаСортировки).Сортировка <> 0 Тогда
                        Сортировка(КолонкаСортировки);
                    Иначе
                        Предупреждение("Сортировка по этому реквизиту невозможна");
                    КонецЕсли;
                КонецЕсли;
                ФСО = 0; // Сбрасываем стандартную обработку события
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

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

Метод 2: Использование библиотеки 1С++ и класса ПоставщикДанных

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

Этот подход позволяет полностью заменить стандартный механизм отображения списка на более мощный объект. В чем преимущества данного метода:

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

Рекомендации по реализации

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

  1. Если задача разовая и справочник небольшой, используйте метод с FormEx. Это быстрый путь, требующий минимум правок в конфигурации.
  2. Если вы планируете внедрять такой функционал массово или работаете в высоконагруженной системе, используйте 1С++. Это инвестиция времени, которая обеспечит стабильность и предсказуемость поведения системы в долгосрочной перспективе.
  3. Помните, что для метода Сортировка() в 1С 7.7 реквизиты справочника должны быть проиндексированы в метаданных, иначе производительность сортировки резко упадет на больших объемах данных.

Не бойтесь экспериментировать с кодом. Если стандартные методы координат вызывают затруднения, попробуйте реализовать через FormEx получение точного прямоугольника заголовка (Bounding Box) с помощью вызовов WinAPI — это сделает ваше решение практически «неубиваемым» для любых пользовательских настроек Windows.

← На главную