Как правильно настроить итоги по группировкам периодов (Месяц, Неделя, День) в СКД для плановых показателей и остатков

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

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

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

Причина проблемы: Почему СКД все суммирует?

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

Выясним, как объяснить системе, что данные имеют характер остатков или неизменных на период показателей.

Решение 1: Использование механизма ролей полей (Стандартный метод)

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

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

Аналогично поступим для конечных показателей, выбрав тип Конечный. Благодаря этой настройке СКД поймет: при расчете итога по группировке «Месяц» нужно взять значение из самой ранней записи этого месяца для начального остатка и из самой поздней — для конечного. Суммирования между днями не произойдет.

Решение 2: Использование функции ВычислитьВыражение в ресурсах

Если по каким-то причинам настройка ролей не помогает (например, данные собираются сложным ОБЪЕДИНИТЬ из разных таблиц), мы можем принудительно переопределить формулу расчета ресурса. Рассмотрим использование функции ВычислитьВыражение.

Проанализируем ситуацию: нам нужно получить значение «Плана» по первой записи внутри текущей группировки. Перейдем на закладку Ресурсы и вместо стандартного Сумма(План) напишем следующее выражение:

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

Разберем параметры этой функции подробно:

Для конечных показателей (Факт на конец) выражение будет выглядеть так:


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

Решение 3: Агрегация через массив для сложных случаев

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

Допустим, нам нужно получить среднее или первое значение, предварительно свернув данные по дням. Посмотрим на пример выражения для ресурса:

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

Как это работает?

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

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

Решение 4: Дополнение периодов

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

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

Практический совет по расчету ресурсов для разных уровней

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

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

Это позволит гибко управлять поведением отчета на каждом уровне иерархии.

Заключение

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

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

← На главную