При работе с отчетами, построенными на системе компоновки данных (СКД), пользователи часто сталкиваются с необходимостью добавить собственные расчетные колонки. В режиме 1С:Предприятие это реализуется через механизм пользовательских полей. Однако просто добавить формулу для строки недостаточно: когда в отчете используется иерархия (например, по номенклатуре или контрагентам), суммы в родительских ветках могут оставаться пустыми или рассчитываться некорректно. Разберем подробно, как заставить систему суммировать данные по иерархии и группировкам, не прибегая к конфигуратору.
Для начала проанализируем, как устроено добавление формул в режиме предприятия. Перейдя в настройки отчета (кнопка Еще — Настройки — Пользовательские поля), мы можем создать «Поле-выражение». Важно понимать, что в окне редактирования такого поля всегда присутствуют две ключевые области:
Цена * Количество.СУММА(...)), которая скажет системе, как объединять значения детальных записей в итоги по группам и родительским элементам.Если оставить поле итогов пустым, 1С не будет знать, как сворачивать данные, и в строках-родителях вы увидите пустоту или некорректные данные.
Рассмотрим ситуацию, когда нам нужно просто сложить значения пользовательской колонки. Допустим, мы создали поле, которое вычисляет остаток с учетом некоего коэффициента. Чтобы итоги по иерархии заработали, выполним следующие действия:
В поле Выражение итогов пропишем стандартную функцию агрегации. Чаще всего это обычная сумма:
СУММА(ИмяВашегоПоля)
Или, если вы используете в расчете другие поля компоновки:
СУММА(КоличествоОстаток * МойПользовательскийКоэффициент)
Важный момент: если имя поля содержит пробелы, спецсимволы или начинается с цифры, его обязательно нужно заключать в квадратные скобки. Например: СУММА([8-30 days]). Без скобок система выдаст ошибку о синтаксической ошибке или ожидаемой закрывающей скобке.
Иногда задача усложняется: нам нужно, чтобы в подчиненных строках (детальных записях) вычислялось одно значение, а в итоговых строках — совершенно другое. Для этого проанализируем ситуацию с использованием функции Уровень().
Функция Уровень() возвращает число, соответствующее вложенности текущей строки в иерархии (0 — это общий итог, 1 — верхний уровень группировки и так далее). Рассмотрим пример использования в выражении:
Выбор
Когда Уровень() > 2
Тогда [СуммаПродаж] * 0.1 // Считаем бонус для нижнего уровня
Иначе СУММА([СуммаПродаж] * 0.1) // Суммируем бонусы для руководителей
Конец
Этот подход позволяет гибко управлять отображением данных на разных этапах разворота отчета.
Бывают случаи, когда простая функция СУММА() не подходит. Например, если в детальных записях мы берем МАКСИМУМ из какого-то значения, а на уровне группы нам нужно получить именно сумму этих максимумов, а не максимум по всей группе. Для таких вычислений в СКД предусмотрена мощная функция ВычислитьВыражениеСГруппировкойМассив.
Разберем пример синтаксиса, который часто вызывает затруднения у начинающих разработчиков:
СУММА(ВычислитьВыражениеСГруппировкойМассив("Максимум([8-30 days])", "ОбъектРасчетов"))
Проанализируем, что здесь происходит:
"ОбъектРасчетов") — это имя поля группировки, по которому система соберет данные в массив перед суммированием.СУММА() снаружи складывает все элементы полученного массива.Внимание: При написании этой формулы в режиме предприятия часто забывают про кавычки внутри функции или квадратные скобки вокруг имен полей. Проверьте, чтобы строка внутри кавычек была корректным выражением СКД.
Проанализируем несколько типичных ошибок, которые могут помешать получению результата:
1. Обработка пустых значений (NULL).
Если в ваших исходных данных есть пустые значения, любая математическая операция с ними (например, сложение) вернет пустой результат. Чтобы этого избежать, всегда используйте функцию ЕстьNULL. Например: ЕстьNULL(СуммаОстаток, 0) + ЕстьNULL(ПользовательскоеПоле, 0). Это гарантирует, что итоговая сумма не «обнулится» из-за одной пустой ячейки.
2. Проверка настроек группировок.
Если вы настроили выражение итогов, но колонка в отчете все равно пустая на уровне групп, проверим настройки конкретной группировки. Иногда в «Выбранных полях» отдельной группировки (например, «Контрагент») флажок авто-поля снят или состав полей переопределен вручную. В этом случае нужно явно добавить ваше пользовательское поле в список выбранных полей этой группировки.
3. Использование системных полей.
Помимо Уровень(), мы можем использовать поле НомерВГруппировке(). Это полезно, если расчет итога зависит от того, является ли строка первой в списке. Хотя это редко требуется для простых сумм, в сложных управленческих отчетах это незаменимый инструмент.
Настройка итогов в режиме «1С:Предприятие» — это эффективный способ кастомизации отчета без изменения конфигурации. Главное правило: всегда заполняйте вкладку «Выражение итогов» и внимательно следите за синтаксисом имен полей. Использование функций СУММА, Уровень и ВычислитьВыражениеСГруппировкойМассив позволяет реализовать практически любую логику агрегации данных, которая доступна профессиональному разработчику в конфигураторе.