При разработке отчетов на базе системы компоновки данных (СКД) разработчики нередко сталкиваются с ситуацией, когда детальные строки отчета выводятся корректно, однако строка Общий итог выдает неверное значение. Дополнительное недоумение вызывает проверка значений с помощью встроенного калькулятора 1С (кнопка M+ или автосумма), когда ручное сложение видимых строк дает результат, не совпадающий ни с СКД, ни с реальной суммой. Разберем по шагам причины такого поведения платформы и способы устранения обеих проблем.
Проанализируем, как компоновщик макета и процессор компоновки данных рассчитывают агрегатные значения. В схеме компоновки данных на вкладке Наборы данных для каждого поля можно настроить его роль (колонка Роль). По умолчанию платформа пытается определить роли автоматически, но при сложных запросах, обращении к документам или левых соединениях таблиц флаг Измерение может не установиться.
Если поле группировки (например, Организация или Контрагент) не помечено как измерение, СКД применяет базовые правила агрегации записей. В случае получения данных из документов или нереляционных выборок строки набора данных могут дублироваться на уровне выборки. Без признака измерения СКД не может однозначно определить границы уникальности записей для расчета итогов и начинает просто складывать все строки или некорректно рассчитывать остатки.
Разберем последовательность действий для исправления схемы компоновки данных:
Организация).Договор.Контрагент), укажем в свойстве Родитель соответствующее базовое измерение.После установки роли Измерение система компоновки данных начинает корректно учитывать группировку при расчете итоговых значений, и строка Общий итог рассчитывается правильно как с отбором, так и без него.
Если структура данных содержит сложную многоуровневую иерархию и стандартное суммирование через Сумма(Поле) дает задвоение на уровне общих итогов, перейдем на вкладку Ресурсы. Для поля ресурса можно переопределить формулу расчета для группировки Общий итог, используя специализированные функции СКД:
Сумма(ВычислитьВыражениеСГруппировкойМассив("СуммаОборот", "Организация"))
Данное выражение вычисляет массив значений ресурса СуммаОборот на уровне уникальных записей группировки Организация и затем суммирует их, исключая дубли на детальном уровне.
Выясним причину, по которой встроенный калькулятор 1С выдает завышенную сумму при попытке сложить строки отчета. Пользователи часто сворачивают отчет до верхнего уровня группировок и выделяют диапазон ячеек мышью или с помощью клавиши Shift, после чего нажимают клавишу M+ (добавить в калькулятор) или смотрят на автосумму в строке состояния.
В табличном документе 1С свернутые строки не удаляются из таблицы — они лишь физически скрываются (высота строк становится равной нулю или скрывается группировкой). Когда пользователь выделяет непрерывный диапазон ячеек через протяжку мыши сверху вниз по свернутым строкам, в область выделения попадает прямоугольный массив ячеек, включающий все скрытые дочерние строки.
В результате встроенный калькулятор суммирует:
Это приводит к ровному задвоению (или многократному увеличению) расчетной суммы в калькуляторе.
Для корректного получения суммы через встроенный калькулятор или строку состояния применимы следующие подходы:
Ctrl и кликнем мышью по второй ячейке группировки. При таком выделении формируется список несмежных областей, куда скрытые строки не включаются, и калькулятор складывает только видимые числа.M+.Чтобы избежать ошибок расчета итогов и упростить проверку отчетов пользователями, придерживаемся следующих правил:
Обороты, ОстаткиИОбороты), а не к табличным частям документов. Регистры уже содержат подготовленные измерения и корректно индексированы.ЛЕВОЕ СОЕДИНЕНИЕ внутри одного запроса.