Как исправить суммирование ресурсов в СКД, если вместо суммы выводится единица?

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

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

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

Причина 1. Настройка выражения ресурса

Самая очевидная, но часто пропускаемая причина — это отсутствие или некорректное написание выражения на закладке Ресурсы. Если вы просто добавили поле в список ресурсов, но не указали функцию, СКД может вести себя непредсказуемо в зависимости от версии платформы.

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

Что нужно сделать:

  1. Перейдите на закладку Ресурсы в схеме компоновки данных.
  2. Найдите ваши поля (например, Факт и Пос).
  3. В колонке «Выражение» строго пропишите использование агрегатной функции Сумма().

Сумма(Посещаемость)
Сумма(Нагрузка)

Важно помнить, что даже если в запросе вы уже использовали СУММИРОВАТЬ, для СКД это не является указанием считать итоги в итоговых строках отчета. Ресурсы — это единственный способ заставить СКД агрегировать данные на уровнях группировок.

Причина 2. Настройка ролей полей в наборе данных

Если Сумма() прописана, но отчет все равно выводит единицы, нам необходимо проверить закладку Наборы данных. Особое внимание следует уделить колонке Роли. Система компоновки данных использует роли для определения того, как группировать строки и как рассчитывать итоги.

Разберем основные ошибки в ролях:

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

Причина 3. Структура настроек и «Детальные записи»

Рассмотрим структуру самого отчета на закладке Настройки. Часто пользователь добавляет группировку (например, по Дате), а внутри нее оставляет объект Детальные записи.

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

Как проверить:

  1. Посмотрите на иерархию в настройках. Если под группировкой «Дата» есть элемент «Детальные записи», попробуйте его отключить.
  2. Перенесите выбранные поля (ресурсы) непосредственно в саму группировку «Дата».
  3. Проверьте, не добавлены ли в группировку скрытые поля (например, «Тип работы»), которые делают каждую строку уникальной и не дают им «схлопнуться» в одну итоговую строку.

Причина 4. Влияние кэша настроек пользователя

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

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

Рассмотрим правильный алгоритм сброса:

  1. Запустите отчет в режиме «Предприятие».
  2. Нажмите кнопку Еще (или стандартную командную панель).
  3. Выберите пункт Установить стандартные настройки.

После этого СКД перечитает схему из метаданных и применит ваши новые настройки ресурсов и ролей.

Причина 5. Обработка значений NULL в запросе

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

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


ВЫБРАТЬ
    Сотрудники.Ссылка КАК Сотрудник,
    ЕСТЬNULL(Посещаемость.Часы, 0) КАК ЧасыФакт,
    ЕСТЬNULL(Нагрузка.Часы, 0) КАК ЧасыНагрузка
ИЗ
    Справочник.Сотрудники КАК Сотрудники
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Посещаемость КАК Посещаемость
    ПО ...

Использование ЕСТЬNULL(Поле, 0) гарантирует, что в СКД попадет число, которое система сможет однозначно сложить.

Причина 6. Настройка «Рассчитывать по...» в ресурсах

На закладке Ресурсы есть колонка «Рассчитывать по...». По умолчанию она пустая. Это означает, что ресурс будет рассчитываться для всех группировок и для общих итогов. Однако, если кто-то из разработчиков указал там конкретную группировку (например, только «Организация»), то на уровне «Дата» или «Сотрудник» сумма считаться не будет — там отобразится либо пустота, либо некорректное значение из первой строки.

Решение: Убедитесь, что список в колонке «Рассчитывать по...» либо пуст, либо содержит все необходимые уровни группировок вашего отчета.

Итоговый чек-лист для проверки:

  1. В ресурсах написано Сумма(ИмяПоля).
  2. Тип поля в наборе данных — Число.
  3. В ролях поля не стоит флаг «Измерение».
  4. В настройках отчета нет лишних «Детальных записей».
  5. В режиме Предприятия выполнен сброс к стандартным настройкам.

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

← На главную