При разработке отчетов на базе системы компоновки данных (СКД) разработчики часто сталкиваются с ситуацией, когда отчет завершается с ошибкой «Поле не найдено», хотя визуально поле присутствует и в схеме, и в настройках отчета. Разберем механику работы СКД, выясним причины возникновения этой ошибки и рассмотрим практические способы ее устранения.
Для понимания корня проблемы проанализируем последовательность вычислений, которую выполняет компоновщик данных при формировании отчета:
Вычисляемые поля. Значения становятся доступны на уровне детальных записей.Ресурсы с применением агрегатных функций (Сумма, Количество, Минимум, Максимум и др.).Если выражение для поля задано исключительно на вкладке Ресурсы, это поле физически отсутствует в детальных записях. Когда другой ресурс пытается обратиться к нему через агрегатную функцию (например, Сумма(ЗачетАвансовПрошлогоГода)), СКД пытается найти детальное поле с таким именем в наборе данных или вычисляемых полях, не находит его и возвращает ошибку «Поле не найдено». Ресурс не может выступать аргументом функции Сумма() в другом ресурсе.
Самое простое и эффективное решение, когда поле должно рассчитываться для каждой строки и затем участвовать в других агрегатах — перенести формулу в детальные записи. Разберем по шагам, как это сделать:
ЗачетАвансовПрошлогоГода) и укажем его формулу в колонке Выражение.ПогашениеВсего) укажем стандартное выражение агрегации:Теперь СКД сначала вычислит значение для каждой строки на этапе детальных записей, после чего успешно просуммирует его в итоговом ресурсе.
Если нет необходимости создавать отдельное вычисляемое поле, но нужно рассчитать сумму нескольких показателей в итоговом ресурсе, скорректируем выражение ресурса. Вместо попытки сложить агрегаты от несуществующих детальных полей, выполним сложение исходных полей внутри агрегатной функции или сложим результаты агрегаций исходных полей.
Посмотрим на пример правильного оформления выражения на вкладке Ресурсы для поля ПогашениеВсего:
Сумма(ЕстьNull(Поле1, 0)) + Сумма(ЕстьNull(Поле2, 0))
Или через единую агрегатную функцию:
Сумма(ЕстьNull(Поле1, 0) + ЕстьNull(Поле2, 0))
Если показатель формируется только на уровне группировок (например, с помощью условий по иерархии) и перенести его в детальные записи невозможно, воспользуемся встроенными функциями языка выражений СКД:
ВычислитьВыражение(): позволяет рассчитать значение в контексте нужной группировки или общего итога без прямого суммирования ресурса.ВычислитьВыражениеСГруппировкойМассив(): собирает массив значений ресурса по подчиненным группировкам, к которому затем применяется агрегатная функция:
Сумма(ВычислитьВыражениеСГруппировкойМассив("ЗачетАвансовПрошлогоГода", "Контрагент"))
Если в формулах ресурсов все настроено корректно, но ошибка сохраняется, проанализируем следующие моменты:
Макеты), а в ячейке макета указан параметр с именем поля, это поле обязательно должно быть добавлено в список Выбранные поля соответствующей группировки. Если поле исключено из выбранных, макет не сможет получить его значение.Наборы данных. Если для поля установлены флаги ограничения (запрет выбора или запрет использования в группировках), обращение к нему в вычислениях вызовет исключение.