Почему пользовательское поле в СКД ничего не возвращает в итогах и как это исправить

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При работе с Системой компоновки данных (СКД) разработчики и продвинутые пользователи часто сталкиваются с ситуацией, когда созданное пользовательское поле прекрасно отображает значения в детальных записях, но в строках итогов по группировкам или в общих итогах остается пустым. Особенно часто это проявляется при попытке использовать агрегатные функции, такие как Максимум, Минимум или Сумма, в сочетании со сложными условиями ВЫБОР.

Рассмотрим ситуацию, когда автор пытается вычислить дату возникновения задолженности по условию, используя следующее выражение:


Максимум(Выбор
    Когда ОстатокНаКонецПериода > СуммаДолгНарастающим
        Тогда ДатаВозникновенияЗадолженности
    Иначе ДатаВремя(1, 1, 1)
Конец)

Проанализируем причины, по которым это поле может не возвращать данные в итогах, и разберем по шагам, как настроить отчет правильно.

1. Разделение выражений детальных записей и выражений итогов

Выясним главную особенность пользовательских полей в режиме «1С:Предприятие». В настройках пользовательского поля существуют две важные области: «Выражение детальных записей» и «Выражение итогов».

По умолчанию пользователи часто заполняют только первое поле. Однако 1С не рассчитывает итоги по пользовательскому полю автоматически, если для этого не задана соответствующая формула. Чтобы итоги появились, необходимо:

  1. Перейти в редактирование пользовательского поля.
  2. Найти вкладку или раздел, отвечающий за итоги.
  3. Продублировать туда агрегатное выражение (например, с функцией Максимум).

Если во вкладке итогов пусто, система считает, что расчет итогов для данного поля не предусмотрен, и оставляет ячейку пустой, даже если в детальных записях данные есть.

2. Перенос логики в вычисляемые поля (Рекомендуемый метод)

Посмотрим на ситуацию с точки зрения профессиональной разработки. Пользовательские поля, создаваемые в настройках отчета, имеют ряд ограничений. Гораздо надежнее использовать механизм Вычисляемых полей непосредственно в схеме компоновки данных (в конфигураторе или через инструменты разработчика).

Разберем этот процесс по шагам:

  1. Создадим вычисляемое поле, например, с именем ДатаЗадолженности.
  2. В колонку «Выражение» запишем условие без агрегатной функции:
    
    Выбор
        Когда ОстатокНаКонецПериода > СуммаДолгНарастающим
            Тогда ДатаВозникновенияЗадолженности
        Иначе ДатаВремя(1, 1, 1)
    Конец
    
  3. Перейдем на закладку «Ресурсы».
  4. Добавим наше поле ДатаЗадолженности в список ресурсов.
  5. В колонке «Выражение» для ресурса укажем: Максимум(ДатаЗадолженности).

Именно такой подход гарантирует корректный расчет итогов на всех уровнях группировок, так как СКД будет применять функцию Максимум ко всему массиву данных, попавших в конкретную группу.

3. Проблема пустых дат и значений NULL

Проанализируем, как ведут себя функции Максимум и Минимум при наличии пустых значений. Если в условии ВЫБОР ветка ИНАЧЕ возвращает ДатаВремя(1, 1, 1), то для функции Максимум это будет самым маленьким значением. Но если поле ДатаВозникновенияЗадолженности в каких-то строках содержит NULL, это может привести к неожиданным результатам в агрегатах.

Рекомендуется явно обрабатывать NULL с помощью функции ЕстьNull:

Максимум(ЕстьNull(ДатаВозникновенияЗадолженности, ДатаВремя(1, 1, 1)))

Также стоит убедиться, что тип возвращаемого значения в обеих ветках ВЫБОР строго совпадает. Если одна ветка возвращает дату, а вторая — число или строку, итоги могут не отобразиться из-за конфликта типов.

4. Зависимость от контекста и других ресурсов

Выясним причину, упомянутую автором в сообщении 7: ДатаВозникновенияЗадолженности сама является выражением. В СКД расчет итогов происходит по определенным правилам приоритетности. Если поле, на которое опирается агрегатная функция, само является сложным вычисляемым выражением, система должна понимать, как его вычислять в контексте группировки.

Чтобы выражение ОстатокНаКонецПериода > СуммаДолгНарастающим корректно работало в итогах, поля ОстатокНаКонецПериода и СуммаДолгНарастающим обязательно должны быть определены как ресурсы на закладке «Ресурсы». Если они не являются ресурсами, СКД не сможет получить их значение в строке итога группировки, и результат условия ВЫБОР всегда будет уходить в ветку Иначе или возвращать NULL.

5. Использование функции ВычислитьВыражение

В особо сложных случаях, когда обычная агрегация не помогает, мы можем использовать мощную функцию ВычислитьВыражение(). Она позволяет явно указать системе, в каком контексте нужно произвести расчет.

Пример использования в выражении ресурса:


Максимум(ВычислитьВыражение("Выбор Когда Остаток > Долг Тогда Дата Конец", , "Группировка"))

Этот метод заставляет систему сначала вычислить логику ВЫБОР для каждой строки внутри группировки, а затем применить к результатам функцию Максимум.

6. Проверка настроек «Рассчитывать по...»

Напоследок проверим техническую настройку на закладке «Ресурсы». Даже если формула верна, в колонке «Рассчитывать по...» должны быть отмечены те группировки, в которых вы хотите видеть результат. Если вы хотите видеть итог в самой нижней строке отчета, убедитесь, что в списке выбран пункт Общий итог.

Резюмируем: для исправления отсутствующих итогов в пользовательском поле лучше всего перенести логику в «Вычисляемые поля», зарегистрировать это поле в «Ресурсах» с нужной агрегатной функцией и убедиться, что все используемые в формуле поля (остатки, суммы) также являются ресурсами.

← На главную