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