При разработке отчетов на базе Системы компоновки данных (СКД) программисты часто сталкиваются с ситуацией, когда стандартное агрегирование ресурсов (сумма) не подходит для конкретной бизнес-задачи. Типичный пример — вывод остатков. Если в колонке отображаются остатки на разные даты, то в итоговой строке мы хотим видеть не сумму всех этих чисел, а именно значение на последнюю дату. Рассмотрим подробнее, как реализовать этот механизм несколькими способами.
Функция ВычислитьВыражение является одним из самых мощных инструментов языка выражений СКД. Она позволяет обращаться к значениям других строк и выполнять вычисления в различных контекстах. Разберем по шагам, как настроить ресурс для получения последнего значения.
Перейдем на закладку Ресурсы. Вместо стандартного выражения Сумма(ИмяПоля) нам необходимо прописать более сложную конструкцию. Проанализируем синтаксис:
ВычислитьВыражение("Сумма(СуммаОстаток)", , , "Последняя", "Последняя")
Рассмотрим параметры этой функции, чтобы понимать, как она работает:
ВычислитьВыражение всегда должна использоваться агрегатная функция, так как расчет идет по набору записей.Важный нюанс: функция ВычислитьВыражение крайне чувствительна к сортировке. Если записи в отчете не упорядочены по дате или периоду, понятие «последняя строка» станет неопределенным. Для гарантии результата можно добавить шестой параметр с указанием сортировки:
ВычислитьВыражение("Сумма(СуммаОстаток)", , , "Последняя", "Последняя", "Период Возр")
Если поле, с которым мы работаем, семантически является остатком, то наиболее правильным с точки зрения архитектуры 1С будет использование механизма ролей. Это позволит СКД автоматически определять, как вести себя в итогах по времени.
Разберем алгоритм настройки:
Конечный.ПериодСекунда).После такой настройки стандартное выражение ресурса Сумма(СуммаОстаток) в итогах по временным группировкам будет автоматически возвращать значение из последней записи периода, а не складывать их. Это штатное поведение системы компоновки данных при работе с ролями остатков. Для практического изучения этой конфигурации можно использовать готовый пример отчета с настроенной ролью поля СКД для расчета остатков.
Иногда задача усложняется: нам нужно, чтобы в итогах по иерархии (например, по подразделениям) значения складывались, а в общих итогах или итогах по времени — бралось последнее значение. В СКД можно задать разные формулы расчета для разных группировок.
Проанализируем, как это настроить на закладке Ресурсы:
Сумма(СуммаОстаток). В колонке Рассчитывать по... выберем все группировки, кроме «Общие итоги» и временных периодов.ВычислитьВыражение. В колонке Рассчитывать по... укажем только Общие итоги.Таким образом, мы добьемся того, что отчет будет гибко реагировать на контекст вывода данных. Для реализации этого подхода подойдёт методика настройки различного расчета итогов для разных группировок.
Часто новички пытаются заменить Сумма на Максимум, надеясь получить последнее значение. Выясним причину, почему это плохая практика. Функция Максимум вернет самое большое число в выборке. Если остаток на счете в конце месяца уменьшился (например, было 100 000, а стало 58 000), то Максимум вернет 100 000, что будет фактической ошибкой в отчете. Для корректного отражения остатков всегда следует использовать либо ВычислитьВыражение с указанием позиции, либо специализированные роли СКД.
Выбор конкретного метода зависит от структуры вашего запроса. Если вы используете виртуальные таблицы остатков и оборотов, метод с ролями (Метод 2) является приоритетным. Если же вы работаете с произвольным набором данных или сложной математикой в вычисляемых полях, то использование ВычислитьВыражение (Метод 1) предоставит вам необходимую гибкость.