1. Что понадобится
Релиз платформы 8.2 и выше
Возможность изменять конфигурацию
Немного желания
2. "Поехали!"
Условимся, что форму, внешний вид которой хотим настроить, будем называть АРМ, а форму, в которой будем делать настройки, - ФормаНастроек
2.1. Для начала создадим непериодический, независимый регистр сведений. Должно получиться следующее
2.2. Создадим общую форму - ФормаНастроек. Поместим на нее ТабличноеПоле, укажем ТипЗначения - ТаблицаЗначений, добавим колонки в количестве, равном сумме измерений только что созданного РС + количество ресурсов, т.е. 5. Тип значений колонок установим аналогично измерениям, кроме колонки, которая соответствует ресурсу - у нее выберим составной тип данных - Булево, Цвет, Шрифт. Также добавим командую панель и свяжем ее с созданной Таблицой значений, не забыв про галочку Автозаполнение. Также настроим элементы управления колонок, опять же не забыв снять галочку РедактированиеТекста в колонках ЭлементФормы и ИмяСвойства.
2.3. Добавим в любую форму конфигурации место вызова нашей ФормыНастроеек. На всякий случай код
Форма = ПолучитьОбщуюФорму(<ИмяОбщейФормы>, ЭтаФорма);
Форма.ОткрытьМодально();
2.4. В процедуре ПередОткрытием ФормыНастроек сформируем список элементов, для которых будет возможность редактирования внешнего вида. Список может быть произвольным, в моем случае настраивать можно Табличные поля и Командные панели
// ТаблицаНастроек - имя данных ТаблицыЗначений
// в цикле обходим элементы той формы, из которой открыли общую
// нужные имена элементов добавляем в список выбора колонки ЭлементУправления. СписокВыбора имеет тип СписокЗначений, значит для красоты можно добавить и представление и пр.
СписокВыбора = ЭлементыФормы.ТаблицаНастроек.Колонки.ЭлементФормы.ЭлементУправления.СписокВыбора;
Для каждого ЭлементВладельца Из ЭтаФорма.ВладелецФормы.ЭлементыФормы Цикл
Если НЕ ТипЗнч(ЭлементВладельца) = Тип("КоманднаяПанель") И НЕ ТипЗнч(ЭлементВладельца) = Тип("ТабличноеПоле") Тогда
Продолжить
КонецЕсли;
СписокВыбора.Добавить(ЭлементВладельца.Имя);
КонецЦикла;
2.5. В процедуру обработчика ПриИзменении элемента управления колонки ЭлементФормы поместим следующий код
Если ЭлементыФормы.ТаблицаНастроек.ТекущаяСтрока <> Неопределено Тогда
ЗаполнитьСписокВыбора(ЭлементыФормы.ТаблицаНастроек.ТекущаяСтрока)
КонецЕсли;
ЭлементыФормы.ТаблицаНастроек.ТекущаяСтрока.Значение = "";
ЭлементыФормы.ТаблицаНастроек.ТекущаяСтрока.ИмяСвойства = "";
где Процедура ЗаполнитьСписокВыбора имеет следующий код. В зависимости от выбранного значения в колонке ЭлементФормы - СписокВыбора колонки ИмяСвойства - может быть различным. Оговорюсь, что в моем варианте задействовано 2 типа элемента - ТабПоле и КоманднаяПанель.
Процедура ЗаполнитьСписокВыбора(СтрокаТабличногоПоля)
СтрокаТабличногоПоля.Пользователь = ПараметрыСеанса.ТекущийПользователь;
СтрокаТабличногоПоля.РабочееМесто = Строка(ЭтаФорма.ВладелецФормы.ЭтотОбъект);
ЭлементФормыВладельца = ЭтаФорма.ВладелецФормы.ЭлементыФормы[СтрокаТабличногоПоля.ЭлементФормы];
СписокВыбора = ЭлементыФормы.ТаблицаНастроек.Колонки.ИмяСвойства.ЭлементУправления.СписокВыбора;
СписокВыбора.Очистить();
Если ТипЗнч(ЭлементФормыВладельца) = Тип("ТабличноеПоле") Тогда
СписокВыбора.Добавить("ЧередованиеЦветовСтрок");
СписокВыбора.Добавить("ЦветФонаПоля");
СписокВыбора.Добавить("ЦветТекстаПоля");
Иначе
СписокВыбора.Добавить("ЦветФона");
СписокВыбора.Добавить("ЦветФонаКнопки");
СписокВыбора.Добавить("ЦветТекстаКнопки");
КонецЕсли;
СписокВыбора.Добавить("Шрифт");
КонецПроцедуры // ЗаполнитьСписокВыбора()
2.6. Вот вроде бы все готово для того, чтобы выбранные настройки можно было сохранять. Поместим следующий код в обработчик события Нажатие любой из кнопок ФормыНастроек
НаборЗаписей = РегистрыСведений.НастройкиРабочихМест.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Пользователь.Значение = ПараметрыСеанса.ТекущийПользователь;
НаборЗаписей.Отбор.Пользователь.Использование = Истина;
НаборЗаписей.Отбор.РабочееМесто.Значение = Строка(ЭтаФорма.ВладелецФормы.ЭтотОбъект);
НаборЗаписей.Отбор.Пользователь.Использование = Истина;
НаборЗаписей.Прочитать();
НаборЗаписей.Очистить();
Для каждого СтрНастройки Из ТаблицаНастроек Цикл
СтрНабораЗаписей = НаборЗаписей.Добавить();
ЗаполнитьЗначенияСвойств(СтрНабораЗаписей, СтрНастройки);
СтрНабораЗаписей.Значение = Новый ХранилищеЗначения(СтрНастройки.Значение);
КонецЦикла;
НаборЗаписей.Записать();
Немного поясню (знаю, что многим и так понятно, но есть и те, которые только начинают). Создаем набор записей созданного нами регистра сведений, ищем все записи, касающиеся текущего пользователя и АРМ, которую настраиваем в данный момент и затираем их. Далее в цикле обходим ТаблицуЗначений, добавляя ее строки в набор записей. В конце все записываем и закрываем ФормуНастроек.
2.7. После сохранения записей в РС отладчик вернет нас в модуль формы, из которой открывали ФормуНастроек. Теперь необходимо как то обработать результат настроек. Для этого в модуле формы АРМ поместим следующую процедуру и добавим ее вызов сразу после Форма.ОткрытьМодально()
Процедура ЗагрузитьНастройки()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| НастройкиРабочихМест.Пользователь,
| НастройкиРабочихМест.РабочееМесто,
| НастройкиРабочихМест.ЭлементФормы,
| НастройкиРабочихМест.ИмяСвойства,
| НастройкиРабочихМест.Значение
|ИЗ
| РегистрСведений.НастройкиРабочихМест КАК НастройкиРабочихМест
|ГДЕ
| НастройкиРабочихМест.Пользователь = &Пользователь
| И НастройкиРабочихМест.РабочееМесто = &РабочееМесто";
Запрос.УстановитьПараметр("Пользователь", ПараметрыСеанса.ТекущийПользователь);
Запрос.УстановитьПараметр("РабочееМесто", Строка(ЭтаФорма.ЭтотОбъект));
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Попытка
ЭлементыФормы[ВыборкаДетальныеЗаписи.ЭлементФормы][ВыборкаДетальныеЗаписи.ИмяСвойства] = ВыборкаДетальныеЗаписи.Значение.Получить();
Исключение
Сообщить("Для свойства """ + ВыборкаДетальныеЗаписи.ИмяСвойства + """ элемента формы """ + ВыборкаДетальныеЗаписи.ЭлементФормы + """ не верно выбран тип данных!");
КонецПопытки;
КонецЦикла;
ЭтаФорма.Обновить();
КонецПроцедуры // ЗагрузитьНастройки()
Теперь после закрытия ФормыНастроек - в форме АРМ сразу же будут видны результаты наших манипуляций с настройками.
2.8 Все бы хорошо, но осталась еще пара моментов. Хотелось бы, чтобы при открытии АРМ - пользователь сразу видел привычный ему фон списка документа, размер текста на кнопках и т.д. Для этого вызовем процедуру ЗагрузитьНастройки() в процедуре ПриОткрытии формы АРМ. Также и при открытии ФормыНастроек пользователь видел, какие настройки у него уже установлены. Для этого в процедуру ПередОткрытием ФормыНастроек поместим вызов следующей процедуры
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| НастройкиРабочихМест.Пользователь,
| НастройкиРабочихМест.РабочееМесто,
| НастройкиРабочихМест.ЭлементФормы,
| НастройкиРабочихМест.ИмяСвойства,
| НастройкиРабочихМест.Значение
|ИЗ
| РегистрСведений.НастройкиРабочихМест КАК НастройкиРабочихМест
|ГДЕ
| НастройкиРабочихМест.Пользователь = &Пользователь
| И НастройкиРабочихМест.РабочееМесто = &РабочееМесто";
Запрос.УстановитьПараметр("Пользователь", ПараметрыСеанса.ТекущийПользователь);
Запрос.УстановитьПараметр("РабочееМесто", Строка(ЭтаФорма.ВладелецФормы.ЭтотОбъект));
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
СтрНастроек = ТаблицаНастроек.Добавить();
ЗаполнитьЗначенияСвойств(СтрНастроек, ВыборкаДетальныеЗаписи);
СтрНастроек.Значение = ВыборкаДетальныеЗаписи.Значение.Получить();
КонецЦикла;
Ну, и напоследок. Теперь при октрытии ФормыНастроек видны уже сделанные настройки, но вспомним, что СписокВыбора элемента управления колонки ИмяСвойства у нас до этого заполнялся только при изменении значения в колонке ЭлементУправления, т.е. если попробовать выбрать что либо сразу после октрытия формы - список выбора будет пустой. Поэтому поместим следующий код в событии ПриАктивизацииСтроки элемента ФормыНастроек - ТабличноеПоле
Если ЭлементыФормы.ТаблицаНастроек.ТекущаяСтрока <> Неопределено И ЭлементыФормы.ТаблицаНастроек.ТекущаяСтрока.ЭлементФормы <> Неопределено Тогда
ЗаполнитьСписокВыбора(ЭлементыФормы.ТаблицаНастроек.ТекущаяСтрока)
КонецЕсли;
Теперь точно все готово. Так выглядит результат
UPD 04.12.15: выложил простенькую конфу, с поправками на формы списков