Как реализовать расчет итогов по разным формулам в расшифровке отчета СКД

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

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

Использование ролей полей для учета остатков

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

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

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

Настройка выражений ресурсов и условий

Часто требуется, чтобы итог считался только в том случае, если данные «однородны». Например, если в группировке перемешаны «кг» и «шт», суммировать их — методологическая ошибка. Чтобы управлять этим, мы можем использовать условные выражения в языке СКД на закладке Ресурсы.

Рассмотрим пример выражения для ресурса Количество:


ВЫБОР 
    КОГДА КоличествоРазличных(ЕдиницаИзмерения) > 1 
    ТОГДА 0 
    ИНАЧЕ Сумма(Количество) 
КОНЕЦ

Выясним причину такого поведения: в основном отчете, где выведены все товары, количество различных единиц измерения больше единицы, и система выводит 0 (или пустую строку). Как только пользователь делает расшифровку по конкретной номенклатуре, условие КоличествоРазличных(ЕдиницаИзмерения) > 1 становится ложным, так как у одного товара единица измерения одна. В этот момент срабатывает ветка ИНАЧЕ, и мы видим корректную сумму.

Разные формулы для разных уровней группировок

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

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

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

Это позволяет добиться того, что на разных уровнях иерархии отчета данные будут агрегироваться по разным математическим правилам. В расшифровке, которая по сути является переходом на более глубокий уровень группировки, будут применяться формулы, соответствующие этому уровню.

Использование функций «ВычислитьВыражение»

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

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


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

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

Автоматические итоги в расшифровке (механизм платформы)

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

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

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

← На главную