При настройке план-фактного анализа в подсистеме бюджетирования 1С:ERP Управление предприятием (начиная с версий 2.4 и выше) пользователи и аналитики часто сталкиваются с неприятным поведением отчетов. В ячейках, где рассчитывается процент выполнения плана или отклонение, вместо ожидаемого нуля или прочерка выводится системная ошибка #Знач. Это не только портит внешний вид управленческой отчетности, но и ломает механизмы условного оформления — система не может раскрасить строки, так как вместо числа получает ошибочное строковое значение.
В этой статье мы подробно разберем, почему возникает эта ошибка с технической точки зрения, как правильно составить формулу для ее обхода, рассмотрим альтернативные механизмы план-факта без ручного написания формул, а также научимся гибко управлять шириной колонок в бюджетных отчетах, чтобы они всегда выглядели аккуратно.
Давайте проанализируем ситуацию, которую описал автор темы. Для расчета процента выполнения плана используется производный показатель с классической математической формулой:
?([План;;Сумма]=0, 0.0, [Факт;;Сумма]/[План;;Сумма]*100)
Когда в системе есть и плановые, и фактические данные за выбранный период, расчет отрабатывает идеально. Но как только мы сталкиваемся с реальной бизнес-практикой — например, когда по какой-то статье бюджета план зафиксирован, а фактических хозяйственных операций в текущем месяце еще не было — в ячейке «Факт» образуется пустота. В терминах баз данных это значение NULL.
Проблема кроется в том, как именно внутренний парсер (вычислительный движок) бюджетирования 1С:ERP обрабатывает формулы производных показателей перед выполнением расчета. Он работает методом прямой текстовой подстановки. Вместо идентификаторов ячеек (таких как [Факт;;Сумма]) подставляются их реальные числовые значения.
Если фактических данных в базе нет, то вместо числа система подставляет... **абсолютную пустоту** (ничего). В результате формула вычисления трансформируется в некорректное математическое выражение:
?(639713.5=0, 0, /639713.5*100)
Обратите внимание на фрагмент /639713.5*100. Перед знаком деления отсутствует числитель. Математический интерпретатор платформы 1С обнаруживает грубую синтаксическую ошибку в выражении и аварийно завершает расчет для данной ячейки, возвращая пользователю текстовую заглушку #Знач.
Попытки применить стандартное условное оформление по правилу "Значение не заполнено" или "Равно 0" не дают никакого результата. Платформа видит в ячейке не пустоту и не число, а именно ошибочный статус, к которому невозможно применить стандартные числовые отборы оформления.
---
Самый надежный и правильный способ победить ошибку напрямую в формуле производного показателя — принудительно обрабатывать пустые значения (NULL), преобразуя их в числовой ноль до того, как сработает операция деления.
Для этого в конструкторе формул бюджетирования 1С:ERP предусмотрена встроенная логическая функция ЗначениеЗаполнено(). Она проверяет, содержит ли операнд реальное значение, и возвращает истину или ложь. Мы можем обернуть наш потенциально пустой «Факт» в проверку:
?(ЗначениеЗаполнено([Факт;;Сумма]), [Факт;;Сумма], 0)
Теперь соберем итоговую безопасную формулу для расчета процента выполнения плана. Нам нужно сначала проверить, не равен ли нулю «План» (чтобы избежать деления на ноль), а затем безопасно обработать «Факт»:
?([План;;Сумма] = 0, 0, ?(ЗначениеЗаполнено([Факт;;Сумма]), [Факт;;Сумма], 0) / [План;;Сумма] * 100)
Давайте разберем по шагам, как отработает эта формула, если плана настроено на 500 000 рублей, а факта нет:
500000 = 0 — Ложь. Переходим к ветке "иначе".ЗначениеЗаполнено([Факт;;Сумма]). Поскольку факта нет (NULL), функция возвращает Ложь.0.0 / 500000 * 100.0 %. Ошибка #Знач больше не появляется!---
Если вы хотите разгрузить формулы и избежать сложных ручных конструкций в каждой ячейке, обратите внимание на стандартный функционал группировки колонок в бюджетировании 1С:ERP. Разработчики платформы предусмотрели системный механизм расчета отклонений, который оптимизирован по производительности и изначально корректно обрабатывает пустые значения.
Для реализации этого метода выполним следующие шаги:
---
Иногда при использовании сложных формул оптимизатор производительности бюджетирования начинает выдавать предупреждения о том, что прямые формулы в ячейках замедляют расчет отчета. Чтобы повысить скорость работы и одновременно решить проблему с #Знач, перенастроим ячейку на расчет по связанным ячейкам:
ISNULL(Fact, 0) на уровне базы данных, что полностью исключает передачу пустых строк в расчетный модуль.---
Второй частый вопрос, который озвучил автор темы — как управлять шириной колонок, ведь при формировании бюджетных отчетов стандартными средствами настроенная пользователем ширина постоянно сбрасывается. Рассмотрим три эффективных метода решения этой задачи.
Самый правильный способ — задать оформление колонок непосредственно в шаблоне вывода, так как бюджетный отчет полностью генерируется по XML-описанию вида бюджета. Выполним следующие настройки:
Если вам нужно настроить ширину колонок индивидуально под себя, не меняя общий шаблон для всех пользователей, воспользуемся возможностями Системы компоновки данных (СКД) в режиме предприятия:
18 или 22).Если колонок очень много, они содержат разные объемы цифр, и вам нужно мгновенно привести отчет в читаемый вид на экране без захода в сложные настройки, используйте горячие клавиши платформы 1С:
Применяя данные подходы, мы сможем создавать красивые, производительные и безошибочные план-фактные отчеты в 1С:ERP, которые будут радовать руководство компании корректными расчетами и аккуратным внешним видом.