При разработке управляемых форм в 1С часто возникает задача управления условным оформлением списков. Мы хотим, чтобы определенные строки подсвечивались цветом или меняли шрифт в зависимости от данных. Однако стандартные механизмы пользовательских настроек могут конфликтовать с логикой, которую закладывает разработчик. Рассмотрим подробно ситуацию, когда необходимо полностью убрать стандартное условное оформление или заменить его своим так, чтобы действия пользователя (например, нажатие кнопки «Установить стандартные настройки») не ломали нашу логику.
Представим ситуацию: в конфигураторе для динамического списка настроено некоторое условное оформление. В процессе доработки мы решаем, что это оформление нужно изменить или удалить программно. Мы пишем код, который очищает коллекцию элементов оформления. Все работает, пока пользователь не зайдет в меню «Ещё» и не выберет пункт «Установить стандартные настройки».
В этот момент платформа сбрасывает все наши программные изменения, сделанные в контексте пользовательских настроек, и возвращает то состояние, которое было задано в метаданных (в конфигураторе). В результате наше программное оформление слетает, а «старое» возвращается.
Давайте разберемся, как правильно управлять этим процессом, какие существуют коллекции условного оформления и как на это влияют версии платформы.
Прежде чем писать код очистки, мы должны четко понимать, с какой коллекцией работаем. В управляемой форме существуют два независимых механизма:
Частая ошибка — пытаться искать настройки списка в коллекции формы или наоборот. Если наша задача — убрать то, что настроено в свойствах Динамического Списка в конфигураторе, нам нужно обращаться к Компоновщику Настроек.
Самый логичный способ избавиться от предустановленного оформления — очистить его в момент инициализации формы. Для этого используем событие ПриСозданииНаСервере.
Код для очистки коллекции условного оформления конкретного списка будет выглядеть так (кстати, существует инструмент для автоматической генерации кода условного оформления — поможет инструмент автоматической генерации кода условного оформления для 1С):
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Обращаемся к настройкам компоновщика данных списка
// Список - это имя реквизита типа ДинамическийСписок на форме
Список.КомпоновщикНастроек.Настройки.УсловноеОформление.Элементы.Очистить();
КонецПроцедуры
Этот код удаляет все правила оформления, заданные разработчиком в конфигураторе для этого списка.
В ходе обсуждения данной темы выяснилось важное обстоятельство. На некоторых версиях платформы (в частности, упоминается 8.3.18) существовала ошибка поведения. Даже если вы вызывали метод Очистить() в процедуре ПриСозданииНаСервере, коллекция визуально очищалась, но при отрисовке формы или при определенных действиях пользователя "фантомные" настройки могли возвращаться или не применяться корректно. Для диагностики подобных конфликтов пригодится анализ конфигурации для выявления переопределений логики.
Из-за этого разработчикам приходилось прибегать к экзотическим решениям, используя события загрузки настроек:
&НаСервере
Процедура СписокПриЗагрузкеПользовательскихНастроекНаСервере(Элемент, Настройки, ИспользуютсяСтандартныеНастройки)
// Сложный обход и удаление элементов "вручную"
Для Каждого ЭлементНастройки Из Настройки.Элементы Цикл
Если ТипЗнч(ЭлементНастройки) = Тип("УсловноеОформлениеКомпоновкиДанных") Тогда
// Логика удаления элементов...
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Однако, как подтверждает практика, на актуальных версиях платформы (например, 8.3.25 и новее) этот баг исправлен. Стандартная очистка в ПриСозданииНаСервере работает корректно и надежно удаляет оформление, заданное в конфигураторе.
Вывод: Если ваш код очистки не срабатывает, первым делом проверьте версию платформы, на которой запускается сервер предприятия — для этого есть инструмент для отладки кода и поиска ошибок.
Если ваша цель — не просто удалить старое, а навязать свое "неудаляемое" оформление, то попытка бороться с пользовательскими настройками (которые сбрасываются кнопкой "Стандартные настройки") — это путь сопротивления.
В платформе 1С предусмотрен специальный механизм для таких задач — Фиксированные настройки. Настройки, помещенные в эту коллекцию:
Давайте посмотрим, как правильно внедрить свое условное оформление через фиксированные настройки:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// 1. Сначала очищаем обычные настройки, если нужно убрать "мусор" из конфигуратора
Список.КомпоновщикНастроек.Настройки.УсловноеОформление.Элементы.Очистить();
// 2. Создаем свое "вечное" оформление
ЭлементУО = Список.КомпоновщикНастроек.ФиксированныеНастройки.УсловноеОформление.Элементы.Добавить();
// Настраиваем оформление (например, красим фон в Красный)
ПолеОформления = ЭлементУО.Оформление.Элементы.Найти("BackColor");
ПолеОформления.Значение = WebЦвета.Красный;
ПолеОформления.Использование = Истина;
// Условие (например, Сумма > 1000)
ЭлементОтбора = ЭлементУО.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Сумма");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше;
ЭлементОтбора.ПравоеЗначение = 1000;
ЭлементОтбора.Использование = Истина;
// К каким полям применять
ПолеОформления = ЭлементУО.Поля.Элементы.Добавить();
ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("Сумма");
ПолеОформления.Использование = Истина;
КонецПроцедуры
Иногда нам нужно, чтобы пользователь видел настройку, но не мог её удалить. В этом случае мы можем управлять свойством РежимОтображения (ViewMode) для конкретного элемента условного оформления.
Рассмотрим, как это работает. При программном создании элемента мы можем запретить его редактирование:
// Создаем элемент в обычных настройках (чтобы пользователь его видел)
ЭлементУО = Список.КомпоновщикНастроек.Настройки.УсловноеОформление.Элементы.Добавить();
// ... настройка цветов и отборов (как в примере выше) ...
// Устанавливаем режим отображения
// Недоступный - пользователь видит галочку, но она "серая", снять нельзя
ЭлементУО.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
Чтобы решить проблему автора темы (убрать старое условное оформление и наложить свое, чтобы оно не слетало):
ПриСозданииНаСервере может работать некорректно. Переход на 8.3.25 и выше устраняет эту ошибку.ПриСозданииНаСервере, обращаясь к Список.КомпоновщикНастроек.Настройки.УсловноеОформление.Настройки, а в ФиксированныеНастройки компоновщика. Это архитектурно более верное решение, чем попытка перехватить события загрузки пользовательских настроек.