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