Каталог решений - Условное оформление строк таблицы из данных таблицы

Условное оформление строк таблицы из данных таблицы

Условное оформление строк таблицы из данных таблицы

В наличии

Решаем проблему условного оформления, когда нам нужно «Раскрасить» строки динамического списка справочника в цвета, которые указываются в справочнике.

Категория:

Описание

    Добрый день.

    Неоднократно сталкивался с оформлением таблиц, но всегда удавалось обходить проблему, но ОДНАЖДЫ я был вынужден искать решение.

    Итак, суть задачи: У нас есть справочник "Задачи". Пользователи должны иметь возможность указать цвет задачи, чтобы визуально разделять задачи по критериям, которые определяет сам пользователь. Мы могли бы сделать перечисление, но в универсальном случае каждый пользователь должен иметь возможность структурировать свою собственную квалификацию задач по цветам.

Шаг 1:

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

    Для визуального отображения результата выбора добавляю на форму команду "УстановитьЦвет"

&НаКлиенте
Процедура УстановитьЦвет(Команда)
	ВыборЦвета = Новый ДиалогВыбораЦвета;
	
	ТекущийЦвет = Элементы.УстановитьЦвет.ЦветФона;
	ВыборЦвета.Цвет = ТекущийЦвет;
	
	ВыборЦвета.Показать(Новый ОписаниеОповещения("ЗавершениеВыбораЦвета", ЭтотОбъект));
КонецПроцедуры

&НаКлиенте
Процедура ЗавершениеВыбораЦвета(Результат, ДопПараметры) Экспорт 
	
	Если Результат = неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Элементы.УстановитьЦвет.ЦветФона = Результат;
	
	Если Не ЗначениеЗаполнено(Объект.Наименование) Тогда
		Объект.Наименование = Результат;
	КонецЕсли;	
	
КонецПроцедуры

и добавляем в справочник реквизит "Цвет" (Хранилище значения)

&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
	ТекущийОбъект.ЦветХранилище = Новый ХранилищеЗначения(Элементы.ЦветЗадачи.ЦветФона);		
КонецПроцедуры

В результате получаем:

    Обращу ваше внимание (с этим мы столкнемся ниже):

Значение цвета у нас такое:

это говорит нам о том, что получить значение цвета в RGB не удастся.

Довольно странно, т.к. в форме выбора цвета данное значение есть.

Но если мы запишем нашу задачу и откроем заново, то благодаря паре строк кода, наша кнопка окрасится в выбранный нами ранее цвет.

Шаг 2:

    Создаем список задач пользователя. Их может быть 10, а может быть 1000. В любом случае нам нужно обратиться к условному оформлению.

1-й способ: Динамический список

Мы можем использовать условное оформление как самого динамического списка, так и оформление формы:

Из скрина выше очевидны следующие проблемы:

а) А что с чем сравнивать? (Какое условие нужно установить?)

b) Какое оформление должно быть установлено? 

Как мы видим: если даже мы можем указать условие оформления Ссылка = Ссылка, то у нас нет возможности указать значение оформления из реквизита "цвет".
Так же дела обстоят с Условным оформлением созданным с помощью кода. Нам просто НЕГДЕ взять информацию о каждой строке динамического списка.

Вывод: Для динамического списка решения не видно.

2-й способ: HTML

Как мы знаем, платформа обновила ядро браузера и довольно стабильно стала работать с "гипертектстом". Не будем заморачиваться и сделаем таблицу <table>. Гораздо важнее здесь другое:

    После выполнения запроса к БД мы получаем ссылку на задачу, и цвет в хранилище значений. И если мы вспомним, что я писал Здесь, то поймем, что браузеру "не понять" нашего цвета. После поисков в сети пришел к выводу: Мы можем написать самостоятельно форму выбора цвета, в которой будет заполняться значение RGB или можем скачать ее Здесь, и хранить 3 значения цвета в БД. Тогда при выводе html страницы мы сможем раскрасить строки.

Меня же данный результат не удовлетворил.

3-й способ: Таблица значений

    Если принять решение, что у пользователя будет не больше 20 активных задач И\ИЛИ сделать пагинацию, то мы можем воспользоваться довольно костыльным методом, а именно:

Пока ВыборкаЗадачи.Следующий() Цикл
	ЭлементОформления = УсловноеОформление.Элементы.Добавить();
	Поле = ЭлементОформления.Поля.Элементы.Добавить();
	Поле.Поле = Новый ПолеКомпоновкиДанных("Список");
	ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Задачи.Ссылка");
	ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ЭлементОтбора.ПравоеЗначение = ВыборкаЗадачи.Ссылка;
		
	ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", Выборка.Цвет.Получить());
КонецЦикла;

Для каждой задачи создаем отдельный элемент условного оформления.

Плюс у данного метода один: это работает.

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

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

Подведем итог:

    Мне удалось найти решение только путем совместного мозгового штурма с моими коллегами. Решение полноценное, оптимальное и базируется на описанном мной выше опыте, но, как и многое другое в нашей "любимой" системе, не без изъяна.
Если к статье будет интерес, обязательно его опишу.

Всем удачи в поисках простых решений для нестандартных проблем.

has been added to your cart:
Оформление заказа