В платформе 1С:Предприятие 7.7 стандартная форма списка справочника не поддерживает интерактивную сортировку по нажатию на заголовок таблицы «из коробки». Однако, благодаря расширению функционала через внешние компоненты, мы можем реализовать этот механизм самостоятельно. Давайте разберем, как добиться желаемого поведения.
Данный подход базируется на определении координат курсора в момент клика и сопоставлении их с областью заголовка таблицы. Мы будем использовать расширение ФормаРасш, предоставляемое компонентой FormEx.
Для реализации этого метода нам необходимо в модуле формы перехватить событие ПриНажатииЛевойКнопки. Рассмотрим алгоритм действий по шагам:
Пример программного кода для реализации данной логики:
Процедура ПриНажатииЛевойКнопки(сост, х , у, ФСО)
Атр = ФормаРасш.ПолучитьАтрибутПоКоординатам(х,у);
Если ТипЗначенияСтр(Атр) = "АтрибутФормы" Тогда
Если Атр.Заголовок = "МногострочнаяЧасть" Тогда
// Получаем координаты текущей ячейки для расчета области
ФормаРасш.ПолучитьКоординатыТекущейЯчейки("МногострочнаяЧасть",_хх,_уу,_ххх,_ууу,0);
ФормаРасш.ПолучитьКоординатыЯчейки("МногострочнаяЧасть",0,0,хх,уу,ххх,ууу,0);
// Если клик произошел в пределах области заголовка
Если (у > 0) и (у < хх) Тогда
КолонкаСортировки = Форма.ТекущаяКолонка();
Конт = глКонтекст(Контекст);
Спр = Метаданные.Справочник(Конт.Вид());
// Выполняем сортировку по выбранному полю
Если КолонкаСортировки = "Наименование" Тогда
Сортировка("Наименование");
ИначеЕсли КолонкаСортировки = "Код" Тогда
Сортировка("Код");
Иначе
// Проверяем возможность сортировки по реквизиту
Если Спр.Реквизит(КолонкаСортировки).Сортировка <> 0 Тогда
Сортировка(КолонкаСортировки);
Иначе
Предупреждение("Сортировка по этому реквизиту невозможна");
КонецЕсли;
КонецЕсли;
ФСО = 0; // Сбрасываем стандартную обработку события
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Важное примечание: При работе с координатами следует учитывать, что они могут зависеть от системных шрифтов и настроек DPI. Для обеспечения стабильной работы рекомендуется всегда тестировать поведение при различных разрешениях экрана.
Если задача требует более гибкого управления (например, сложной фильтрации или работы с большими объемами данных), профессиональным решением является использование библиотеки 1С++ и класса ПоставщикДанныхСправочник.
Этот подход позволяет полностью заменить стандартный механизм отображения списка на более мощный объект. В чем преимущества данного метода:
Сортировка(), класс берет управление запросами на себя.Browse.ПоставщикДанных позволяет оптимизировать выборку данных из базы, что значительно ускоряет работу с большими справочниками.Чтобы начать работу, необходимо скачать актуальную версию библиотеки с официального ресурса проекта 1С++. Обратите внимание на наличие примеров, которые идут в составе архива — там подробно описана инициализация поставщика данных и привязка его к табличному полю на форме.
Анализируя обе стратегии, мы рекомендуем следующий порядок действий:
FormEx. Это быстрый путь, требующий минимум правок в конфигурации.1С++. Это инвестиция времени, которая обеспечит стабильность и предсказуемость поведения системы в долгосрочной перспективе.Сортировка() в 1С 7.7 реквизиты справочника должны быть проиндексированы в метаданных, иначе производительность сортировки резко упадет на больших объемах данных.Не бойтесь экспериментировать с кодом. Если стандартные методы координат вызывают затруднения, попробуйте реализовать через FormEx получение точного прямоугольника заголовка (Bounding Box) с помощью вызовов WinAPI — это сделает ваше решение практически «неубиваемым» для любых пользовательских настроек Windows.