При разработке отчетов на базе Системы компоновки данных (СКД) в 1С программисты и продвинутые пользователи часто используют механизм кросс-таблиц для наглядного сопоставления данных по различным осям (например, по дням недели и складам). Однако при попытке внедрить пользовательские поля для расчета дополнительных показателей (например, сложения сумм продаж и возвратов) можно столкнуться с неприятной ситуацией: в обычных колонках детальные записи выводятся корректно, а в системной колонке ИТОГО результат не рассчитывается вовсе либо выводится пустым.
В этой статье мы подробно разберем, почему возникает данная проблема, рассмотрим внутренние механизмы СУБД и СКД, а также изучим два практических способа ее решения: быстрый (через пользовательские поля в режиме «1С:Предприятие») и профессиональный (через вычисляемые поля и ресурсы в конфигураторе).
Для того чтобы эффективно решить проблему, нам необходимо понять физический смысл происходящего в системе. Наблюдаемое поведение — отсутствие итогов и детальных записей в итоговом столбце — вызвано двумя независимыми факторами, которые накладываются друг на друга.
Фактор первый: Логика работы с неопределенными значениями (NULL).
В кросс-таблицах сетка данных формируется динамически на пересечении строк и колонок. Если на каком-то пересечении данных нет (например, в конкретный день по кассе не было оформлено ни одного возврата), СУБД возвращает для этого поля значение NULL (отсутствие значения). Когда мы пишем простое арифметическое выражение вроде СуммаЧека + СуммаВозврата, система пытается сложить число и NULL. По законам реляционной логики любая математическая операция с участием NULL всегда возвращает NULL:
100 + NULL = NULL
500 - NULL = NULL
NULL + NULL = NULL
В результате на пересечении колонок, где хотя бы один показатель пуст, СКД не может вычислить сумму и выводит пустую ячейку. Это же правило проецируется и на итоговые колонки, собирающие данные по строкам.
Фактор второй: Отсутствие явного агрегирования в выражении итогов.
Пользовательское поле в СКД имеет две независимые формулы расчета: выражение детальных записей и выражение итоговых записей. Если мы не заполним формулу итогов или забудем использовать в ней агрегатную функцию (такую как Сумма, Среднее, Максимум), СКД просто не поймет, как сгруппировать детальные записи при выводе в общие итоги по горизонтали или вертикали. Вместо корректной суммы система либо оставит поле пустым, либо подставит туда первое попавшееся значение детальной записи.
---
Если отчет настраивается непосредственно в режиме «1С:Предприятие» и у нас нет возможности открыть конфигуратор, исправить проблему можно напрямую в окне редактирования пользовательского поля. Рассмотрим этот процесс по шагам.
Откроем настройки нашего отчета, перейдем к редактированию формулы проблемного пользовательского поля и обратим внимание на две ключевые вкладки: Выражение детальных записей и Выражение итоговых записей.
Шаг 1. Настройка детальных записей.
Чтобы исключить влияние пустых ячеек (значений NULL), мы должны обернуть каждое слагаемое поле в системную функцию ЕстьNULL, которая принудительно заменяет отсутствующие данные на числовой ноль. Формула на вкладке детальных записей должна выглядеть следующим образом:
ЕстьNULL(СуммаЧекаККМ, 0) + ЕстьNULL(СуммаЧекаККМВозврат, 0)
Шаг 2. Настройка итоговых записей.
Переходим на вкладку «Выражение итоговых записей». Здесь нам необходимо принудительно указать агрегатную функцию Сумма для каждого слагаемого показателя по отдельности. Это крайне важно: нельзя просто написать Сумма(Поле1 + Поле2), так как внутри функции сложения все равно может оказаться NULL. Корректная итоговая формула выглядит так:
Сумма(ЕстьNULL(СуммаЧекаККМ, 0)) + Сумма(ЕстьNULL(СуммаЧекаККМВозврат, 0))
Важное синтаксическое правило для полей с пробелами:
Если в названиях ваших исходных полей содержатся пробелы или специальные символы (например, поле называется Сумма документа или Сумма возврата), их имена в формулах пользовательских полей обязательно нужно заключать в квадратные скобки. В противном случае парсер СКД выдаст ошибку синтаксиса. Пример написания:
Сумма(ЕстьNULL([Сумма документа], 0)) + Сумма(ЕстьNULL([Сумма возврата], 0))
После сохранения данных настроек сформируем отчет заново. Система начнет корректно складывать значения на детальном уровне, а в итоговой колонке отобразится математически верная сумма по всем группировкам.
---
Хотя настройка через пользовательские поля работает исправно, для разработчиков более правильным, надежным и гибким решением является перенос этой логики на уровень схемы компоновки данных в конфигураторе. Это позволит зафиксировать логику расчета, избежать случайного изменения формул пользователями и повысить быстродействие отчета.
Проанализируем алгоритм настройки схемы компоновки данных:
ИтоговаяСуммаПродаж) и его заголовок, который увидят пользователи.ЕстьNULL(СуммаЧекаККМ, 0) + ЕстьNULL(СуммаЧекаККМВозврат, 0)
ИтоговаяСуммаПродаж в список ресурсов.Сумма(ИтоговаяСуммаПродаж)
Использование связки «Вычисляемое поле + Ресурс» гарантирует, что СКД автоматически применит оптимизированные алгоритмы расчета итогов на уровне временных таблиц базы данных, а результирующая колонка ИТОГО заполнится корректно во всех режимах компоновки.
---
Если вы применили вышеописанные формулы с ЕстьNULL и агрегатными функциями, но колонка итогов по-прежнему пустует или исчезла, рекомендуем проверить следующие настройки структуры отчета:
Расположение итогов по горизонтали и Расположение итогов по вертикали не установлены в значение «Нет». Для корректного вывода кросс-таблиц там должно быть выбрано «Авто», «Начало» или «Конец».Проанализировав структуру данных и применив правильные методы обработки значений NULL, мы сможем создавать безотказные и математически точные отчеты любой сложности в СКД.