В интерфейсе Такси (Управляемые формы) системы Кронос: WMS на 1С во многих местах требовалось различное оформление динамических списков, поэтому мы решили для себя создать универсальную функцию по работе с ними.
Например, цвет раскраски строк списка заявок на хранение (входящих поставок) настраивается в каждой складской операции:
Внешний вид списка при этом выглядит следующим образом:
Итак, приступим.
Для начала придумаем имя нашей универсальной функции, её параметры
Функция ДобавитьУсловноеОформление(ФормаОбъекта, ПараметрыОформления, Отбор) экспорт
Пример вызова функции -
ДобавитьУсловноеОформление(ЭтаФорма, Новый Структура("ЦветФона, Поле", ЦветФонаСписка, ИмяСписка), Новый Структура("ТЧ, Поле, Значение", ИмяСписка, "СкладскаяОперация", СкладскаяОперация));
Разберем параметры функции:
1. ФормаОбъекта. Передаем контекст нашей формы - ЭтаФорма, для возможности установки условного оформления.
2. ПараметрыОформления. В этом параметре мы указываем необходимое оформление, которое нужно добавить в условное оформление списка - Новый Структура("ЦветФона, Поле", ЦветФонаСписка, ИмяСписка). ЦветФонаСписка - например, цвет, который нам нужно задать на фон, ИмяСписка - это имя нашего динамического списка на форме, если требуется задать на весь список. Можно указать конкретную графу (поле) динамического списка, которое нужно оформить.
3. Отбор. В этом параметре мы указываем необходимый отбор, при котором нужно, чтобы срабатывало условие оформления - Новый Структура("ТЧ, Поле, Значение", ИмяСписка, "СкладскаяОперация", СкладскаяОперация). ИмяСписка(ТЧ) - это имя нашего динамического списка на форме, "СкладскаяОперация" (Поле) - на которое устанавливается отбор, СкладскаяОперация (Значение) - значение, при котором нужно, чтобы оформление работало.
Еще примеры вызовов функции:
ДобавитьУсловноеОформление(ЭтаФорма, Новый Структура("ЦветТекста", WebЦвета.ЛимонноЗеленый), Новый Структура("ТЧ, Поле, Значение","Объект.Двор_СостояниеВорот", "Направление", ""))
ДобавитьУсловноеОформление(ЭтаФорма, Новый Структура("ЦветТекста", WebЦвета.ОранжевоКрасный), Новый Структура("ТЧ, Поле, Значение, ВидСравнения","СписокДокументов_Приемка_Паллеты", "Длительность", 2, ВидСравненияКомпоновкиДанных.Больше))
ДобавитьУсловноеОформление(ЭтаФорма, Новый Структура("Шрифт, Поле", Новый Шрифт(,,Истина), ИмяСписка+"Анализ"), Новый Структура("ТЧ, Поле, Значение","Объект.АнализДокумента", "ВидЗапроса", 7))
Как видно, параметр "ТЧ" у нас может принимать как значения "СписокДокументов_Приемка_Паллеты", так и "Объект.АнализДокумента", т.е. как быть объектом метаданных, так и быть просто списком на форме.
Добавим новый элемент оформления и его параметры:
НовыйЭлемент = ФормаОбъекта.УсловноеОформление.Элементы.Добавить();
Для Каждого Элемент Из ПараметрыОформления Цикл
Если Элемент.Ключ="Поле" Тогда
ПолеОформления = Элемент.Значение;
Иначе
НовыйЭлемент.Оформление.УстановитьЗначениеПараметра(Элемент.Ключ, Элемент.Значение);
КонецЕсли;
КонецЦикла;
НовыйЭлемент.Использование = Истина;
Отбор, как обычно, устанавливается для полей компоновки:
ОформляемыеПоля = НовыйЭлемент.Поля.Элементы.Добавить();
ОформляемыеПоля.Поле = Новый ПолеКомпоновкиДанных(ПолеОформления);
ЭлементОтбор = НовыйЭлемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(Отбор.ТЧ+"."+Отбор.Поле);
Если Отбор.Свойство("ВидСравнения") Тогда
ЭлементОтбор.ВидСравнения = Отбор.ВидСравнения;
Иначе
ЭлементОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
КонецЕсли;
ЭлементОтбор.ПравоеЗначение = Отбор.Значение;
В окончании нашей функции сделаем возврат добавленного оформления для возможности последующей работы с ним:
Возврат Новый Структура("Элемент, Отбор", ФормаОбъекта.УсловноеОформление.Элементы.Количество()-1, НовыйЭлемент.Отбор.Элементы.Количество()-1);
Для удобства привожу функцию целиком:
Функция ДобавитьУсловноеОформление(ФормаОбъекта, ПараметрыОформления, Отбор) экспорт
ПолеОформления = СтрЗаменить(Отбор.ТЧ,"Объект.","");
НовыйЭлемент = ФормаОбъекта.УсловноеОформление.Элементы.Добавить();
Для Каждого Элемент Из ПараметрыОформления Цикл
Если Элемент.Ключ="Поле" Тогда
ПолеОформления = Элемент.Значение;
Иначе
НовыйЭлемент.Оформление.УстановитьЗначениеПараметра(Элемент.Ключ, Элемент.Значение);
КонецЕсли;
КонецЦикла;
НовыйЭлемент.Использование = Истина;
ОформляемыеПоля = НовыйЭлемент.Поля.Элементы.Добавить();
ОформляемыеПоля.Поле = Новый ПолеКомпоновкиДанных(ПолеОформления);
ЭлементОтбор = НовыйЭлемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(Отбор.ТЧ+"."+Отбор.Поле);
Если Отбор.Свойство("ВидСравнения") Тогда
ЭлементОтбор.ВидСравнения = Отбор.ВидСравнения;
Иначе
ЭлементОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
КонецЕсли;
ЭлементОтбор.ПравоеЗначение = Отбор.Значение;
Возврат Новый Структура("Элемент, Отбор", ФормаОбъекта.УсловноеОформление.Элементы.Количество()-1, НовыйЭлемент.Отбор.Элементы.Количество()-1);
КонецФункции
UPD. Возникает вопрос, а как хранить оформление в справочнике и как его оттуда получать.
Есть несколько вариантов, например, в виде ХранилищеЗначения или отдельными полями, или ЗначениеВСтрокуВнутр.
У ХранилищеЗначения есть существенный недостаток - нельзя в запросе проверить есть в нем, что или нет, заполнено оно или нет. Поэтому мы у себя храним в ЗначениеВСтрокуВнутр. Однако, если Вы хотите использовать для мобильного приложения, то ЗначениеВСтрокуВнутр там нет, поэтому рекомендую ХранилищеЗначения.
Итак, как сохранить в справочнике установленное пользователем оформление (цвет текста, цвет фона, шрифты):
&НаСервере
Процедура ПередЗаписьюСервер(Отказ, ПараметрыЗаписи)
Если НастроеноОформление Тогда
СтруктураПараметров = Новый Структура();
СтруктураПараметров.Вставить("Шрифт",Шрифт);
СтруктураПараметров.Вставить("ЦветТекстаСписка",ЦветТекста);
СтруктураПараметров.Вставить("ЦветФонаСписка",ЦветФона);
Объект.НастройкаСписка = ЗначениеВСтрокуВнутр(СтруктураПараметров);
Иначе
Объект.НастройкаСписка = "";
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
ПередЗаписьюСервер(Отказ, ПараметрыЗаписи)
КонецПроцедуры
Назад в справочнике восстанавливаем так:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если НЕ ПустаяСтрока(Объект.НастройкаСписка) Тогда
СтруктураПараметров = ЗначениеИзСтрокиВнутр(Объект.НастройкаСписка);
Шрифт = СтруктураПараметров.Шрифт;
ЦветТекста = СтруктураПараметров.ЦветТекстаСписка;
ЦветФона = СтруктураПараметров.ЦветФонаСписка;
НастроеноОформление = Истина;
КонецЕсли;
КонецПроцедуры
А там где нужно вывести, например, в функцию
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
....
ОформитьСпискиПоСкладскимОперациям(мУсловноеОформлениеТаблиц, мСтруктураФормы);
КонецПроцедуры
&НаСервере
Процедура ОформитьСпискиПоСкладскимОперациям(мУсловноеОформлениеТаблиц, мСтруктураФормы)
Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ
| Спр.НастройкаСписка КАК НастройкаСписка,
| Спр.Ссылка КАК СкладскаяОперация
|ИЗ
| Справочник.лгСкладскиеОперации КАК Спр
|ГДЕ
| НЕ Спр.НастройкаСписка=""""
|";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
СтруктураПараметров = ЗначениеИзСтрокиВнутр(Выборка.НастройкаСписка);
Для Каждого Элемент Из мСтруктураФормы.ИменаСписков Цикл
ФормаСписка = Элемент.Значение;
Если ПустаяСтрока(ФормаСписка.Процесс) Тогда
Продолжить;
КонецЕсли;
мУсловноеОформлениеТаблиц.Вставить(ФормаСписка.ИмяСписка, пакФункцииДиалогов.ДобавитьУсловноеОформление(ЭтаФорма, Новый Структура("ЦветТекста, Поле", СтруктураПараметров.ЦветТекстаСписка, ФормаСписка.ИмяСписка), Новый Структура("ТЧ, Поле, Значение",ФормаСписка.ИмяСписка, "СкладскаяОперация", Выборка.СкладскаяОперация)));
мУсловноеОформлениеТаблиц.Вставить(ФормаСписка.ИмяСписка, пакФункцииДиалогов.ДобавитьУсловноеОформление(ЭтаФорма, Новый Структура("ЦветФона, Поле", СтруктураПараметров.ЦветФонаСписка, ФормаСписка.ИмяСписка), Новый Структура("ТЧ, Поле, Значение",ФормаСписка.ИмяСписка, "СкладскаяОперация", Выборка.СкладскаяОперация)));
мУсловноеОформлениеТаблиц.Вставить(ФормаСписка.ИмяСписка, пакФункцииДиалогов.ДобавитьУсловноеОформление(ЭтаФорма, Новый Структура("Шрифт, Поле", СтруктураПараметров.Шрифт, ФормаСписка.ИмяСписка), Новый Структура("ТЧ, Поле, Значение",ФормаСписка.ИмяСписка, "СкладскаяОперация", Выборка.СкладскаяОперация)));
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Надеюсь, моя публикация была Вам полезна и сэкономит Ваше время, ссылка на все публикации SizovE, думаю Вам понравится Ускоряем тормозной стандартный поиск по динамическому списку, настраиваем его под себя.
Подписывайтесь на мой канал (наверху), будет много интересного бесплатного контента :)