Как правильно написать выражение в пользовательском поле СКД для расчета суммы с учетом возвратов

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

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

Разбор проблемы: почему поле остается пустым

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

Рассмотрим пример:

Для того чтобы система корректно обработала эту ситуацию, нам необходимо «превратить» NULL в числовой ноль перед выполнением вычитания.

Решение 1: Использование функции ЕСТЬNULL в выражении

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

Разберем по шагам, как написать правильное выражение для детальных записей в пользовательском поле:

СуммаДокумента - ЕСТЬNULL(СуммаДокументаВозврата, 0)

Как это работает:

  1. Система берет значение из поля СуммаДокументаВозврата.
  2. Если там число (например, 200), функция ЕСТЬNULL возвращает 200.
  3. Если там NULL, функция ЕСТЬNULL возвращает 0.
  4. Происходит математическое вычитание: 1000 - 0 = 1000. Результат теперь корректно отображается в отчете.

Решение 2: Использование конструкции ВЫБОР КОГДА

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

Рассмотрим пример выражения:


ВЫБОР 
    КОГДА СуммаДокументаВозврата ЕСТЬ NULL ТОГДА СуммаДокумента 
    ИНАЧЕ СуммаДокумента - СуммаДокументаВозврата 
КОНЕЦ

Это выражение буквально говорит системе: «Если возврата нет, просто покажи сумму документа, в противном случае — вычисли разницу».

Разница между пользовательскими и вычисляемыми полями

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

1. Вычисляемые поля (в Конфигураторе)

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

2. Пользовательские поля (в режиме "1С:Предприятие")

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

Настройка итогов по рассчитанному полю

Просто написать выражение для детальных записей недостаточно, если нам нужно видеть итоговые суммы по группам или по всему отчету. В СКД для каждого поля можно задать отдельное Выражение итогов (на закладке "Ресурсы" в конфигураторе или в настройках пользовательского поля).

Если мы оставим поле итогов пустым, СКД может попытаться рассчитать его автоматически, но для сложных формул это не всегда работает верно. Рассмотрим правильный подход к расчету ресурсов:

Сумма(СуммаДокумента) - Сумма(ЕСТЬNULL(СуммаДокументаВозврата, 0))

Важно помнить: агрегатные функции (такие как Сумма, Максимум, Среднее) должны применяться к полям внутри выражения итогов. Нельзя просто написать Сумма(ПользовательскоеПоле), если внутри этого поля уже заложена сложная логика, лучше продублировать формулу с использованием агрегатов.

Тонкости работы с форматом вывода

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

В строке формата можно указать параметр ЧН='0,00' (чтобы всегда выводить два знака после запятой, даже если это ноль) или ЧН='-' (чтобы вместо нуля выводился прочерк). Это делает отчет более читаемым и профессиональным.

Производительность и рекомендации

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

Рекомендации по оптимизации:

Таким образом, мы выяснили, что для корректного отображения разности сумм в СКД критически важно обрабатывать пустые значения с помощью ЕСТЬNULL или ВЫБОР, а также не забывать про настройку выражений итогов, чтобы данные в подстолбиках и общих итогах совпадали с ожиданиями пользователей.

← На главную