При разработке и доработке конфигураций 1С часто возникает задача предоставить пользователю возможность сортировки списка элементов по определенному реквизиту. Если реквизит имеет простой примитивный тип (число, строка, дата), сортировка в форме списка работает штатно по нажатию на заголовок колонки. Однако если поле имеет составной ссылочный тип (например, может хранить ссылки на разные планы видов расчета или перечисления), стандартная сортировка по алфавиту в обычной форме списка перестает работать ожидаемым образом.
Разберем причины такого поведения платформы 1С:Предприятие и детально рассмотрим способы реализации корректной сортировки.
Проанализируем, как платформа 1С и СУБД работают с полями составного типа и табличными частями форм:
СправочникСписок. Механизм НастройкаПорядка обычных форм работает напрямую с физической таблицей справочника и позволяет упорядочивать строки только по реальным индексированным полям таблицы БД. Выполнить динамическую сортировку списка по представлению ссылочного реквизита без дополнительных модификаций платформа в обычном режиме не позволяет.Рассмотрим наиболее простое, надежное и быстродействующее решение для обычных форм. Если стандартный реквизит справочника Наименование в прикладной логике не задействован или пуст, мы можем сохранять в него строковое представление составного реквизита Описание при сохранении элемента, после чего настроить сортировку списка по наименованию.
Разберем реализацию по шагам:
Шаг 1. Автоматическое заполнение при записи элемента
Откроем модуль объекта нужного справочника и в обработчике события ПередЗаписью добавим преобразование значения составного поля в строку:
Процедура ПередЗаписью(Отказ)
// Преобразуем составное значение ссылки в строковое представление
Наименование = Строка(Описание);
КонецПроцедуры
Если конфигурация типовая и находится на поддержке, для сохранения возможности обновления логику лучше вынести в отдельную процедуру общего модуля и привязать через объект ПодпискаНаСобытие с источником СправочникОбъект и событием ПередЗаписью.
Шаг 2. Заполнение наименований для существующих элементов
Для уже созданных записей справочника поле Наименование останется пустым, пока элементы не будут переписаны. Создадим внешнюю обработку и выполним пакетное обновление данных:
Выборка = Справочники.НашСправочник.Выбрать();
Пока Выборка.Следующий() Цикл
Если СокрЛП(Выборка.Наименование) <> СокрЛП(Строка(Выборка.Описание)) Тогда
ОбъектСпр = Выборка.ПолучитьОбъект();
ОбъектСпр.Наименование = Строка(ОбъектСпр.Описание);
ОбъектСпр.Записать();
КонецЕсли;
КонецЦикла;
Шаг 3. Настройка формы списка
В форме списка справочника настроим порядок отображения колонок. Чтобы не перегружать интерфейс, колонку Наименование можно сделать скрытой (снять флажок видимости), оставив пользователю только колонку Описание, либо наоборот отображать Наименование. При открытии формы зададим порядок сортировки в обработчике ПриОткрытии:
Процедура ПриОткрытии()
// Устанавливаем сортировку по заполненному строковому полю
СправочникСписок.Порядок.Установить("Наименование Возр");
КонецПроцедуры
Подводные камни этого подхода:
Наименование имеет фиксированную длину (например, 50 или 100 символов). Если строковое представление объекта составного типа окажется длиннее, оно автоматически обрежется при записи.Если данные справочника необходимо вывести с сортировкой в отчете, печатной форме или вспомогательной таблице без изменения структуры метаданных и перезаписи элементов, разберем решение через запрос. Для составного поля нельзя применить операцию точки через составной тип без типизации. Поэтому воспользуемся конструкцией ВЫБОР КОГДА ... ССЫЛКА и функцией ВЫРАЗИТЬ:
ВЫБРАТЬ
Спр.Код КАК Код,
Спр.Описание КАК Описание,
ВЫБОР
КОГДА Спр.Описание ССЫЛКА ПланВидовРасчета.ОсновныеНачисленияОрганизаций
ТОГДА ВЫРАЗИТЬ(Спр.Описание КАК ПланВидовРасчета.ОсновныеНачисленияОрганизаций).Наименование
КОГДА Спр.Описание ССЫЛКА ПланВидовРасчета.ДополнительныеНачисленияОрганизаций
ТОГДА ВЫРАЗИТЬ(Спр.Описание КАК ПланВидовРасчета.ДополнительныеНачисленияОрганизаций).Наименование
КОГДА Спр.Описание ССЫЛКА Перечисление.ВидыОперацийПКО
ТОГДА ПРЕДСТАВЛЕНИЕ(Спр.Описание)
ИНАЧЕ ""
КОНЕЦ КАК ТекстовоеПредставление
ИЗ
Справочник.НашСправочник КАК Спр
УПОРЯДОЧИТЬ ПО
ТекстовоеПредставление ВОЗР
Такой подход обеспечивает правильную алфавитную сортировку сразу на уровне СУБД, обращаясь к реальным строковым полям соответствующих таблиц.
Если справочник является небольшим классификатором (содержит до нескольких тысяч строк), в обычной форме можно отказаться от стандартного источника СправочникСписок в пользу объекта ТаблицаЗначений:
ТаблицаЗначений.