При разработке отчетов на Системе Компоновки Данных (СКД) часто возникает задача не просто вывести текущий показатель, но и показать историю его изменений прямо в ячейке. Типичный пример — кросс-таблица, где в строках расположена Номенклатура, в колонках — Вид цены, а на пересечении должна отображаться не одна цифра, а список цен с датами. Рассмотрим, как правильно настроить функции вычисления выражений, чтобы данные в ячейках фильтровались корректно в разрезе каждой колонки.
Основная сложность, с которой сталкиваются разработчики при использовании функции ВычислитьВыражениеСГруппировкойТаблицаЗначений, заключается в том, что по умолчанию функция может «подтягивать» данные из всего набора записей по строке (товару), игнорируя разделение на колонки (виды цен). В результате в ячейке «Закупочная цена» программист видит историю и закупочных, и розничных, и оптовых цен одновременно.
Для решения этой задачи нам необходимо четко разграничить контекст выполнения агрегатной функции. Проанализируем, какие инструменты СКД позволяют нам это сделать.
Самый важный шаг, который часто упускают — это настройка закладки Ресурсы в схеме компоновки данных. Выясним причину: если мы пишем выражение ресурса и не указываем, по каким группировкам его рассчитывать, СКД применяет его ко всем уровням одинаково.
ВидЦены.Важно: Если вы укажете расчет по группировке ВидЦены, СКД автоматически ограничит выборку данных для функции только тем видом цены, который выводится в текущей колонке. Это избавляет от необходимости писать сложные отборы внутри самой функции.
Если ваша цель — вывести историю в текстовом виде (например, через запятую или с новой строки), использование ТаблицыЗначений может быть избыточным. Проанализируем более элегантный способ через массив и соединение строк. Рассмотрим пример выражения для ресурса:
СоединитьСтроки(
ВычислитьВыражениеСГруппировкойМассив(
"Формат(Период, ""ДЛФ=D"") + "": "" + Цена",
"Период",
,
,
"Период Убыв"
),
Символы.ПС
)
В данном примере мы выполняем следующие действия:
ВычислитьВыражениеСГруппировкойМассив — собирает все значения цен и дат в массив в хронологическом порядке."Период Убыв" — сортирует историю так, чтобы последняя цена была первой.СоединитьСтроки(..., Символы.ПС) — преобразует массив в одну многострочную строку, где каждая цена будет начинаться с нового абзаца.В актуальных версиях платформы появились упрощенные агрегатные функции, которые работают значительно быстрее и проще в настройке. Если ваша версия платформы позволяет, рекомендуем использовать функцию ТаблицаЗначений().
Рассмотрим по шагам настройку такого ресурса:
Цена).
ТаблицаЗначений(Период, Цена)
ВидЦены, а затем Номенклатура.Такой подход позволит вам получить объект «Таблица значений» прямо в ячейке. Чтобы пользователь увидел данные, можно использовать Условное оформление и параметр Текст, либо создать свою функцию в общем модуле, которая будет преобразовывать эту таблицу в красивый текст для вывода.
Иногда возникают ситуации, когда стандартный механизм «Рассчитывать по...» не дает нужного результата (например, при сложной иерархии). Тогда мы можем использовать третий параметр функции ВычислитьВыражениеСГруппировкойТаблицаЗначений для явного отбора.
Посмотрим на пример правильного синтаксиса отбора:
ВычислитьВыражениеСГруппировкойТаблицаЗначений(
"Цена, Период",
"Период",
"ВидЦены = &ТекущийВидЦены"
)
Однако, будьте осторожны: использование параметров в кавычках внутри выражений СКД часто требует, чтобы эти поля были доступны в текущем контексте записей. Если поле ВидЦены является детальным, СКД поймет это условие. Если же оно является группировкой, лучше использовать первый метод с настройкой области расчета ресурса.
Выясним причину возможных тормозов при формировании отчета. Когда мы заставляем СКД вычислять таблицы значений для каждой ячейки, нагрузка на оперативную память растет в геометрической прогрессии. Чтобы отчет работал быстро, рекомендуем:
ROW_NUMBER() (если это SQL запрос).СоединитьСтроки.Таким образом, мы проанализировали основные способы вывода истории данных в кросс-таблицах. Правильное сочетание агрегатных функций и настроек группировок ресурсов позволяет создавать мощные аналитические отчеты без написания сложного программного кода в модулях.