Как программно очистить условное оформление и определить измененные строки в управляемых формах 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При переходе с обычных форм на управляемые в «1С:Предприятии 8» разработчики часто сталкиваются с изменением парадигмы работы с интерфейсом. В обычных формах для изменения оформления строк табличного поля традиционно использовалось событие ПриВыводеСтроки и объект ОформлениеСтроки, которые позволяли напрямую управлять цветом, шрифтом или видимостью конкретной ячейки «на лету».

В управляемых формах условное оформление (УО) работает декларативно на уровне платформы. Оно применяется динамически на стороне клиента в момент отрисовки интерфейса. Из-за этого прямого доступа к уже «отрисованным» свойствам отображения (например, узнать цвет конкретной ячейки на клиенте) платформа не предоставляет. Рассмотрим, как решать сопутствующие задачи: программно очищать элементы оформления и определять, какие именно строки изменили свой вид.

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

Если перед нами стоит задача полностью сбросить или очистить программно заданные правила условного оформления формы, это делается простым вызовом метода коллекции. Мы обращаемся к свойству формы УсловноеОформление и очищаем его элементы. Для быстрой генерации программного кода правил оформления можно использовать обработку для автоматического создания кода условного оформления.

Посмотрим на пример кода, который выполняется на сервере:


// Очищаем все элементы условного оформления на управляемой форме
УсловноеОформление.Элементы.Очистить();

Если условное оформление настроено не для самой формы, а для динамического списка (например, списка документов или справочника), нам необходимо обратиться к компоновщику настроек этого списка:


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

Архитектурно верный подход: Использование вспомогательного реквизита

Попытка напрямую прочитать цвет отображаемой строки на клиенте — это борьба с симптомами, а не с причиной. Цвет строки или ячейки меняется не случайно, а на основании конкретных данных. Поэтому правильный подход заключается в переносе логики на уровень данных.

Разберем по шагам, как это реализовать:

  1. Создание служебного реквизита: Добавим в нашу таблицу (табличную часть документа или таблицу значений) служебную колонку, например, Подсветить с типом Булево. На форме эту колонку можно сделать невидимой, сняв флаг видимости в свойствах элемента.
  2. Настройка условного оформления: Настроим правило условного оформления так, чтобы оно срабатывало по максимально простому условию: если ОформлениеСтроки.Подсветить Равно Истина, то строка окрашивается в нужный цвет фона.
  3. Заполнение флага в коде: При изменении данных или при открытии формы на сервере мы запускаем процедуру, которая проверяет любые сложные бизнес-условия и централизованно проставляет флаги:

&НаСервере
Процедура РассчитатьПодсветкуСтрок()
    Для Каждого СтрокаТЧ Из Объект.Товары Цикл
        // Проверяем наши условия (например, остаток меньше минимального)
        Если СтрокаТЧ.Количество < СтрокаТЧ.МинимальныйОстаток Тогда
            СтрокаТЧ.Подсветить = Истина;
        Иначе
            СтрокаТЧ.Подсветить = Ложь;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры
  1. Анализ результатов: Теперь задача «найти строки, которые изменили цвет» становится тривиальной работой с коллекцией данных. Нам не нужно анализировать элементы интерфейса:

// Получаем все подсвеченные строки
ПараметрыОтбора = Новый Структура("Подсветить", Истина);
НайденныеСтроки = Объект.Товары.НайтиСтроки(ПараметрыОтбора);

// Узнаем количество таких строк
КоличествоСтрок = НайденныеСтроки.Количество();

// Сделаем первую из подсвеченных строк текущей на форме
Если КоличествоСтрок > 0 Тогда
    Элементы.Товары.ТекущаяСтрока = НайденныеСтроки[0].ПолучитьИдентификатор();
КонецЕсли;

Как узнать, какие строки скрыты или отфильтрованы пользователем

Иногда разработчику требуется понять, какие строки пользователь видит на экране после применения стандартного поиска или установленных отборов (в табличной части или таблице значений). Для решения этой задачи в платформе предусмотрен специализированный метод ПроверитьСтроку().

Этот метод вызывается на клиенте для элемента формы «Таблица»:


&НаКлиенте
Процедура ПроверитьВидимыеСтроки()
    Для Каждого СтрокаТаблицы Из Объект.Товары Цикл
        ИдентификаторСтроки = СтрокаТаблицы.ПолучитьИдентификатор();
        
        // Метод возвращает Истина, если строка отображается на форме (прошла все отборы)
        Если Элементы.Товары.ПроверитьСтроку(ИдентификаторСтроки) Тогда
            // Строка видна пользователю, выполняем нужные действия
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Сложный сценарий: Программное вычисление условий отбора через СКД

Рассмотрим ситуацию, когда условное оформление создается динамически (например, пользователь сам настраивает правила окрашивания в режиме «1С:Предприятие») и разработчик не знает условий заранее. «Зашить» логику в код напрямую не получится.

В этом случае приходится разбирать структуру отбора самого условного оформления:

← На главную