При работе с Системой компоновки данных (СКД) программисты часто сталкиваются с ситуацией, когда визуальное оформление отчета ведет себя непредсказуемо. Одной из самых коварных проблем является отказ системы «красить» ячейки при сравнении двух полей, например, когда Приход превышает Расход. Кажется, что условие задано верно, поля выбраны, но отчет остается бесцветным. В этой статье мы подробно разберем, почему это происходит, и изучим пошаговый алгоритм исправления этой ошибки, опираясь на технические нюансы работы компоновщика макета.
Проанализируем самую частую ошибку, которую совершают даже опытные разработчики. Когда мы открываем вкладку «Условное оформление» и добавляем новое условие, перед нами появляется стандартное окно выбора полей. Допустим, мы хотим сравнить Приход и Расход.
По умолчанию в правой колонке условия система ожидает ввода конкретного значения (числа, строки или даты). Если вы просто выберете поле Расход из списка, система может воспринять это некорректно. Чтобы сравнение шло именно между двумя динамическими полями компоновки, необходимо выполнить следующие действия:
Расход.Если этого не сделать, 1С будет пытаться сравнить число из поля Приход со строковым литералом или константой, что технически невозможно, и условие просто проигнорируется системой при генерации макета.
Выясним причину, связанную с источником данных. Часто данные для ресурсов Приход и Расход получаются путем объединения (UNION) в запросе. Это приводит к тому, что в некоторых строках одно из полей может иметь значение NULL. Несмотря на то, что визуально в отчете мы видим пустую ячейку или ноль, для математического процессора СКД NULL не является числом.
Рассмотрим, как правильно обработать такие ситуации на уровне ресурсов. Перейдем на вкладку «Ресурсы» и проверим выражения. Вместо простого суммирования поля, например Сумма(Приход), следует использовать явное приведение к числу:
Сумма(ЕСТЬNULL(Приход, 0))
Сумма(ЕСТЬNULL(Расход, 0))
Почему это важно? Если условие оформления звучит как Приход > Расход, и при этом Приход = 100, а Расход = NULL, результат логической операции может быть неопределенным. Принудительная замена NULL на 0 гарантирует корректную работу математического сравнения в блоке условного оформления.
Если прямое сравнение в визуальном редакторе все равно не дает результата, проанализируем альтернативный и более стабильный подход — вынос логики в вычисляемые поля. Это позволяет отделить бизнес-логику от визуального представления.
ПревышениеЛимита.
ВЫБОР
КОГДА Приход > Расход ТОГДА Истина
ИНАЧЕ Ложь
КОНЕЦ
Теперь в настройках условного оформления нам не нужно сравнивать два поля. Мы просто задаем условие: ПревышениеЛимита Равно Истина. Такой подход значительно упрощает отладку, так как мы можем временно вывести поле ПревышениеЛимита в отчет и увидеть, правильно ли СКД рассчитывает логику для каждой строки.
Иногда оформление работает, но мы его не видим, потому что оно применяется «не там». В настройках оформления есть важный параметр — «Область применения». Посмотрим на основные варианты:
Если вы хотите, чтобы подсвечивались только итоговые суммы по складам или организациям, убедитесь, что в списке «Оформляемые поля» выбраны именно ресурсы, а в условии участвуют поля, доступные на этом уровне группировки. Помните: если вы пытаетесь применить оформление к детальным записям, которых нет в структуре отчета (используются только группировки), оформление не сработает.
Рассмотрим ситуацию, когда стандартный дизайн 1С перекрывает ваши настройки. В СКД есть предопределенные макеты оформления (например, «Зеленый», «Арктика», «Море»). Эти макеты имеют жестко заданные цвета для четных и нечетных строк, а также для итогов.
Попробуем провести эксперимент: временно установите в настройках отчета (вкладка «Дополнительные настройки») параметр «Макет оформления» в значение «Без оформления». Если после этого ваша красная подсветка появилась — значит, цвета макета имели более высокий приоритет. В этом случае вам придется либо отказаться от стандартного макета, либо более детально настроить оформляемые поля, чтобы они перекрывали стандартные стили.
Бывает так, что программист внес изменения в схему компоновки в конфигураторе, но пользователь в режиме «Предприятие» продолжает видеть старый вариант. Это происходит из-за того, что настройки отчета (включая условное оформление) сохраняются в пользовательских настройках БД или в кэше.
Для чистоты эксперимента выполним следующие действия:
Это принудительно обновит структуру и правила оформления из актуальной схемы (XML), которую вы правили в конфигураторе.
Завершим наш анализ проверкой ролей. В СКД каждое поле имеет роль (Без роли, Период, Измерение и т.д.). Если поле Расход помечено как «Обязательное», а Приход — нет, компоновщик может строить временные таблицы таким образом, что значения одного из полей будут недоступны в момент проверки условия оформления. Убедитесь, что для числовых ресурсов не стоят лишние флаги в колонке «Роль», которые могли бы ограничить их выборку в итоговый результат.
Соблюдение этих шагов позволит вам гарантированно добиться работающего условного оформления и сделать отчеты более информативными для конечного пользователя.