Как выводить специфические данные в ресурсах СКД в зависимости от группировок?

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

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

Почему не стоит усложнять выражения ресурсов

Многие разработчики пытаются реализовать сложную логику «на лету» прямо в выражении ресурса, используя вложенные конструкции ВЫБОР КОГДА ИНАЧЕ КОНЕЦ. Это приводит к нескольким проблемам: сложности поддержки кода, ошибкам типизации и снижению производительности при большом объеме данных. Попытка «понять», в какой группировке находится ячейка внутри выражения ресурса, является признаком того, что данные для отчета не были подготовлены на этапе запроса.

Решение через перенос логики в запрос

Наиболее эффективный способ работы с данными в СКД — подготовка всей необходимой информации непосредственно в основном запросе. Рассмотрим, как это реализовать на практике.

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


ВЫБРАТЬ
    ВЫРАЗИТЬ("Пушкина" КАК СТРОКА(1000)) КАК Улица,
    ВЫРАЗИТЬ("123" КАК СТРОКА(1000)) КАК Дом,
    ВЫРАЗИТЬ("1" КАК СТРОКА(1000)) КАК квартира,
    2 КАК Колво,
    ВЫБОР
        КОГДА УсловиеДляПервойГруппы ТОГДА "Значение А"
        КОГДА УсловиеДляВторойГруппы ТОГДА "Значение Б"
        ИНАЧЕ "Значение по умолчанию"
    КОНЕЦ КАК Примечание
ИЗ
    ТаблицаДанных КАК Данные

После такой подготовки поле Примечание становится обычным атрибутом записи. В настройках СКД вам останется только выбрать тип агрегации (например, Максимум или Сумма), и отчет будет работать корректно и предсказуемо.

Использование вычисляемых полей и функции Уровень()

Если логика отчета требует специфического поведения именно на разных уровнях иерархии, обратите внимание на встроенную функцию Уровень(). Это позволяет разграничить вывод для детальных записей и группировок верхнего уровня:

  1. Создайте Вычисляемое поле в наборе данных.
  2. В поле Выражение используйте логику, завязанную на глубину группировки: ВЫБОР КОГДА Уровень() = 1 ТОГДА ... ИНАЧЕ ... КОНЕЦ.
  3. Используйте это поле в структуре отчета.

Рекомендации по реализации

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

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

← На главную