В процессе работы с отчетами на базе Системы компоновки данных (СКД), особенно в таких сложных конфигурациях, как 1С:ERP Управление предприятием, пользователи и разработчики часто сталкиваются с ситуацией, когда созданное пользовательское поле ведет себя непредсказуемо. Типичный сценарий: вы добавляете новое поле-выражение, и оно прекрасно выводит результат функции Количество, но наотрез отказывается считать Сумму, Среднее или Максимум. При этом в детальных записях числа отображаются корректно, а в строках итогов и группировок вместо ожидаемых сумм красуются пустые значения или нули.
Давайте подробно разберем, почему возникает эта "загадка" и как ее решить, используя как средства пользовательского режима, так и инструменты разработчика.
Для начала проанализируем разницу в механизмах работы этих агрегатных функций внутри движка СКД. Функция Количество() крайне неприхотлива: ей достаточно самого факта наличия записи. Она может считать строки, ссылки, даты и даже пустые строки. Однако функции Сумма(), Среднее() или Минимум() требуют строго определенных типов данных — чаще всего Числа.
Выделим основные причины сбоя вычислений:
NULL. Математическая операция 10 + NULL в языке запросов и СКД всегда дает NULL. В то время как Количество просто пропустит эту запись или посчитает ее (в зависимости от настроек), Сумма по всей группировке может "обнулиться" из-за одного-единственного пустого значения.Сумма(МоеПоле) прямо в выражении детальных записей. Это в корне неверно и приводит к ошибкам интерпретации схемы.Рассмотрим первый и самый важный шаг — приведение данных к числовому виду. Если ваше пользовательское поле базируется на арифметике других полей, обязательно оберните каждое из них в функцию проверки на NULL. Проанализируем пример правильного написания выражения для детальных записей:
ЕСТЬNULL(ПолеПродажи, 0) + ЕСТЬNULL(ПолеВозвраты, 0)
Использование гарантирует, что даже если данных по одному из ресурсов нет, система воспримет это как числовой ноль и сможет корректно прибавить его к остальным значениям. Это база, без которой расчет итогов по сумме в СКД часто превращается в лотерею.ЕСТЬNULL
Если вы работаете в типовом отчете ERP без изменения конфигурации, внимательно посмотрите на структуру окна редактирования пользовательского поля. Выясним, как правильно распределить формулы:
Цена * Количество. Здесь нельзя использовать агрегатные функции вроде Сумма().Сумма(ВашеПоле).Важный нюанс: как было отмечено в обсуждении, иногда попытка продублировать формулу в верхнем поле (детальные записи) с использованием агрегатных функций блокирует расчет. Попробуйте оставить в верхнем поле только формулу расчета строки, а в нижнем — только функцию агрегации.
Рассмотрим ситуацию, когда настройки в пользовательском режиме не помогают. Это часто случается в ERP, когда структура набора данных слишком сложна для динамической интерпретации пользовательских выражений. В этом случае наиболее надежный путь — сделать отчет внешним и настроить Ресурсы на уровне схемы.
Выполним следующие действия:
.erf).Сумма(ИмяВашегоПоля).Такой подход "с козырей", как выразились участники обсуждения, снимает большинство проблем с приоритетами вычислений в СКД.
Проанализируем еще один тонкий технический момент. В СКД существует строгая последовательность: сначала вычисляются Вычисляемые поля, затем — Ресурсы. Если ваше поле является "вторичным" (считается на основе других ресурсов, которые сами являются расчетными), то в пользовательском режиме оно может не успевать агрегироваться.
В конфигураторе для таких случаев предусмотрена настройка "Рассчитывать после группировок" (на вкладке "Ресурсы" для конкретного поля). В пользовательском режиме (через настройки предприятия) доступа к этой опции нет. Если ваша сумма зависит от итогов других полей, то единственный стабильный вариант — использование внешнего отчета с явным указанием порядка расчета ресурсов.
Подводя итог, если вы столкнулись с тем, что "Количество" считается, а "Сумма" нет, пройдите по этому чек-листу:
ЕСТЬNULL(Поле, 0) везде, где есть риск получения пустых данных.Помните, что СКД — это мощный математический движок, и он требует математической точности. Проблема с "загадочным" поведением полей в 90% случаев кроется в неявном преобразовании типов или пропущенных пустых значениях в выборке данных.