При разработке отчетов на системе компоновки данных СКД разработчики часто сталкиваются с двумя классическими проблемами: изменения в структуре схемы не отражаются в пользовательских настройках, а вычисляемые поля начинают отображать странные, агрегированные значения. Давайте разберем, почему это происходит и как с этим работать.
Многие из нас ошибочно полагают, что пользовательский вариант отчета — это «наслоение» поверх основной схемы. На самом деле, когда пользователь или администратор сохраняет вариант, система фиксирует текущее состояние КомпоновщикаНастроек как самостоятельный объект. В этот объект записываются все выбранные поля, группировки и отборы, которые существовали в момент нажатия кнопки «Сохранить».
Когда вы вносите изменения в основную схему СКД (например, добавляете новое поле), система не делает автоматический «merge» этих изменений в существующие сохраненные варианты. Это сделано для того, чтобы пользователь не столкнулся с неожиданными изменениями в привычном ему интерфейсе отчета. Чтобы исправить эту ситуацию, у нас есть несколько путей:
ПользовательскиеНастройки, добавлять в них недостающие поля из основной схемы и сохранять их обратно в ВариантОтчета.МенеджерВариантовОтчетов (если используется БСП).Вторая проблема — когда поле, которое должно выводить конкретное значение (например, среднемесячный оборот), начинает показывать сумму или иные «странные» числа — чаще всего кроется в механизмах агрегации СКД.
Рассмотрим пошагово, как диагностировать и устранить эту ошибку:
Ресурсы в настройках СКД. Если ваше поле СреднемесячныйОборот попало в этот список, СКД будет автоматически суммировать его при любой группировке. Удалите его из списка ресурсов, если вы хотите выводить значение «как есть».Наборы данных. Если для поля установлена роль, которая провоцирует группировку, система будет пытаться вычислить агрегат. Попробуйте убрать лишние роли, оставив поле обычным атрибутом данных.Настройки -> Выбранные поля. Проверьте, не стоит ли там по умолчанию функция Сумма(). Бывает так, что при добавлении поля система автоматически «навешивает» на него агрегатную функцию. Удалите её, оставив просто имя поля.Чтобы понять, где именно происходит искажение, мы рекомендуем выполнить следующие действия:
Во-первых, создайте в СКД Вычисляемое поле, которое выводит исходные слагаемые, на базе которых строится ваш показатель. Если сумма этих слагаемых при выводе выглядит корректно, а итоговый результат — нет, значит, ошибка именно в формуле вычисления или в логике агрегации ресурсов.
Во-вторых, если данные в консоли запросов выглядят верно, а в СКД — нет, значит, проблема в настройках компоновки. Попробуйте принудительно отключить использование ресурсов для этого поля, используя код:
// Пример отключения авто-агрегации через настройки компоновщика (фрагмент логики)
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
ВыбранныеПоля = Настройки.Выбор.Элементы;
Для Каждого Элемент Из ВыбранныеПоля Цикл
Если Элемент.Поле = Новый ПолеКомпоновкиДанных("СреднемесячныйОборот") Тогда
Элемент.Использование = Истина;
// Убедитесь, что агрегатная функция не задана
КонецЕсли;
КонецЦикла;
Внимательно проанализируйте связи наборов данных, так как именно они чаще всего являются источником «лишних» строк, которые СКД затем пытается суммировать, выдавая неверные итоговые значения. Если СреднемесячныйОборот зависит от количества строк в результате, убедитесь, что вы не используете лишние группировки в итоговой таблице отчета.