Работая с классическими конфигурациями на платформе 1С:Предприятие 7.7, такими как "Торговля и Склад 9.2", разработчики часто сталкиваются с неочевидным поведением интерфейса. Казалось бы, в Конфигураторе у реквизита установлены все необходимые флаги (индексация, сортировка), в файле словаря данных .DD (для SQL-версий) мы видим созданные индексы, но в режиме "Предприятие" заветный пункт меню "Сортировка -> По реквизиту" остается недоступным или в списке просто отсутствует нужный тип данных. Рассмотрим подробнее, почему так происходит и как реализовать требуемую функциональность.
Разберем ситуацию, описанную в теме. У нас есть справочник Номенклатура и реквизит ВидНоменклатуры, имеющий тип Перечисление.ВидыНоменклатуры. Несмотря на установленный флаг "Сортировка", пользователь не может интерактивно упорядочить список по этому полю. Выясним причину этого поведения.
В платформе 1С 7.7 существует жесткое разделение типов данных на примитивные и агрегатные (ссылочные). Интерактивная сортировка в списках (через контекстное меню правой кнопки мыши) реализована на уровне ядра системы только для трех примитивных типов:
Реквизиты типа Перечисление, Справочник или Документ относятся к агрегатным типам. Хотя в базе данных (особенно в SQL-варианте) они могут храниться в виде строк (ID в 36-ричной системе), для визуального интерфейса 1С они являются объектами. Платформа блокирует интерактивную сортировку по ним, поскольку сортировка по внутреннему идентификатору ссылки часто не совпадает с алфавитным порядком их строкового представления (синонимов), что ввело бы пользователя в заблуждение.
Проанализируем сообщение №5 из обсуждения: флаг "Сортировка" в Конфигураторе действительно создает индекс в базе данных. Этот индекс позволяет выполнять программную сортировку или быстрый поиск (например, через метод ВыбратьЭлементыПоРеквизиту()), но он не дает автоматического права на появление пункта в пользовательском интерфейсе для агрегатных типов.
Самый надежный и общепринятый способ обойти это ограничение — создание вспомогательного (служебного) реквизита примитивного типа. Рассмотрим по шагам, как это реализовать:
Номенклатура.ВидДляСортировки.ПриЗаписи().Добавим код, который будет копировать текстовое представление перечисления в наше новое строковое поле:
Процедура ПриЗаписи()
// Копируем строковое представление перечисления в реквизит для сортировки
Если Выбран() = 1 Тогда
ВидДляСортировки = Строка(ВидНоменклатуры);
КонецЕсли;
КонецПроцедуры
Важный нюанс: Чтобы заполнить это поле для уже существующих элементов справочника, потребуется написать простую обработку, которая переберет всю номенклатуру и выполнит Записать() для каждого элемента. После этого в режиме "Предприятие" пользователь сможет выбрать ВидДляСортировки в меню и список будет корректно упорядочен.
Если нам не нужно, чтобы пользователь постоянно переключал сортировку, а достаточно того, чтобы список при открытии всегда был упорядочен по виду номенклатуры, мы можем воспользоваться программным методом УстановитьСортировку(). Как было отмечено в обсуждении, программно платформа позволяет использовать реквизиты перечислений, если для них взведен флаг "Сортировка".
Рассмотрим пример кода в Модуле формы списка справочника:
Процедура ПриОткрытии()
// Устанавливаем сортировку по реквизиту "ВидНоменклатуры"
// Второй параметр 1 означает включение сортировки
УстановитьСортировку("ВидНоменклатуры", 1);
КонецПроцедуры
Проанализируем этот метод: при открытии формы список автоматически выстроится по видам. Однако помните, что если пользователь кликнет на заголовок колонки "Наименование" или выберет другой вариант сортировки через меню, вернуться обратно к "Виду" он не сможет (так как в списке доступных по правой кнопке мыши этого поля по-прежнему не будет). В таком случае можно добавить на форму специальную кнопку с текстом "Сортировать по виду", которая будет вызывать этот код.
Существует специфическая особенность 1С 7.7: если реквизит имеет тип "Неопределенный", платформа разрешает интерактивную сортировку по нему. Рассмотрим, как это работает, но сразу предупредим о рисках.
Если вы измените тип реквизита ВидНоменклатуры с Перечисление.ВидыНоменклатуры на Неопределенный, система позволит выбрать его в меню сортировки. Однако этот метод считается "грязным хаком" (костылем) по следующим причинам:
Мы выяснили, что отсутствие возможности интерактивной сортировки по перечислению в 1С 7.7 — это не ошибка конфигурации "Торговля и Склад", а сознательное ограничение платформы. Для реализации удобного интерфейса для пользователя наиболее правильным путем будет создание дублирующего строкового реквизита. Это обеспечит и высокую скорость работы (за счет индекса), и интуитивно понятное поведение программы для конечного пользователя.
Также не забывайте про флаг "Отбор". Хотя в сообщении №6 утверждается, что он не влияет на сортировку, это не совсем так. В 1С 7.7 флаг "Отбор" позволяет пользователю использовать механизм Отбор по значению, что часто идет рука об руку с задачей группировки или упорядочивания данных по конкретному виду товара.