Условное оформление в управляемом приложении 1С — это мощный инструмент визуализации, который позволяет выделять цветом, шрифтом или доступностью строки и ячейки таблиц в зависимости от определенных условий. Часто разработчики сталкиваются с ситуацией, когда стандартных настроек в конфигураторе недостаточно, например, если условия отбора динамические или слишком сложные для визуального редактора. В этой статье мы подробно разберем, как реализовать условное оформление программно, проанализируем типичные ошибки и выясним, почему настройки могут "пропадать" в типовых конфигурациях вроде 1С:Управление торговлей 11.
Обычно условное оформление настраивается в свойствах формы в конфигураторе. Однако программный подход незаменим в следующих случаях:
Давайте рассмотрим базовый алгоритм создания элемента условного оформления. Для этого нам нужно обратиться к коллекции УсловноеОформление формы. Процесс состоит из четырех этапов: создание элемента, определение оформляемых полей, настройка условий отбора и установка параметров самого оформления. Чтобы не составлять подобные конструкции вручную, можно использовать обработку для декомпиляции и генерации кода условного оформления.
Проанализируем пример кода, который решает задачу подсветки конкретной строки в табличной части документа:
&НаСервере
Процедура НастроитьУсловноеОформлениеНаСервере()
// 1. Добавляем новый элемент оформления
Элемент = УсловноеОформление.Элементы.Добавить();
// 2. Указываем, какие поля будут оформляться
// Если список полей пустой, оформится вся строка целиком
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных("ТоварыНоменклатура"); // Имя колонки на форме
// 3. Настраиваем отбор (условие, при котором сработает оформление)
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
// ВАЖНО: Путь к данным в отборе должен быть полным
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.НомерСтроки");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = 1; // Подсветим первую строку
// 4. Задаем само оформление (например, цвет текста)
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.ЗеленыйЛес);
КонецПроцедуры
Одной из самых частых причин, по которой программное оформление не применяется, является неправильное указание пути к данным в объекте ПолеКомпоновкиДанных. Выясним причину этой путаницы. На форме у нас есть Элемент (визуальная колонка), а в данных формы есть Путь к данным.
Для свойства ПолеЭлемента.Поле мы указываем имя колонки, как она названа на форме (например, ТоварыНоменклатура). Однако для ОтборЭлемента.ЛевоеЗначение мы обязаны указать полный путь к реквизиту в структуре данных формы. Если мы оформляем табличную часть, путь должен выглядеть так: Объект.ИмяТаблицы.ИмяРеквизита.
Рассмотрим пример ошибки:
Если написать Новый ПолеКомпоновкиДанных("ТоварыНомерСтроки"), система не найдет такое поле в контексте компоновки данных формы, и оформление просто проигнорируется без выдачи ошибок. Правильный вариант: Новый ПолеКомпоновкиДанных("Объект.Товары.НомерСтроки").
В конфигурациях, построенных на базе "Библиотеки стандартных подсистем" (УТ 11, ERP, КА), существует механизм автоматического управления формой. При создании формы на сервере вызываются типовые процедуры (например, УправлениеФормой.ПриСозданииНаСервере), которые могут программно очищать или перезаполнять коллекцию УсловноеОформление, затирая ваши ручные настройки.
Посмотрим, как правильно встроить свой код в такую систему, используя механизм расширений:
&После("ПриСозданииНаСервере")
Процедура Мой_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Вызываем свою процедуру настройки ПОСЛЕ выполнения типовых механизмов
Моя_ПрограммнаяНастройкаОформления();
КонецПроцедуры
Если вы обнаружили, что даже после этого оформление пропадает, проверьте наличие в модуле формы процедуры УстановитьУсловноеОформление(). В некоторых типовых решениях именно там сосредоточена вся логика раскраски, и вам следует добавлять свои элементы именно в нее через &После. Для настройки подобного выделения данных в типовой УТ 11 без изменения конфигурации можно использовать решение для оформления ссылочных объектов в типовых конфигурациях.
Важно понимать различие между оформлением статических таблиц (табличных частей) и динамических списков (списки документов, справочников). Если вы работаете с динамическим списком, программный код будет немного отличаться.
Вместо ЭтотОбъект.УсловноеОформление следует использовать коллекцию оформления самого списка:
// Для динамического списка "Список" на форме
ЭлементОформления = Список.КомпоновкаДанных.УсловноеОформление.Элементы.Добавить();
// В отборе динамического списка путь к полю указывается БЕЗ префикса "Объект"
Отбор = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
Отбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Проведен");
Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
Отбор.ПравоеЗначение = Ложь;
Помимо цвета текста (ЦветТекста) и цвета фона (ЦветФона), программно можно управлять и другими полезными свойствами:
Проанализируем ситуацию с приоритетами. Если на одно и то же поле накладывается несколько условий оформления, сработает то, которое находится ниже в списке Элементы (имеет больший индекс). Однако, если условия не пересекаются, они будут дополнять друг друга.
Мы разобрали основные аспекты программного управления внешним видом форм. Подведем итог: всегда проверяйте точность путей в ПолеКомпоновкиДанных, учитывайте влияние типовых процедур БСП, которые могут сбрасывать ваши настройки, и не забывайте, что для динамических списков оформление живет внутри настроек самого списка.
Использование программного оформления делает интерфейс ваших решений более гибким и отзывчивым к нуждам пользователя, позволяя акцентировать внимание на действительно важных данных в реальном времени.