При разработке отчетов в системе компоновки данных (СКД) стандартная сортировка по алфавиту или коду не всегда удовлетворяет требованиям пользователей. Часто возникают ситуации, когда бизнес-процесс требует вывода номенклатуры в специфическом порядке (например, сначала основные товары, затем сопутствующие, или в соответствии с исторически сложившейся формой в Excel). В этой статье мы разберем несколько способов реализации произвольной сортировки, начиная от самых быстрых и заканчивая профессиональными масштабируемыми методами.
Рассмотрим самый оперативный способ, который не требует изменения структуры конфигурации. Этот метод идеально подходит, когда список номенклатуры небольшой и меняется крайне редко. Мы создадим в схеме компоновки данных специальное поле, которое будет присваивать каждой номенклатуре числовой индекс (приоритет).
Проанализируем алгоритм действий в конструкторе СКД:
ПорядокСортировки.ВЫБОР КОГДА...ТОГДА.Посмотрим на пример выражения:
ВЫБОР
КОГДА Номенклатура.Наименование = "Карандаши" ТОГДА 1
КОГДА Номенклатура.Наименование = "Акварельные краски" ТОГДА 2
КОГДА Номенклатура.Наименование = "Ящик-пенал" ТОГДА 3
КОГДА Номенклатура.Наименование = "Бумага А4" ТОГДА 4
ИНАЧЕ 999
КОНЕЦ
После создания поля нам необходимо применить его для упорядочивания. Переходим на закладку Настройки, выбираем нужную группировку или весь отчет, и на вкладке Сортировка добавляем наше поле ПорядокСортировки по возрастанию. Чтобы техническое поле не мозолило глаза пользователю, мы просто не добавляем его в Выбранные поля.
Если отчет планируется использовать долго, а список номенклатуры может расширяться, "зашивать" названия товаров прямо в код — не самое лучшее решение. Разберем более правильный с точки зрения архитектуры подход — добавление специального числового реквизита в справочник Номенклатура.
Выясним преимущества этого метода:
Для реализации добавим реквизит ПорядокВОтчетах (тип Число) в справочник. В СКД нам достаточно будет выбрать это поле в наборе данных и установить его в настройках сортировки. Важно помнить, что этот метод требует внесения изменений в конфигурацию, что не всегда возможно в закрытых или типовых решениях на поддержке.
Если конфигурация базируется на БСП (Библиотека стандартных подсистем), мы можем избежать изменения метаданных, используя механизм дополнительных реквизитов. Рассмотрим, как это сделать:
Номенклатура с типом Число.Номенклатура.Проанализируем ситуацию, если реквизит не подтягивается автоматически. В этом случае нам придется добавить левое соединение с таблицей дополнительных сведений в основном запросе СКД:
ВЫБРАТЬ
Номенклатура.Ссылка КАК Товар,
ЕСТЬNULL(ДопСведения.Значение, 999) КАК ИндексСортировки
ИЗ
Справочник.Номенклатура КАК Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеСведения КАК ДопСведения
ПО ДопСведения.Объект = Номенклатура.Ссылка
И ДопСведения.Свойство = &СвойствоСортировка
Малоизвестный, но крайне эффективный способ — использование колонки Выражение упорядочивания на закладке Наборы данных. Это позволяет переопределить стандартную логику сортировки для конкретного поля Номенклатура.
Посмотрим, как это работает. Вместо того чтобы создавать отдельное вычисляемое поле, мы находим в списке полей набора данных строку Номенклатура и в колонке Выражение упорядочивания пишем логику. Это удобно тем, что где бы в настройках отчета мы ни использовали сортировку по номенклатуре, СКД сама "подставит" нашу хитрую логику весов вместо алфавитного сравнения строк.
Рассмотрим ситуацию, когда порядок должен в точности соответствовать внешнему файлу или списку, предоставленному руководством. В этом случае мы можем построить запрос с использованием временной таблицы приоритетов.
Разберем пример кода в тексте запроса:
ВЫБРАТЬ "Карандаши" КАК Имя, 1 КАК Вес ПОМЕСТИТЬ ВТ_Порядок
ОБЪЕДИНИТЬ ВЫБРАТЬ "Бумага А4", 2;
ВЫБРАТЬ
ОснТаблица.Номенклатура,
ЕСТЬNULL(ВТ_Порядок.Вес, 999) КАК Порядок
ИЗ
РегистрНакопления.Продажи.Обороты КАК ОснТаблица
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Порядок КАК ВТ_Порядок
ПО ОснТаблица.Номенклатура.Наименование = ВТ_Порядок.Имя
Этот метод гарантирует, что даже при изменении наименований (если привязываться к ГУИДам или кодам), порядок останется жестко детерминированным. Однако помните, что поддержка такого запроса требует навыков программирования.
Выбирая метод, всегда учитывайте человеческий фактор. Как упоминалось в обсуждении, пользователи часто копируют данные в Excel. Если их привычный порядок нарушен, они могут воспринять это как ошибку программы ("Ваша 1С не работает!"). Поэтому, если вы внедряете сложную сортировку, рассмотрите возможность добавления в отчет колонки с номером по порядку, чтобы пользователю было легче ориентироваться при сверке с внешними таблицами.
Подведем итог: для разовых задач используйте вычисляемые поля; для системного подхода в крупной компании — дополнительные реквизиты; а для сложных отчетов с динамической логикой — временные таблицы в запросе. Комбинируя эти инструменты, вы сможете удовлетворить даже самого требовательного заказчика.