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

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

Часто при разработке отчетов в системе компоновки данных (СКД) возникает ситуация, когда при включенных детальных записях отчет выводит корректные суммы, а при отключении детальных записей и выводе только группировок значения в итогах становятся неверными или повторяют показатели первой строки. Давайте вместе разберемся, почему так происходит и как это исправить.

Разберемся с механизмом работы ресурсов и группировок

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

Для начала проанализируем настройки ресурсов:

  1. Перейдите на вкладку Ресурсы в редакторе СКД.
  2. Проверьте колонку Выражение. Именно здесь задается формула, по которой считается итог.
  3. Проверьте колонку Рассчитывать по. Если здесь пусто, СКД пытается вычислять ресурс по всем доступным группировкам. Убедитесь, что логика вашего ресурса не привязана жестко к детальным записям.

Проанализируем поведение системы при оптимизации запросов

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

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


ВЫБРАТЬ
    Данные.Склад КАК Склад,
    Данные.Номенклатура КАК Номенклатура,
    Данные.Показатель КАК Показатель
ИЗ
    (ВЫБРАТЬ "Склад 1" КАК Склад, "Ручка синяя" КАК Номенклатура, 100 КАК Показатель
    ОБЪЕДИНИТЬ ВСЕ
    ВЫБРАТЬ "Склад 1", "Ручка красная", 200
    ОБЪЕДИНИТЬ ВСЕ
    ВЫБРАТЬ "Склад 2", "Ручка красная", 400
    ОБЪЕДИНИТЬ ВСЕ
    ВЫБРАТЬ "Склад 2", "Ручка синяя", 50) КАК Данные

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

Как отладить и исправить проблему

Если стандартная сумма не помогает, воспользуемся следующими методами:

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

Рекомендации по выражениям ресурсов

Если в ваших формулах присутствует деление, обязательно используйте проверку на ноль. Часто при отключении детальных записей количество строк меняется, и если в знаменателе оказывается сумма по пустой выборке, результат может стать некорректным. Используйте конструкцию:


ВЫБОР
    КОГДА Сумма(Знаменатель) = 0 ТОГДА 0
    ИНАЧЕ Сумма(Числитель) / Сумма(Знаменатель)
КОНЕЦ

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

← На главную