Как настроить общую сортировку в СКД для иерархии, распределенной по разным полям?

Программист 1С v8.3 (Управляемые формы) Управленческий учет
← На главную

При разработке сложных отчетов в СКД часто возникает ситуация, когда иерархические данные хранятся в разных полях. Например, у вас есть «Статья затрат» и «Договор комитента», которые логически должны следовать друг за другом в едином списке, основанном на числовом префиксе в наименовании. Рассмотрим пошагово, как добиться такой сортировки, если стандартные настройки группировок не дают нужного результата.

Понимание проблемы

Основная сложность заключается в том, что СКД применяет сортировку для каждой группировки независимо. Если вы настроили сортировку отдельно для поля «Статья затрат» и отдельно для «Договора комитента», система не видит между ними связи и не может выстроить сквозной порядок. Для решения этой задачи нам нужно создать «единый знаменатель» для сортировки.

Шаг 1: Создание вычисляемых полей для числового кода

Первым делом нам необходимо извлечь числовую часть из представлений обоих полей. Для этого в наборе данных СКД на вкладке «Вычисляемые поля» создадим два новых поля, например: КодСортировкиСтатьи и КодСортировкиДоговора.

Для извлечения первых трех цифр воспользуемся выражением:

ВЫРАЗИТЬ(ПОДСТРОКА(СтатьяЗатрат.Наименование, 1, 3) КАК ЧИСЛО(3))

Аналогичную операцию проведем для поля ДоговорКомитента. Это позволит нам получить числовое значение, которое система сможет корректно упорядочить.

Шаг 2: Создание общего поля для сортировки

Чтобы добиться «сквозной» сортировки, мы можем использовать механизм выбора в зависимости от текущего контекста группировки. Создадим общее вычисляемое поле ЕдиныйКодСортировки, которое будет возвращать значение в зависимости от того, какой объект мы сейчас обрабатываем:


ВЫБОР
    КОГДА ЕстьNULL(СтатьяЗатрат, НЕОПРЕДЕЛЕНО) <> НЕОПРЕДЕЛЕНО ТОГДА КодСортировкиСтатьи
    ИНАЧЕ КодСортировкиДоговора
КОНЕЦ

Это поле станет ключом к решению. Теперь нам не нужно сортировать по исходным полям, достаточно указать ЕдиныйКодСортировки в качестве поля сортировки для всех соответствующих группировок в настройках СКД.

Шаг 3: Настройка иерархии в СКД

Если данные по-прежнему выводятся некорректно, рассмотрим вариант объединения данных на уровне запроса. Если вы используете ОБЪЕДИНИТЬ ВСЕ, вы можете создать общее поле НаименованиеОбъекта и поле ЧисловойКод. В настройках структуры отчета вы будете использовать только эти два поля.

  1. В запросе создайте общее поле Код, которое будет содержать числовое значение для обоих типов данных.
  2. В СКД в настройках группировки добавьте это поле Код в список полей сортировки.
  3. Убедитесь, что для группировок установлена «Иерархия», если вы хотите сохранить древовидную структуру данных.

Рекомендации по архитектуре отчета

Если задача становится слишком сложной из-за глубокой вложенности групп, рассмотрите следующие советы:

1. Использование функции ВычислитьВыражение: Иногда оправдано использование функции ВычислитьВыражение для получения родительских значений, но этот путь требует глубокого тестирования производительности отчета.

2. Унификация данных: Помните, что СКД работает лучше всего, когда объекты одного уровня имеют общую структуру. Попытка «склеить» сортировку для принципиально разных полей без приведения их к общему реквизиту — это борьба с механизмом компоновки. Лучше один раз подготовить данные в запросе, добавив колонку СортировочныйКод, чем пытаться вычислять сложные выражения в настройках.

3. Проверка иерархии: Если «Статья затрат» является родителем для «Договора», убедитесь, что в запросе связь между ними определена четко. Если иерархия строится «на лету» в СКД, обязательно задайте порядок сортировки для каждой группы, чтобы система не теряла логическую последовательность при переходе от одного уровня к другому.

Применяя эти методы, вы сможете добиться требуемого порядка отображения данных, независимо от того, какие именно поля участвуют в группировках. Главное — всегда сводить задачу сортировки к числовому значению, понятному для платформы.

← На главную