Как вывести историю изменения цен в одну ячейку кросс-таблицы СКД

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

При разработке отчетов на Системе Компоновки Данных (СКД) часто возникает задача не просто вывести текущий показатель, но и показать историю его изменений прямо в ячейке. Типичный пример — кросс-таблица, где в строках расположена Номенклатура, в колонках — Вид цены, а на пересечении должна отображаться не одна цифра, а список цен с датами. Рассмотрим, как правильно настроить функции вычисления выражений, чтобы данные в ячейках фильтровались корректно в разрезе каждой колонки.

Разбор проблемы контекста вычисления

Основная сложность, с которой сталкиваются разработчики при использовании функции ВычислитьВыражениеСГруппировкойТаблицаЗначений, заключается в том, что по умолчанию функция может «подтягивать» данные из всего набора записей по строке (товару), игнорируя разделение на колонки (виды цен). В результате в ячейке «Закупочная цена» программист видит историю и закупочных, и розничных, и оптовых цен одновременно.

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

Решение 1: Настройка области расчета ресурса

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

  1. Перейдем на закладку Ресурсы.
  2. В поле Выражение вставим нашу функцию (подробный синтаксис разберем ниже).
  3. В колонке Рассчитывать по... обязательно выберем группировку, отвечающую за колонки — в нашем случае это ВидЦены.

Важно: Если вы укажете расчет по группировке ВидЦены, СКД автоматически ограничит выборку данных для функции только тем видом цены, который выводится в текущей колонке. Это избавляет от необходимости писать сложные отборы внутри самой функции.

Решение 2: Использование функции СоединитьСтроки

Если ваша цель — вывести историю в текстовом виде (например, через запятую или с новой строки), использование ТаблицыЗначений может быть избыточным. Проанализируем более элегантный способ через массив и соединение строк. Рассмотрим пример выражения для ресурса:


СоединитьСтроки(
    ВычислитьВыражениеСГруппировкойМассив(
        "Формат(Период, ""ДЛФ=D"") + "": "" + Цена", 
        "Период", 
        , 
        , 
        "Период Убыв"
    ), 
    Символы.ПС
)

В данном примере мы выполняем следующие действия:

Решение 3: Современный подход (Платформа 8.3.15 и выше)

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

Рассмотрим по шагам настройку такого ресурса:

  1. В поле Путь к данным выберем наше поле (например, Цена).
  2. В поле Выражение напишем:

ТаблицаЗначений(Период, Цена)

  1. В колонке Рассчитывать по... укажем сначала ВидЦены, а затем Номенклатура.

Такой подход позволит вам получить объект «Таблица значений» прямо в ячейке. Чтобы пользователь увидел данные, можно использовать Условное оформление и параметр Текст, либо создать свою функцию в общем модуле, которая будет преобразовывать эту таблицу в красивый текст для вывода.

Как передать отбор в функцию (если автоматический контекст не сработал)

Иногда возникают ситуации, когда стандартный механизм «Рассчитывать по...» не дает нужного результата (например, при сложной иерархии). Тогда мы можем использовать третий параметр функции ВычислитьВыражениеСГруппировкойТаблицаЗначений для явного отбора.

Посмотрим на пример правильного синтаксиса отбора:


ВычислитьВыражениеСГруппировкойТаблицаЗначений(
    "Цена, Период", 
    "Период", 
    "ВидЦены = &ТекущийВидЦены"
)

Однако, будьте осторожны: использование параметров в кавычках внутри выражений СКД часто требует, чтобы эти поля были доступны в текущем контексте записей. Если поле ВидЦены является детальным, СКД поймет это условие. Если же оно является группировкой, лучше использовать первый метод с настройкой области расчета ресурса.

Советы по производительности

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

Таким образом, мы проанализировали основные способы вывода истории данных в кросс-таблицах. Правильное сочетание агрегатных функций и настроек группировок ресурсов позволяет создавать мощные аналитические отчеты без написания сложного программного кода в модулях.

← На главную