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