При работе с Системой компоновки данных (СКД) в 1С часто возникает задача создания вычисляемых или пользовательских полей, которые должны оперировать данными из разных столбцов. Одной из типичных проблем является корректный расчет разности между основной суммой и суммой возврата, особенно когда поле возврата не заполнено (содержит NULL). В этой статье мы подробно разберем, как правильно составлять такие выражения, почему обычные арифметические операции могут не работать и как обеспечить корректный вывод итогов в отчете.
Проанализируем ситуацию, с которой столкнулся автор темы. При попытке просто вычесть одно поле из другого (СуммаДокумента - СуммаВозврата), в случаях, когда возврата не было, результат получается пустым. Это происходит из-за особенностей работы с типом NULL в базах данных и языке выражений СКД. С точки зрения логики системы, любая арифметическая операция с неопределенным значением (NULL) дает в результате тоже NULL.
Рассмотрим пример:
СуммаДокумента = 1000СуммаВозврата = NULL (данных нет)1000 - NULL = NULLДля того чтобы система корректно обработала эту ситуацию, нам необходимо «превратить» NULL в числовой ноль перед выполнением вычитания.
Наиболее простым и эффективным способом решения данной задачи в СКД является использование встроенной функции ЕСТЬNULL. Эта функция проверяет значение первого аргумента, и если оно равно NULL, возвращает второй аргумент.
Разберем по шагам, как написать правильное выражение для детальных записей в пользовательском поле:
СуммаДокумента - ЕСТЬNULL(СуммаДокументаВозврата, 0)
Как это работает:
СуммаДокументаВозврата.ЕСТЬNULL возвращает 200.NULL, функция ЕСТЬNULL возвращает 0.1000 - 0 = 1000. Результат теперь корректно отображается в отчете.Иногда требуется более сложная логика, например, если нужно проверить не только NULL, но и нулевые значения или значения меньше определенного порога. В этом случае мы можем использовать оператор ВЫБОР. Важно помнить, что синтаксис этого оператора в СКД строго определен.
Рассмотрим пример выражения:
ВЫБОР
КОГДА СуммаДокументаВозврата ЕСТЬ NULL ТОГДА СуммаДокумента
ИНАЧЕ СуммаДокумента - СуммаДокументаВозврата
КОНЕЦ
Это выражение буквально говорит системе: «Если возврата нет, просто покажи сумму документа, в противном случае — вычисли разницу».
Выясним причину, по которой иногда лучше использовать разные инструменты СКД. В 1С существует два основных способа добавить свои расчеты:
1. Вычисляемые поля (в Конфигураторе)
Эти поля создаются разработчиком на этапе создания схемы компоновки. Они предпочтительны, так как позволяют заранее определить тип данных, задать формат и настроить заголовки. В вычисляемых полях также можно использовать функции общих модулей, что значительно расширяет возможности расчетов.
2. Пользовательские поля (в режиме "1С:Предприятие")
Эти поля создает конечный пользователь непосредственно в настройках отчета. Это удобно для оперативного изменения структуры отчета без участия программиста. Однако язык выражений здесь может иметь ограничения, и такие поля сложнее масштабировать для других пользователей.
Просто написать выражение для детальных записей недостаточно, если нам нужно видеть итоговые суммы по группам или по всему отчету. В СКД для каждого поля можно задать отдельное Выражение итогов (на закладке "Ресурсы" в конфигураторе или в настройках пользовательского поля).
Если мы оставим поле итогов пустым, СКД может попытаться рассчитать его автоматически, но для сложных формул это не всегда работает верно. Рассмотрим правильный подход к расчету ресурсов:
Сумма(СуммаДокумента) - Сумма(ЕСТЬNULL(СуммаДокументаВозврата, 0))
Важно помнить: агрегатные функции (такие как Сумма, Максимум, Среднее) должны применяться к полям внутри выражения итогов. Нельзя просто написать Сумма(ПользовательскоеПоле), если внутри этого поля уже заложена сложная логика, лучше продублировать формулу с использованием агрегатов.
Посмотрим на ситуацию, когда вместо пустого поля или нуля мы хотим видеть прочерк или другое обозначение. В настройках оформления СКД (как для вычисляемого, так и для пользовательского поля) есть параметр Формат.
В строке формата можно указать параметр ЧН='0,00' (чтобы всегда выводить два знака после запятой, даже если это ноль) или ЧН='-' (чтобы вместо нуля выводился прочерк). Это делает отчет более читаемым и профессиональным.
Проанализируем влияние таких расчетов на скорость работы отчета. Вычисления в пользовательских полях происходят после того, как данные получены из базы данных. Если отчет содержит сотни тысяч строк, сложные конструкции ВЫБОР могут замедлить формирование.
Рекомендации по оптимизации:
Сумма - Возврат) является базовой для бизнеса, старайтесь перенести этот расчет непосредственно в Запрос набора данных. Использование функции ISNULL в SQL-запросе работает быстрее, чем расчет в СКД.СуммаДокумента — число, а СуммаВозврата по какой-то причине оказалась строкой, выражение выдаст ошибку. Используйте приведение типов при необходимости.Таким образом, мы выяснили, что для корректного отображения разности сумм в СКД критически важно обрабатывать пустые значения с помощью ЕСТЬNULL или ВЫБОР, а также не забывать про настройку выражений итогов, чтобы данные в подстолбиках и общих итогах совпадали с ожиданиями пользователей.