СКД в 1С

Условное оформление в СКД 1С: как задать в настройках и программно

Коротко

Элемент условного оформления СКД — это тройка: Оформление (УстановитьЗначениеПараметра("ЦветФона", …)), Отбор (когда применять) и Поля (к чему применять). Если коллекция Поля пуста — оформление ложится на всю строку; если в ней указаны конкретные поля — только на них.

Программно элемент добавляется в Настройки.УсловноеОформление.Элементы.Добавить(). Область применения по уровням отчёта задаётся флагами ИспользоватьВГруппировке, ИспользоватьВЗаголовке, ИспользоватьВОбщемИтоге и другими.

Как задать условное оформление в СКД

В конструкторе схемы условное оформление отчёта СКД настраивается на закладке Настройки → Условное оформление. Каждая строка списка — отдельный элемент типа ЭлементУсловногоОформленияКомпоновкиДанных с четырьмя колонками:

  • Оформление — набор параметров: ЦветФона, ЦветТекста, Шрифт, Формат, Текст, Отступ.
  • Условие — отбор, при выполнении которого оформление применяется. Пустое условие означает «всегда».
  • Оформляемые поля — на какие поля ложится оформление. Пусто — на всю строку.
  • Представление — имя элемента для пользователя в настройках отчёта.

Тот же список доступен пользователю в форме отчёта, если у элемента выставлен РежимОтображения и задан ИдентификаторПользовательскойНастройки — тогда правило оформления можно менять без конфигуратора.

Область применения: поля и группировки

Область применения условного оформления СКД задаётся в двух независимых плоскостях. Первая — горизонтальная: коллекция Поля типа ОформляемыеПоляКомпоновкиДанных. Вторая — вертикальная: флаги применения по уровням отчёта у самого элемента.

ПолеОформления = Элемент.Поля.Элементы.Добавить();
ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("Остаток");
ПолеОформления.Использование = Истина;
Поля.Элементы.Добавить
без параметровдобавляет оформляемое поле в конец коллекции
ОформляемоеПолеКомпоновкиДанных

У добавленного поля заполняются два свойства: Поле (путь к данным через Новый ПолеКомпоновкиДанных(<ПутьКДаннымПоля>)) и Использование. Вертикальную область применения задают булевы свойства элемента:

  • ИспользоватьВГруппировке и ИспользоватьВИерархическойГруппировке — строки группировок;
  • ИспользоватьВЗаголовке, ИспользоватьВЗаголовкеПолей, ИспользоватьВЗаголовкеПолейРесурсов — шапки;
  • ИспользоватьВОбщемИтоге и ИспользоватьВЗаголовкеПолейРесурсовОбщегоИтога — строка итогов;
  • ИспользоватьВОтборе и ИспользоватьВПараметрах — области вывода настроек.

Если оформление «поехало» на итоги или на шапку — почти всегда причина в том, что эти флаги оставлены по умолчанию. Снимите лишние явно.

Условия отбора для оформления

Условие — это обычный отбор компоновки данных: коллекция Элемент.Отбор.Элементы типа КоллекцияЭлементовОтбораКомпоновкиДанных. Элементы внутри неё соединяются по «И», для «ИЛИ» добавляется группа.

ЭлементОтбора = Элемент.Отбор.Элементы.Добавить(
    Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных("Остаток");
ЭлементОтбора.ВидСравнения   = ВидСравненияКомпоновкиДанных.Меньше;
ЭлементОтбора.ПравоеЗначение = 0;
ЭлементОтбора.Использование  = Истина;
Отбор.Элементы.Добавить
ТипЭлементОтбораКомпоновкиДанных или ГруппаЭлементовОтбораКомпоновкиДанных
ЭлементОтбораКомпоновкиДанных

Виды сравнения берутся из ВидСравненияКомпоновкиДанных: Больше, МеньшеИлиРавно, ВСписке, ВИерархии, Заполнено, НеЗаполнено, НачинаетсяС и другие. В ЛевоеЗначение всегда кладётся ПолеКомпоновкиДанных, в ПравоеЗначение — константа, ссылка или другое поле.

Условие удобно проверять на реальных данных: попросите агента Консоли кода собрать отчёт по вашей схеме, применить отбор и вывести получившийся макет — сразу видно, срабатывает правило или поле в отборе названо не так, как в наборе данных.

Оформление по значению ресурса: выделить цветом строку

Классическая задача — в СКД выделить цветом строку, если ресурс вышел за границу: отрицательный остаток, просроченная задолженность, нулевая маржа. Правило одно: чтобы покрасить строку целиком, коллекцию Поля оставляют пустой.

Элемент.Оформление.УстановитьЗначениеПараметра(
    "ЦветФона", Новый Цвет(255, 230, 230));
Элемент.Оформление.УстановитьЗначениеПараметра(
    "ЦветТекста", Новый Цвет(180, 0, 0));
Элемент.Оформление.УстановитьЗначениеПараметра(
    "Шрифт", Новый Шрифт(, , Истина));
УстановитьЗначениеПараметра
Параметримя параметра оформления, например ЦветФона
Значениезначение параметра: Цвет, Шрифт, строка формата
нет возвращаемого значения

Проверить, задан ли параметр, можно методом НайтиЗначениеПараметра(<Параметр>) — он вернёт ЗначениеПараметраКомпоновкиДанных или Неопределено.

Важный нюанс: отбор по ресурсу работает по агрегированному значению той строки, к которой применяется оформление. Для строки группировки сравнивается итог группировки, для детальной записи — значение записи. Поэтому одно и то же правило по-разному подсвечивает детали и итоги — управляйте этим флагами ИспользоватьВГруппировке и ИспользоватьВОбщемИтоге.

Программная установка элемента условного оформления

Программно условное оформление СКД собирается в КоллекцияЭлементовУсловногоОформленияКомпоновкиДанных — это свойство Элементы объекта УсловноеОформлениеКомпоновкиДанных.

Настройки = КомпоновщикНастроек.Настройки;

Элемент = Настройки.УсловноеОформление.Элементы.Добавить();
Элемент.Представление = "Отрицательный остаток";
Элемент.Использование = Истина;

// область применения: только строки группировок
Элемент.ИспользоватьВГруппировке = Истина;
Элемент.ИспользоватьВОбщемИтоге  = Ложь;
Элемент.ИспользоватьВЗаголовке   = Ложь;

// условие
ЭлементОтбора = Элемент.Отбор.Элементы.Добавить(
    Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных("Остаток");
ЭлементОтбора.ВидСравнения   = ВидСравненияКомпоновкиДанных.Меньше;
ЭлементОтбора.ПравоеЗначение = 0;

// оформление
Элемент.Оформление.УстановитьЗначениеПараметра(
    "ЦветФона", Новый Цвет(255, 230, 230));
УсловноеОформление.Элементы.Добавить
без параметровдобавляет новый элемент в конец коллекции
ЭлементУсловногоОформленияКомпоновкиДанных

Коллекция поддерживает полный набор операций: Вставить(<Индекс>), Получить(<Индекс>), Индекс(<Элемент>), Количество(), Сдвинуть(<Элемент>, <Смещение>), Удалить(<Элемент>) и Очистить(). Сдвинуть() здесь не косметика — он меняет приоритет (см. следующий раздел).

Найти уже существующий элемент по идентификатору помогает УсловноеОформление.ПолучитьОбъектПоИдентификатору(<Идентификатор>), обратная операция — ПолучитьИдентификаторПоОбъекту(<Объект>).

Код выше правит настройки в памяти, поэтому его нельзя «просто запустить» и увидеть результат в конфигураторе. В Консоли кода агент выполняет его вместе с компоновкой макета и выводом результата — правило проверяется за один прогон, без сохранения внешнего отчёта.

Приоритет оформления при пересечении правил

Когда на одну ячейку претендуют несколько элементов, действуют два правила.

  • Порядок в коллекции. Элементы применяются сверху вниз. При конфликте по одному и тому же параметру (например, оба задают ЦветФона) побеждает элемент, расположенный ниже. Параметры, которые не пересекаются, складываются: один элемент дал фон, другой — шрифт.
  • Уровень настроек. Условное оформление есть не только у отчёта целиком, но и у каждой группировки (ГруппировкаКомпоновкиДанных, ГруппировкаТаблицыКомпоновкиДанных, ГруппировкаДиаграммыКомпоновкиДанных) и у таблицы (ТаблицаКомпоновкиДанных). Оформление вложенного уровня применяется после общего и перекрывает его.

Отсюда практический вывод: не пытайтесь «победить» чужое правило добавлением своего выше по списку — сдвиньте его вниз через Сдвинуть() либо задайте оформление на уровне нужной группировки.

Очистка и переопределение оформления группировки

Чтобы снять условное оформление с конкретного элемента структуры (группировки, таблицы, диаграммы), у НастройкиКомпоновкиДанных есть парные методы.

Настройки = КомпоновщикНастроек.Настройки;
Группировка = Настройки.Структура[0];

Если Настройки.НаличиеУсловногоОформленияУЭлемента(Группировка) Тогда
    Настройки.ОчиститьУсловноеОформлениеЭлемента(Группировка);
КонецЕсли;
ОчиститьУсловноеОформлениеЭлемента
Элементэлемент структуры настроек, у которого снимается оформление
нет возвращаемого значения

Проверка НаличиеУсловногоОформленияУЭлемента(<Элемент>) нужна потому, что собственные настройки у вложенного элемента могут отсутствовать — тогда он наследует оформление верхнего уровня, и «очищать» там нечего. Полный сброс правил отчёта — Настройки.УсловноеОформление.Элементы.Очистить().

Условное оформление в пользовательских настройках

Чтобы пользователь мог включать и выключать правило прямо в форме отчёта, элементу задают идентификатор и представление пользовательской настройки:

Элемент.ИдентификаторПользовательскойНастройки = "ПодсветкаДолга";
Элемент.ПредставлениеПользовательскойНастройки = "Подсвечивать просроченный долг";
Элемент.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ;

Свойство Использование при этом становится тем самым флажком, который видит пользователь. Такие же свойства (ИдентификаторПользовательскойНастройки, ПредставлениеПользовательскойНастройки, РежимОтображения) есть и у контейнера УсловноеОформлениеКомпоновкиДанных — они выносят в настройки весь список правил целиком.

Частые ошибки при настройке условного оформления СКД

  • Заполнены «Оформляемые поля», а ждали покраску строки. Как только в коллекции Поля появился хотя бы один элемент, оформление применяется только к нему. Чтобы выделить цветом строку целиком — коллекция должна быть пустой.
  • Отбор по полю, которого нет в выбранных полях отчёта. Поле должно присутствовать в наборе данных и быть доступно на нужном уровне; иначе правило молча не срабатывает. Ориентир — ДоступныеПоляОтбора объекта условного оформления.
  • Ожидание, что элементы «складываются» по одному параметру. Два правила с ЦветФона не смешиваются: выигрывает нижнее. Разводите правила по разным параметрам или по порядку.
  • Оформление уехало в шапку и итоги. Флаги ИспользоватьВЗаголовке, ИспользоватьВОбщемИтоге, ИспользоватьВЗаголовкеПолейРесурсов не выставлены явно. Ограничьте область применения.
  • Правка настроек после компоновки макета. Изменения КомпоновщикНастроек.Настройки должны выполняться до ВыполнитьКомпоновку, иначе макет уже построен со старым оформлением.
  • Строка вместо ПолеКомпоновкиДанных. В ЛевоеЗначение и в ОформляемоеПоле.Поле нужен объект Новый ПолеКомпоновкиДанных("ИмяПоля"), а не строка.

Частые вопросы об условном оформлении в СКД

Как в СКД выделить цветом строку целиком, а не одну ячейку?

Оставьте коллекцию «Оформляемые поля» пустой. Если в ней указано хотя бы одно поле, параметр ЦветФона применится только к этому полю. Пустая коллекция означает применение ко всей строке вывода.

Как программно добавить элемент условного оформления в СКД?

Через Настройки.УсловноеОформление.Элементы.Добавить() — метод возвращает ЭлементУсловногоОформленияКомпоновкиДанных. Дальше заполняются Отбор, Поля и Оформление методом УстановитьЗначениеПараметра().

Какой элемент условного оформления победит, если условия пересеклись?

По одному и тому же параметру оформления выигрывает элемент, стоящий ниже в списке. Оформление, заданное на уровне группировки или таблицы, применяется после общего оформления отчёта и перекрывает его.

Тарифы

ИИ Консоль запросов 1С

Лайт

Бесплатно

Для ознакомления с возможностями

  • Все функции бесплатно на 2 дня +2 дня за подписку на Telegram или Max
  • Полный набор инструментов без урезаний
  • Без ввода карты
Начать бесплатно

Старт

Популярный выбор
990 руб. в месяц
≈ 5 млн токенов

Для индивидуального использования

Выбрать тариф

Продвинутый

3900 руб. в месяц
≈ 19,5 млн токенов

Для интенсивного использования или команд

Выбрать тариф