Как в СКД вывести последнее значение в итогах по колонке вместо суммы

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

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

Метод 1. Использование функции ВычислитьВыражение в ресурсах

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

Перейдем на закладку Ресурсы. Вместо стандартного выражения Сумма(ИмяПоля) нам необходимо прописать более сложную конструкцию. Проанализируем синтаксис:

ВычислитьВыражение("Сумма(СуммаОстаток)", , , "Последняя", "Последняя")

Рассмотрим параметры этой функции, чтобы понимать, как она работает:

  1. Первый параметр ("Сумма(СуммаОстаток)"): Это выражение, которое нужно вычислить. Важно помнить, что внутри ВычислитьВыражение всегда должна использоваться агрегатная функция, так как расчет идет по набору записей.
  2. Второй и третий параметры (пусто): Группировка и область расчета. Если оставить их пустыми, функция будет работать в текущем контексте группировки.
  3. Четвертый и пятый параметры ("Последняя", "Последняя"): Это ключевые настройки. Мы указываем СКД, что диапазон строк для расчета должен начинаться с последней записи и заканчиваться последней записью. Фактически, мы изолируем одну конкретную строку.

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


ВычислитьВыражение("Сумма(СуммаОстаток)", , , "Последняя", "Последняя", "Период Возр")

Метод 2. Правильная настройка ролей полей (Остатки)

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

Разберем алгоритм настройки:

  1. Откроем вкладку Наборы данных и найдем наше числовое поле.
  2. В колонке Роль нажмем на кнопку редактирования.
  3. В открывшемся окне установим флажок Остаток.
  4. В поле Имя укажем идентификатор (например, «Сумма»), который объединит начальный и конечный остатки, если они есть.
  5. В поле Тип выберем значение Конечный.
  6. В поле Поле периода выберем основное поле времени из нашего запроса (например, ПериодСекунда).

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

Метод 3. Дифференциация итогов по группировкам

Иногда задача усложняется: нам нужно, чтобы в итогах по иерархии (например, по подразделениям) значения складывались, а в общих итогах или итогах по времени — бралось последнее значение. В СКД можно задать разные формулы расчета для разных группировок.

Проанализируем, как это настроить на закладке Ресурсы:

  1. Добавим поле в список ресурсов дважды.
  2. Для первой строки укажем стандартное выражение Сумма(СуммаОстаток). В колонке Рассчитывать по... выберем все группировки, кроме «Общие итоги» и временных периодов.
  3. Для второй строки пропишем выражение с функцией ВычислитьВыражение. В колонке Рассчитывать по... укажем только Общие итоги.

Таким образом, мы добьемся того, что отчет будет гибко реагировать на контекст вывода данных. Для реализации этого подхода подойдёт методика настройки различного расчета итогов для разных группировок.

Почему не стоит использовать функции Минимум или Максимум?

Часто новички пытаются заменить Сумма на Максимум, надеясь получить последнее значение. Выясним причину, почему это плохая практика. Функция Максимум вернет самое большое число в выборке. Если остаток на счете в конце месяца уменьшился (например, было 100 000, а стало 58 000), то Максимум вернет 100 000, что будет фактической ошибкой в отчете. Для корректного отражения остатков всегда следует использовать либо ВычислитьВыражение с указанием позиции, либо специализированные роли СКД.

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

← На главную