При разработке отчетов на базе Системы компоновки данных (СКД) программисты часто сталкиваются с ситуацией, когда числовые показатели в колонках (ресурсы) отказываются суммироваться. Например, по конкретному сотруднику за определенную дату есть несколько записей с нагрузкой по 1 часу, но в отчете вместо ожидаемой цифры 2 мы видим 1. Это создает иллюзию того, что отчет «берет только последнюю запись» или просто игнорирует агрегатные функции.
В этой статье мы подробно разберем, почему так происходит, и пройдем по шагам процесс исправления этой ошибки, опираясь на механику работы компоновщика 1С.
Самая очевидная, но часто пропускаемая причина — это отсутствие или некорректное написание выражения на закладке Ресурсы. Если вы просто добавили поле в список ресурсов, но не указали функцию, СКД может вести себя непредсказуемо в зависимости от версии платформы.
Проанализируем ситуацию: если в колонке «Выражение» указано просто Посещаемость, то система не понимает, как именно нужно объединять данные при группировке по дате. В итоге она выводит значение одной из детальных записей (часто последней найденной).
Что нужно сделать:
Факт и Пос).Сумма().
Сумма(Посещаемость)
Сумма(Нагрузка)
Важно помнить, что даже если в запросе вы уже использовали СУММИРОВАТЬ, для СКД это не является указанием считать итоги в итоговых строках отчета. Ресурсы — это единственный способ заставить СКД агрегировать данные на уровнях группировок.
Если Сумма() прописана, но отчет все равно выводит единицы, нам необходимо проверить закладку Наборы данных. Особое внимание следует уделить колонке Роли. Система компоновки данных использует роли для определения того, как группировать строки и как рассчитывать итоги.
Разберем основные ошибки в ролях:
Сумма() может игнорировать такие значения. Рекомендуется явно указать тип Число с нужной точностью.Рассмотрим структуру самого отчета на закладке Настройки. Часто пользователь добавляет группировку (например, по Дате), а внутри нее оставляет объект Детальные записи.
Если вы выводите данные в «Детальных записях», то СКД по определению выводит каждую строку из результата запроса по отдельности. В этом случае в каждой строке будет стоять 1, потому что это атомарная запись. Сумма (2) появится только в строке вышестоящей группировки («Дата»).
Как проверить:
Иногда программист вносит изменения в конфигураторе, сохраняет их, но в режиме «Предприятие» отчет продолжает работать по-старому. Это происходит из-за того, что 1С сохраняет настройки отчета для каждого пользователя индивидуально в системных таблицах или кэше.
Изменение имени отчета в метаданных (как предлагалось в обсуждении) — это радикальный способ «обмануть» систему кэширования, но есть более правильный путь.
Рассмотрим правильный алгоритм сброса:
После этого СКД перечитает схему из метаданных и применит ваши новые настройки ресурсов и ролей.
Проанализируем ситуацию в запросе. Если данные собираются из нескольких таблиц через ЛЕВОЕ СОЕДИНЕНИЕ, в полях посещаемости могут возникнуть значения NULL. Хотя функция Сумма() в СКД обычно корректно обрабатывает NULL, иногда это может приводить к сбоям в сложных выражениях.
Посмотрим на пример правильной подготовки данных в тексте запроса:
ВЫБРАТЬ
Сотрудники.Ссылка КАК Сотрудник,
ЕСТЬNULL(Посещаемость.Часы, 0) КАК ЧасыФакт,
ЕСТЬNULL(Нагрузка.Часы, 0) КАК ЧасыНагрузка
ИЗ
Справочник.Сотрудники КАК Сотрудники
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Посещаемость КАК Посещаемость
ПО ...
Использование ЕСТЬNULL(Поле, 0) гарантирует, что в СКД попадет число, которое система сможет однозначно сложить.
На закладке Ресурсы есть колонка «Рассчитывать по...». По умолчанию она пустая. Это означает, что ресурс будет рассчитываться для всех группировок и для общих итогов. Однако, если кто-то из разработчиков указал там конкретную группировку (например, только «Организация»), то на уровне «Дата» или «Сотрудник» сумма считаться не будет — там отобразится либо пустота, либо некорректное значение из первой строки.
Решение: Убедитесь, что список в колонке «Рассчитывать по...» либо пуст, либо содержит все необходимые уровни группировок вашего отчета.
Сумма(ИмяПоля).Число.Следование этим шагам позволяет решить проблему в 99% случаев, обеспечивая корректный вывод суммарных показателей в отчетах любой сложности.