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