Условное оформление строк таблицы из данных таблицы
Решаем проблему условного оформления, когда нам нужно «Раскрасить» строки динамического списка справочника в цвета, которые указываются в справочнике.
- Описание
- Подробнее
Описание
Добрый день.
Неоднократно сталкивался с оформлением таблиц, но всегда удавалось обходить проблему, но ОДНАЖДЫ я был вынужден искать решение.
Итак, суть задачи: У нас есть справочник "Задачи". Пользователи должны иметь возможность указать цвет задачи, чтобы визуально разделять задачи по критериям, которые определяет сам пользователь. Мы могли бы сделать перечисление, но в универсальном случае каждый пользователь должен иметь возможность структурировать свою собственную квалификацию задач по цветам.
Шаг 1:
Создаем справочник и формируем возможность указывать ее цвет:
Для визуального отображения результата выбора добавляю на форму команду "УстановитьЦвет"
&НаКлиенте
Процедура УстановитьЦвет(Команда)
ВыборЦвета = Новый ДиалогВыбораЦвета;
ТекущийЦвет = Элементы.УстановитьЦвет.ЦветФона;
ВыборЦвета.Цвет = ТекущийЦвет;
ВыборЦвета.Показать(Новый ОписаниеОповещения("ЗавершениеВыбораЦвета", ЭтотОбъект));
КонецПроцедуры
&НаКлиенте
Процедура ЗавершениеВыбораЦвета(Результат, ДопПараметры) Экспорт
Если Результат = неопределено Тогда
Возврат;
КонецЕсли;
Элементы.УстановитьЦвет.ЦветФона = Результат;
Если Не ЗначениеЗаполнено(Объект.Наименование) Тогда
Объект.Наименование = Результат;
КонецЕсли;
КонецПроцедуры
и добавляем в справочник реквизит "Цвет" (Хранилище значения)
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
ТекущийОбъект.ЦветХранилище = Новый ХранилищеЗначения(Элементы.ЦветЗадачи.ЦветФона);
КонецПроцедуры
В результате получаем:
Обращу ваше внимание (с этим мы столкнемся ниже):
Значение цвета у нас такое:
это говорит нам о том, что получить значение цвета в RGB не удастся.
Довольно странно, т.к. в форме выбора цвета данное значение есть.
Но если мы запишем нашу задачу и откроем заново, то благодаря паре строк кода, наша кнопка окрасится в выбранный нами ранее цвет.
Шаг 2:
Создаем список задач пользователя. Их может быть 10, а может быть 1000. В любом случае нам нужно обратиться к условному оформлению.
1-й способ: Динамический список
Мы можем использовать условное оформление как самого динамического списка, так и оформление формы:
Из скрина выше очевидны следующие проблемы:
а) А что с чем сравнивать? (Какое условие нужно установить?)
b) Какое оформление должно быть установлено?
Как мы видим: если даже мы можем указать условие оформления Ссылка = Ссылка, то у нас нет возможности указать значение оформления из реквизита "цвет".
Так же дела обстоят с Условным оформлением созданным с помощью кода. Нам просто НЕГДЕ взять информацию о каждой строке динамического списка.
Вывод: Для динамического списка решения не видно.
2-й способ: HTML
Как мы знаем, платформа обновила ядро браузера и довольно стабильно стала работать с "гипертектстом". Не будем заморачиваться и сделаем таблицу <table>. Гораздо важнее здесь другое:
После выполнения запроса к БД мы получаем ссылку на задачу, и цвет в хранилище значений. И если мы вспомним, что я писал Здесь, то поймем, что браузеру "не понять" нашего цвета. После поисков в сети пришел к выводу: Мы можем написать самостоятельно форму выбора цвета, в которой будет заполняться значение RGB или можем скачать ее Здесь, и хранить 3 значения цвета в БД. Тогда при выводе html страницы мы сможем раскрасить строки.
Меня же данный результат не удовлетворил.
3-й способ: Таблица значений
Если принять решение, что у пользователя будет не больше 20 активных задач И\ИЛИ сделать пагинацию, то мы можем воспользоваться довольно костыльным методом, а именно:
Пока ВыборкаЗадачи.Следующий() Цикл
ЭлементОформления = УсловноеОформление.Элементы.Добавить();
Поле = ЭлементОформления.Поля.Элементы.Добавить();
Поле.Поле = Новый ПолеКомпоновкиДанных("Список");
ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Задачи.Ссылка");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = ВыборкаЗадачи.Ссылка;
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", Выборка.Цвет.Получить());
КонецЦикла;
Для каждой задачи создаем отдельный элемент условного оформления.
Плюс у данного метода один: это работает.
Из минусов: при большом количестве задач условное оформление приходит к анархии. Менеджерить это невозможно, по этому приходится постоянно очищать условное оформление и создавать его заново. Создание оформления, судя по описанию в синтакс помощнике, формируется при помощи неявного обращения к серверу. При добавлении задачи или ее закрытии нужно вносить изменения в условное оформление. Динамическое считывание данных хромает, т.к. при использовании обработчиков ожидания или оповещений — нужно будет обновлять условное оформление.
Вывод: работать будет при условии, что у пользователя в списке не больше 20 активных задач, в противном случае, все будет нещадно тупить. Кроме того, очень большая вероятность багов.
Подведем итог:
Мне удалось найти решение только путем совместного мозгового штурма с моими коллегами. Решение полноценное, оптимальное и базируется на описанном мной выше опыте, но, как и многое другое в нашей "любимой" системе, не без изъяна.
Если к статье будет интерес, обязательно его опишу.
Всем удачи в поисках простых решений для нестандартных проблем.