При работе в конфигурациях на обычных формах, таких как Управление торговлей 10.3, пользователи часто сталкиваются с ограничением: список номенклатуры легко сортируется по коду, наименованию или артикулу, но попытка отсортировать список по ссылочному полю (например, по производителю, виду номенклатуры или другому справочнику) не дает ожидаемого результата. Давайте подробно разберем, почему это происходит и как решить эту задачу различными методами.
Для начала проанализируем ситуацию с точки зрения архитектуры базы данных 1С. В обычных формах (в отличие от управляемых) элемент управления СправочникСписок напрямую взаимодействует с таблицей базы данных. Когда мы устанавливаем тип данных СправочникСсылка для какого-либо реквизита, в базе данных хранится не текстовое название (например, "ООО Поставщик"), а уникальный идентификатор записи — GUID.
Если мы просто включим индексирование для такого поля, система позволит выбрать его в диалоге сортировки, но результат нас разочарует: элементы выстроятся в порядке их создания в базе (по возрастанию GUID), что визуально выглядит как абсолютно случайный список. Платформа 8.1 и 8.2 в режиме обычных форм не умеет "на лету" подтягивать наименования из связанных таблиц для выполнения сортировки в стандартном списке.
Рассмотрим возможности, которые предоставляет нам конфигуратор. Если мы откроем свойства реквизита в справочнике Номенклатура, мы увидим свойство Индексирование. Разберем доступные варианты:
Выясним причину, почему второй вариант иногда помогает. Если основное представление объекта (например, справочника Контрагенты) установлено как Наименование, то составной индекс позволит системе быстрее выдавать данные, отсортированные внутри группы. Однако в СправочникСписок это все равно не обеспечит полноценную алфавитную сортировку по представлению ссылки, если механизм динамической выборки данных ограничен программно.
Посмотрим на наиболее надежный и производительный метод, который повсеместно используется опытными разработчиками. Суть его заключается в создании "зеркального" текстового поля.
Разберем реализацию по шагам:
Номенклатура новый реквизит, например, ПроизводительНаименование с типом Строка (длина должна соответствовать длине наименования в связанном справочнике).Номенклатура и найдем процедуру ПередЗаписью.Пропишем следующий код для синхронизации данных:
Процедура ПередЗаписью(Отказ)
// Проверяем, заполнено ли ссылочное поле
Если ЗначениеЗаполнено(Производитель) Тогда
// Копируем представление ссылки в строковый реквизит
ПроизводительНаименование = СокрЛП(Производитель.Наименование);
Иначе
ПроизводительНаименование = "";
КонецЕсли;
КонецПроцедуры
После этого необходимо запустить обработку, которая один раз перезапишет все элементы справочника, чтобы заполнить новое поле. Теперь в форме списка мы можем вывести поле ПроизводительНаименование, и сортировка по нему будет работать мгновенно и строго по алфавиту, так как это обычная строка.
Если нам критично разрешить сортировку программно без добавления новых реквизитов (что не рекомендуется для больших баз из-за падения скорости), мы можем воздействовать на объект Порядок элемента СправочникСписок.
Рассмотрим пример кода в модуле формы списка:
Процедура ПриОткрытии()
// Разрешаем сортировку по нужному полю, если оно проиндексировано
ЭлементыФормы.СправочникСписок.НастройкаПорядка.Производитель.Доступность = Истина;
КонецПроцедуры
Важный момент: если поле не проиндексировано в метаданных, установка такого порядка приведет к тому, что 1С будет выполнять сортировку на стороне сервера базы данных без использования индексов. На справочниках объемом более 10-20 тысяч элементов это вызовет значительные задержки (фризы) при прокрутке списка пользователем.
Проанализируем ситуацию, когда стандартных возможностей СправочникСписок недостаточно. В обычных формах иногда используют ПостроительЗапроса для вывода данных в таблицу, вместо прямой привязки к справочнику. Это позволяет делать произвольные LEFT JOIN к другим таблицам и получать наименования ссылок для сортировки прямо в запросе.
Однако помните, что такой подход лишает вас преимуществ динамического считывания данных. Обычный список подгружает только те 30-50 строк, которые видны на экране, а список на основе построителя запроса будет пытаться выгрузить все данные сразу, что может привести к нехватке памяти на клиенте при больших объемах номенклатуры.
Подводя итог, можно сказать следующее: в среде 1С:Предприятие 8.2 на обычных формах "честной" и быстрой сортировки по представлению ссылочного поля "из коробки" не существует. Если ваша база УТ 10.3 содержит большое количество данных, лучшим решением будет создание дублирующего строкового индексированного поля. Это гарантирует пользователям мгновенный отклик интерфейса и корректный алфавитный порядок.