Как рассчитать итоги по валютным полям и использовать их в вычислениях СКД

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

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

Структурирование данных: от детальных записей к итогам

Рассмотрим ситуацию, когда в отчете присутствуют записи в разных валютах (например, доллары и рубли). Обычное суммирование «в лоб» приведет к некорректному результату, так как СКД просто сложит числа без учета их смысла. Проанализируем правильный подход к построению такой структуры. Вместо того чтобы пытаться складывать разные колонки в одной строке, рекомендуется использовать стандартную иерархию 1С: группировка по аналитике (например, Контрагент), далее вложенная группировка по Валюте и детальные записи.

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

Конвертация валют через вычисляемые поля

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

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


ОбщегоНазначения.ПересчитатьВалюту(Сумма, ВалютаДокумента, ПараметрыДанных.ВалютаОтчета, ПараметрыДанных.ДатаКурса)

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

Доступ к итогам группировок через функцию ВычислитьВыражение

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

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

Синтаксис использования:

Если нам нужно в строке детальной записи получить итог по всей текущей группе (например, чтобы понять долю текущей строки в общем итоге группы), мы используем следующее выражение:


Сумма(СуммаВВалютеОтчета) / ВычислитьВыражение("Сумма(СуммаВВалютеОтчета)", "ГруппировкаКонтрагент")

Если же стоит задача, описанная автором темы — умножить итог ячейки на 10 или произвести вычитание, мы можем создать новое вычисляемое поле или настроить выражение ресурса специально для определенной группировки. В колонке Рассчитывать по... на закладке ресурсов можно указать конкретную группу и прописать для нее уникальную формулу.

Сложные расчеты с помощью ВычислитьВыражениеСГруппировкойМассив

Посмотрим на более сложный сценарий: нам нужно сложить итоги нижних уровней, но применить к ним условие. Здесь на помощь приходит функция ВычислитьВыражениеСГруппировкойМассив. Она собирает данные по группировке в массив, который затем можно обработать агрегатной функцией.

Например, нам нужно получить сумму только тех итогов по валютам, где остаток превышает определенный порог:


Сумма(ВычислитьВыражениеСГруппировкойМассив("Сумма(СуммаКонечныйОстаток)", "Валюта", "Сумма(СуммаКонечныйОстаток) > 1000"))

Это выражение позволяет гибко манипулировать данными на уровне итогов, что фактически дает «доступ к ячейке», о котором спрашивал пользователь в сообщении №13.

Оформление и визуализация: макеты группировок

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

В СКД можно создать Макет группировки (Заголовок или Подвал). В ячейках макета можно размещать параметры, которые связаны с выражениями СКД. Это позволяет:

  1. Вывести произвольный текст рядом с итогом.
  2. Объединить несколько итоговых показателей в одной сложной ячейке.
  3. Применить условное оформление только к итоговым значениям, не затрагивая детальные записи.

Использование агрегатных функций с условием

Рассмотрим еще один метод решения проблемы «смешанных» полей. Чтобы не плодить множество ресурсов, можно использовать агрегатные функции с логикой внутри. Это позволяет в одной итоговой строке собрать данные из разных категорий:


Сумма(Выбор Когда Валюта = &ПараметрРубли Тогда СуммаОстаток Иначе СуммаОстаток * КурсВалюты Конец)

Этот подход позволяет избежать разделения на «верхние и нижние» поля в структуре, объединяя их программно в рамках одного ресурса.

Резюме по решению задачи

Для того чтобы получить доступ к итогам и манипулировать ими, мы рекомендуем придерживаться следующего алгоритма:

  1. Приведите данные к общему знаменателю: делайте конвертацию валют в вычисляемых полях или в запросе, а не в оформлении отчета.
  2. Используйте ресурсы: назначьте правила расчета итогов для каждого уровня группировки.
  3. Применяйте ВычислитьВыражение: если нужно использовать значение итога в расчетах других полей, эта функция является единственным штатным способом «заглянуть» в результат группировки.
  4. Настраивайте макеты: если визуальное представление «как в фото» критично для заказчика, используйте макеты оформления для управления выводом каждой ячейки итога.

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

← На главную