При разработке отчетов на Системе Компоновки Данных (СКД) часто возникает задача: отобразить в ресурсе значение, которое зависит от того, в какой именно группировке находится текущая ячейка. Стандартные настройки Рассчитывать по не всегда позволяют гибко управлять выводом, особенно если логика примечаний или расчетных показателей требует анализа иерархии вышестоящих группировок. Разберем, как грамотно подойти к решению этой задачи.
Многие разработчики пытаются реализовать сложную логику «на лету» прямо в выражении ресурса, используя вложенные конструкции ВЫБОР КОГДА ИНАЧЕ КОНЕЦ. Это приводит к нескольким проблемам: сложности поддержки кода, ошибкам типизации и снижению производительности при большом объеме данных. Попытка «понять», в какой группировке находится ячейка внутри выражения ресурса, является признаком того, что данные для отчета не были подготовлены на этапе запроса.
Наиболее эффективный способ работы с данными в СКД — подготовка всей необходимой информации непосредственно в основном запросе. Рассмотрим, как это реализовать на практике.
Вместо того чтобы заставлять СКД вычислять примечание в ресурсах, вынесите эту логику в запрос. Это позволяет использовать всю мощь языка запросов 1С. Рассмотрим пример подготовки данных:
ВЫБРАТЬ
ВЫРАЗИТЬ("Пушкина" КАК СТРОКА(1000)) КАК Улица,
ВЫРАЗИТЬ("123" КАК СТРОКА(1000)) КАК Дом,
ВЫРАЗИТЬ("1" КАК СТРОКА(1000)) КАК квартира,
2 КАК Колво,
ВЫБОР
КОГДА УсловиеДляПервойГруппы ТОГДА "Значение А"
КОГДА УсловиеДляВторойГруппы ТОГДА "Значение Б"
ИНАЧЕ "Значение по умолчанию"
КОНЕЦ КАК Примечание
ИЗ
ТаблицаДанных КАК Данные
После такой подготовки поле Примечание становится обычным атрибутом записи. В настройках СКД вам останется только выбрать тип агрегации (например, Максимум или Сумма), и отчет будет работать корректно и предсказуемо.
Если логика отчета требует специфического поведения именно на разных уровнях иерархии, обратите внимание на встроенную функцию Уровень(). Это позволяет разграничить вывод для детальных записей и группировок верхнего уровня:
Вычисляемое поле в наборе данных.Выражение используйте логику, завязанную на глубину группировки: ВЫБОР КОГДА Уровень() = 1 ТОГДА ... ИНАЧЕ ... КОНЕЦ.Для того чтобы отчет был производительным и легко читаемым, придерживайтесь следующих правил:
ВЫРАЗИТЬ(Поле КАК СТРОКА(1000)). Это защищает от ошибок типизации при объединении данных в запросе.Сумма(Количество)). Вся логика «что вывести» должна быть скрыта в полях данных.ПриКомпоновкеРезультата. В модуле отчета вы можете программно проанализировать КомпоновщикНастроек и динамически изменить параметры или выражения полей перед выводом.Помните, что СКД — декларативный инструмент. Чем больше логики вы перенесете из области «вычисления ресурсов» в область «подготовки данных» (запрос или вычисляемые поля), тем стабильнее будет работать ваш отчет. Если стандартные инструменты не справляются с иерархией, используйте Уровень() для определения глубины группировки, но старайтесь избегать сложных вычислений, которые могут замедлить построение отчета.