Как сложить два столбца в СКД 1С и почему не работает простое сложение?

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

Каждый разработчик 1С при построении отчетов в Системе компоновки данных (СКД) рано или поздно сталкивается с задачей сложения числовых данных из двух разных колонок. Казалось бы, что может быть проще, чем написать формулу Поле3 + Поле4? Однако на практике такой простой подход часто приводит к тому, что в отчете отображаются пустые ячейки, а итоговые суммы по группировкам рассчитываются неверно или не рассчитываются вовсе.

В этой статье мы подробно разберем, почему ломается простое сложение в СКД, изучим коварную природу значений NULL, найдем оптимальные решения для вычисляемых полей и запросов, а также научимся правильно настраивать ресурсы для корректного отображения итогов.

Выясняем причину: коварство значения NULL

Давайте проанализируем ситуацию, с которой столкнулся автор темы. Попытка написать логическое условие:


ВЫБОР 
    КОГДА Поле3 > 0 И Поле4 > 0 
        ТОГДА Поле3 + Поле4 
    ИНАЧЕ Поле4 
КОНЕЦ

потерпела неудачу. Почему же СКД складывает далеко «не всё»? Все дело в специфике значения NULL, которое принципиально отличается от обычного нуля.

Значение NULL в базах данных означает полное отсутствие каких-либо данных (неопределенное состояние). При работе с ним действуют особые правила логики и математики:

  1. Математическое правило: Любая арифметическая операция (сложение, вычитание, умножение, деление), в которой участвует хотя бы одно значение NULL, всегда возвращает NULL. Например:
    100 + NULL = NULL
    500 * NULL = NULL
  2. Особенность логического сравнения: Любое сравнение значения NULL с обычным числом с использованием стандартных операторов (>, <, =, <>) всегда возвращает Ложь. Поэтому условие Поле3 > 0 вернет ложь, если в Поле3 содержится NULL, даже если чисто визуально ячейка кажется пустой.

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

Решение 1. Использование функции ЕСТЬNULL в вычисляемых полях

Рассмотрим самый быстрый и надежный способ решения проблемы непосредственно в интерфейсе настройки схемы компоновки данных. Для обхода проблемы с пустыми значениями в 1С предусмотрена специальная функция ЕСТЬNULL. Она проверяет первый параметр, и если он равен NULL, то возвращает второй (подстановочный) параметр.

Перейдем на вкладку «Вычисляемые поля» в СКД и добавим новое поле (например, с именем ИтоговаяСумма). В колонку «Выражение» пропишем следующую формулу:

ЕСТЬNULL(Поле3, 0) + ЕСТЬNULL(Поле4, 0)

Разберем по шагам, как это работает:

Решение 2. Сложение полей на уровне запроса

Иногда более предпочтительным является сложение показателей еще на этапе получения данных из базы данных. Это позволяет разгрузить сервер приложений 1С, перенеся расчеты на сторону СУБД.

В тексте запроса СКД мы можем написать аналогичную конструкцию:


ВЫБРАТЬ
    ЕСТЬNULL(Таблица.Поле3, 0) КАК Поле3,
    ЕСТЬNULL(Таблица.Поле4, 0) КАК Поле4,
    ЕСТЬNULL(Таблица.Поле3, 0) + ЕСТЬNULL(Таблица.Поле4, 0) КАК СуммаПолей
ИЗ
    РегистрНакопления.Продажи КАК Таблица

Этот вариант отлично работает, но имеет один важный нюанс: при сложении в запросе мы получаем жестко зафиксированный результат. Если в дальнейшем нам потребуется как-то динамически менять логику расчета в зависимости от группировок отчета, сделать это будет сложнее, чем при использовании вычисляемых полей.

Важнейший нюанс: Настройка ресурсов (Итоги в группировках)

Допустим, мы успешно создали вычисляемое поле с формулой ЕСТЬNULL(Поле3, 0) + ЕСТЬNULL(Поле4, 0). Мы добавили его в настройки отчета, запустили его и увидели, что в детальных записях (строках) все складывается отлично. Но поднявшись взглядом к строкам группировок или к строке «Общий итог», мы замечаем, что там либо пусто, либо суммы отображаются некорректно.

Запомните правило: Чтобы любое вычисляемое или суммовое поле правильно рассчитывалось в итогах группировок СКД, его обязательно нужно перенести на вкладку «Ресурсы».

Давайте посмотрим на два способа настройки выражения для ресурса:

  1. Простой вариант (если вычисляемое поле уже создано):

    Переносим наше вычисляемое поле в список ресурсов. В поле «Выражение» СКД автоматически предложит формулу:

    Сумма(ИтоговаяСумма)

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

  2. Продвинутый вариант (без создания вычисляемого поля):

    Мы можем не создавать вычисляемое поле вообще, а сложить наши исходные ресурсы (Поле3 и Поле4) прямо на вкладке ресурсов для нового суммирующего показателя. Формула выражения будет выглядеть так:

    Сумма(ЕСТЬNULL(Поле3, 0)) + Сумма(ЕСТЬNULL(Поле4, 0))

    Этот вариант является более надежным с точки зрения математического анализа группировок. Агрегатная функция Сумма() в СКД умеет игнорировать значения NULL при сложении записей внутри одной колонки, но предварительное оборачивание каждого слагаемого в ЕСТЬNULL гарантирует защиту от пустых итогов, если одна из колонок окажется полностью пустой по всей группировке.

Где лучше складывать: в запросе или в СКД?

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

Сложение в запросе:

Сложение в вычисляемых полях СКД:

Особый случай: Связи нескольких наборов данных

Очень часто пустые значения NULL в колонках отчета появляются не из-за отсутствия данных в одной таблице, а при связывании нескольких наборов данных в СКД (например, НаборДанных1 и НаборДанных2 связываются по левому соединению). В этом случае у объектов из первого набора может банально не оказаться соответствия во втором наборе.

При работе с несколькими связанными наборами данных использование функций ЕСТЬNULL на вкладке «Ресурсы» или в «Вычисляемых полях» становится строго обязательным стандартом разработки. В противном случае ваши отчеты будут постоянно «терять» итоговые суммы.

Подводя итог нашему разбору, отметим: всегда помните о разнице между нулем и неопределенным значением NULL, активно используйте функцию ЕСТЬNULL для предобработки числовых полей и никогда не забывайте добавлять итоговые показатели на вкладку ресурсов СКД. Эти простые правила избавят вас от ошибок и сделают ваши отчеты точными и быстрыми!

← На главную