При построении отчетов в 1С с помощью Системы Компоновки Данных (СКД) часто возникает задача рассчитать производные показатели, которых нет в исходных таблицах базы данных. Классический пример — вычисление процента скидки на основе суммы продажи и первоначальной суммы без скидки. Основная сложность здесь заключается в том, чтобы корректно обработать ситуации, когда скидка отсутствовала и сумма без скидки равна сумме продажи, что может привести к ошибке деления на ноль.
Рассмотрим несколько надежных способов решения этой задачи, которые позволят создать точный и безотказный отчет.
Этот метод является наиболее производительным и предпочтительным, поскольку все вычисления производятся на стороне сервера баз данных (СУБД), еще до того, как данные попадут в обработку 1С. Это значительно ускоряет формирование отчета на больших объемах данных. Для реализации мы будем использовать конструкцию ВЫБОР КОГДА языка запросов 1С.
Проанализируем ситуацию: у нас есть два поля, например, СуммаПродажи и СуммаБезСкидки. Формула для расчета процента скидки выглядит так: (1 - СуммаПродажи / СуммаБезСкидки) * 100. Ошибка деления на ноль возникнет, если СуммаБезСкидки окажется равной нулю.
Чтобы избежать этой ошибки, мы добавим в запрос проверку. Разберем по шагам, как это сделать:
ВЫБРАТЬ вашего запроса добавьте следующую конструкцию:
ВЫБОР
КОГДА ИсходныеДанные.СуммаБезСкидки = 0
ТОГДА 0
ИНАЧЕ (1 - ИсходныеДанные.СуммаПродажи / ИсходныеДанные.СуммаБезСкидки) * 100
КОНЕЦ КАК ПроцентСкидки
Рассмотрим подробнее, что делает этот код:
ВЫБОР — это оператор, который позволяет реализовать условную логику, аналог "If-Then-Else" в программировании.КОГДА ИсходныеДанные.СуммаБезСкидки = 0 — это условие. Мы проверяем, равен ли знаменатель нашей дроби нулю. Вместо ИсходныеДанные укажите псевдоним вашей таблицы в запросе.ТОГДА 0 — если условие истинно (то есть скидки не было или сумма равна нулю), мы присваиваем результату значение 0. Это логично, так как процент скидки в этом случае нулевой.ИНАЧЕ (1 - ИсходныеДанные.СуммаПродажи / ИсходныеДанные.СуммаБезСкидки) * 100 — если условие ложно, мы выполняем безопасное вычисление нашего процента.КОНЕЦ КАК ПроцентСкидки — завершает конструкцию ВЫБОР и присваивает вычисленному значению псевдоним ПроцентСкидки. Это поле станет доступным в СКД для вывода в отчет.После добавления этого кода в запрос, новое поле ПроцентСкидки появится в списке полей на вкладке "Компоновка данных", и вы сможете использовать его в отчете.
Если вы не хотите или не можете изменять исходный запрос (например, он типовой и сложный), можно воспользоваться функциональностью вычисляемых полей самой СКД. В этом случае вычисления будут производиться уже после получения данных из базы, силами платформы 1С. Этот способ может быть немного медленнее на больших объемах, но он более гибок и не требует знаний языка запросов.
Разберем по шагам:
ПроцентСкидки.?(Условие, Выражение1, Выражение2).В поле "Выражение" введите следующую строку:
?(СуммаБезСкидки = 0, 0, (1 - СуммаПродажи / СуммаБезСкидки) * 100)
Этот синтаксис полностью аналогичен конструкции ВЫБОР КОГДА в запросе: если СуммаБезСкидки равна 0, то возвращается 0, иначе вычисляется процент.
Также можно использовать более мощную, но избыточную для данной задачи функцию ВычислитьВыражение(). Она позволяет выполнять более сложную логику, включая агрегатные функции. Синтаксис будет таким:
ВычислитьВыражение("?(СуммаБезСкидки = 0, 0, (1 - СуммаПродажи / СуммаБезСкидки) * 100)")
Для нашей простой задачи оба варианта в вычисляемых полях дадут одинаковый результат.
После того как поле с процентом рассчитано одним из вышеописанных способов, его нужно красиво вывести в отчете — с нужным количеством знаков после запятой и, возможно, со знаком "%".
Посмотрим, как это настроить:
ПроцентСкидки.ПроцентСкидки.ЧДЦ=2; ЧН=' '; ЧГ=0, а в макете отчета на вкладке "Макеты" добавить рядом с полем текстовую ячейку со знаком "%". Более элегантный способ — настроить условное оформление.Настройка через условное оформление:
"ЧЦ=15; ЧДЦ=2; ЧРД=,; ЧРГ=' '; ЧН=0,00; ЧФ=С" и в текстовом представлении добавить в конце '%'. Например, `"Формат('ЧДЦ=2') + ' %'"`. Однако, правильнее настроить формат числа, а знак процента добавить в макете. Для числового формата используйте: ЧДЦ=2 (Число десятичных знаков = 2).ПроцентСкидки.Таким образом, вы получите не только корректно рассчитанное, но и аккуратно отформатированное значение в итоговом отчете.