Основной объект, с помощью которого выполняется настройка панелей интерфейса, – НастройкиИнтерфейсаКлиентскогоПриложения. Он позволяет работать как с настройками, заданными в конфигураторе разработчиком, так и с настройками, которые пользователь установил для себя в режиме 1С:Предприятие.
Процедуру настройки интерфейса нужно вызывать в модуле управляемого приложения, в обработчике события ПриНачалеРаботыСистемы (листинг 3.185).
Листинг 3.185. Обработчик события «ПриНачалеРаботыСистемы»
Процедура ПриНачалеРаботыСистемы()
РаботаСИнтерфейсом.НастройкаИнтерфейса();
ОбновитьИнтерфейс();
КонецПроцедуры
После выполнения настройки необходимо выполнить перестроение интерфейса клиентского приложения с помощью метода глобального контекста ОбновитьИнтерфейс().
Саму процедуру настройки интерфейса поместим в общий неглобальный модуль РаботаСИнтерфейсом с установленными свойствами Сервер и Вызов сервера (листинг 3.186).
Листинг 3.186. Процедура «НастройкаИнтерфейса»
Процедура НастройкаИнтерфейса() Экспорт
ПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь();
Для Каждого РольПользователя Из ПользовательИБ.Роли Цикл
Если РольПользователя.Имя = "Администратор" Тогда
РасширенныйИнтерфейс();
КонецЕсли;
Если РольПользователя.Имя = "Менеджер" Тогда
МинимальныйИнтерфейс();
КонецЕсли;
КонецЦикла;
КонецПроцедуры
В этой процедуре для пользователя с ролью Менеджер мы вызываем процедуру для формирования минималистичного интерфейса, а для пользователя с ролью Администратор вызываем процедуру формирования расширенного интерфейса. Для простоты будем считать, что каждому пользователю присвоена только одна роль.
Для менеджера мы будем отображать в основном окне приложения только панель инструментов и панель открытых, причем независимо от его личных настроек и настроек, сделанных в конфигураторе.
Поместим в общем модуле процедуру МинимальныйИнтерфейс() и заполним ее следующим образом (листинг 3.187).
Листинг 3.187. Процедура «МинимальныйИнтерфейс»
Процедура МинимальныйИнтерфейс() Экспорт
НастройкиИнтерфейса = Новый НастройкиИнтерфейсаКлиентскогоПриложения;
НастройкиСостава = НастройкиИнтерфейса.ПолучитьСостав();
// Очистить настройки состава.
НастройкиСостава.Верх.Очистить();
НастройкиСостава.Лево.Очистить();
НастройкиСостава.Низ.Очистить();
НастройкиСостава.Право.Очистить();
ПанельИнструментов = Новый ЭлементНастройкиСоставаИнтерфейсаКлиентскогоПриложения("ПанельИнструментов");
ПанельОткрытых = Новый ЭлементНастройкиСоставаИнтерфейсаКлиентскогоПриложения("ПанельОткрытых");
НастройкиСостава.Верх.Добавить(ПанельИнструментов);
НастройкиСостава.Низ.Добавить(ПанельОткрытых);
НастройкиИнтерфейса.УстановитьСостав(НастройкиСостава);
ХранилищеСистемныхНастроек.Сохранить("Общее/НастройкиИнтерфейсаКлиентскогоПриложения", , НастройкиИнтерфейса);
КонецПроцедуры
В этой процедуре мы конструктором создаем пустой объект НастройкиИнтерфейсаКлиентскогоПриложения. Затем с помощью метода этого объекта ПолучитьСостав() мы получаем настройки состава интерфейса, установленные в конфигураторе. После этого очищаем список панелей интерфейса и групп панелей, размещенных в верхней, левой, правой и нижней частях основного окна клиентского приложения.
Это необходимо сделать, так как, даже если разработчик ничего не настраивал в конфигураторе, стандартно в интерфейсе клиентского приложения уже отображаются панель разделов, панель функций текущего раздела и панель инструментов (рис. 3.233).

Рис. 3.233. Стандартный состав панелей интерфейса в конфигураторе
Затем создаем конструктором новые элементы настройки состава интерфейса на основании стандартных имен панелей – ПанельИнструментов и ПанельОткрытых. И добавляем их соответственно в верхнюю и нижнюю часть основного окна приложения.
После этого с помощью метода УстановитьСостав() мы загружаем измененные настройки состава интерфейса в пустой объект НастройкиИнтерфейсаКлиентскогоПриложения.
И в заключение сохраняем эти настройки для текущего пользователя в хранилище системных настроек с ключом Общее/НастройкиИнтерфейсаКлиентскогоПриложения. Это необходимо сделать, так как пользовательские настройки применяются поверх всех остальных и затирают их.
Запустим «1С:Предприятие» от имени пользователя с ролью Менеджер. Независимо от настроек, сделанных в конфигураторе, и от личных настроек менеджера, сделанных в прошлом сеансе работы, при старте прикладного решения для него всегда будет отображаться минималистичный интерфейс, состоящий из рабочей области, панели инструментов (сверху) и панели открытых в нижней части основного окна приложения (рис. 3.234).

Рис. 3.234. Минимальный состав панелей интерфейса для менеджера
Теперь рассмотрим формирование состава панелей интерфейса для пользователя с ролью Администратор на основе настроек, сделанных им в режиме 1С:Предприятие.
Предположим, администратор в пользовательском режиме изменил стандартное расположение панелей интерфейса. Он скрыл панель разделов и установил отображение панели открытых в нижней части основного окна приложения (рис. 3.235).

Рис. 3.235. Настройка панелей администратором в режиме «1С:Предприятие»
После изменения эти настройки были сохранены в системном хранилище для пользователя с ролью Администратор. И теперь при старте прикладного решения для администратора в основном окне приложения вместо стандартного состава и расположения панелей интерфейса показывается тот вид, который он настроил для себя в режиме 1С:Предприятие (рис. 3.236).

Рис. 3.236. Состав панелей интерфейса, настроенных администратором
Теперь мы хотим немного изменить и расширить эти настройки из встроенного языка. А именно – мы хотим отображать для администратора в левой части основного окна приложения панель избранного, а сверху, несмотря на его личные настройки, отображать панель инструментов и панель функций текущего раздела, причем не друг под другом, а в одной строке.
Для этого настройки пользователя надо прочитать из системного хранилища, изменить и записать обратно.
Напомним, что процедура НастройкаИнтерфейса() расположена в общем модуле РаботаСИнтерфейсом и вызывается из модуля управляемого приложения в обработчике ПриНачалеРаботыСистемы(). В процедуре настройки анализируются роли пользователей, и для пользователя с ролью Администратор вызывается процедура формирования расширенного интерфейса.
Поместим процедуру РасширенныйИнтерфейс() в том же общем модуле и заполним ее следующим образом (листинг 3.188).
Листинг 3.188. Процедура «РасширенныйИнтерфейс»
Процедура РасширенныйИнтерфейс() Экспорт
НастройкиИнтерфейса = ХранилищеСистемныхНастроек. Загрузить("Общее/НастройкиИнтерфейсаКлиентскогоПриложения");
НастройкиСостава = НастройкиИнтерфейса.ПолучитьСостав();
Лево = НастройкиСостава.Лево;
Верх = НастройкиСостава.Верх;
Низ = НастройкиСостава.Низ;
Право = НастройкиСостава.Право;
ПанельИнструментов = Новый ЭлементНастройкиСоставаИнтерфейсаКлиентскогоПриложения("ПанельИнструментов");
ПанельФункцийТекущегоРаздела = НовыйЭлементНастройкиСоставаИнтерфейсаКлиентскогоПриложения("ПанельФункцийТекущегоРаздела");
ПанельИзбранного = Новый ЭлементНастройкиСоставаИнтерфейсаКлиентскогоПриложения("ПанельИзбранного");
Если Верх.Количество() > 0 Тогда
Верх.Очистить();
КонецЕсли;
ГруппаВерх = Новый НастройкиСоставаИнтерфейсаКлиентскогоПриложения();
ГруппаВерх.Верх.Добавить(ПанельИнструментов);
ГруппаВерх.Верх.Добавить(ПанельФункцийТекущегоРаздела);
Верх.Добавить(ГруппаВерх.Верх);
Для Каждого Панель Из Лево Цикл
Если Панель.Имя = "ПанельИнструментов" Тогда
Лево.Удалить(Лево.Индекс(Панель));
КонецЕсли;
Если Панель.Имя = "ПанельФункцийТекущегоРаздела" Тогда
Лево.Удалить(Лево.Индекс(Панель));
КонецЕсли;
Если Панель.Имя = "ПанельИзбранного" Тогда
Лево.Удалить(Лево.Индекс(Панель));
КонецЕсли;
КонецЦикла;
Лево.Добавить(ПанельИзбранного);
НастройкиИнтерфейса.УстановитьСостав(НастройкиСостава);
ХранилищеСистемныхНастроек.Сохранить("Общее/НастройкиИнтерфейсаКлиентскогоПриложения", , НастройкиИнтерфейса);
КонецПроцедуры
В этой процедуре сначала мы загружаем из системного хранилища настройки текущего пользователя в объект НастройкиИнтерфейсаКлиентскогоПриложения. Затем с помощью метода этого объекта ПолучитьСостав() мы получаем настройки состава интерфейса, заданные пользователем. После этого с помощью свойств Верх, Лево, Право, Низ получаем список панелей и групп панелей, размещенных в верхней, левой, правой и нижней частях основного окна клиентского приложения.
Затем создаем конструктором новые элементы настройки состава интерфейса на основании стандартных имен панелей: ПанельИнструментов, ПанельФункцийТекущегоРаздела и ПанельИзбранного.
Нужно обратить внимание на один момент. Здесь, в отличие от настройки панелей для менеджера, мы не очищаем списки панелей, так как нам нужно добавить свои панели к списку панелей пользователя.
Поэтому в общем случае, перед тем как добавлять панели, надо проверить, не содержатся ли они в каждой из четырех групп (Верх, Лево, Право, Низ) настроек состава интерфейса, заданных пользователем. Это необходимо сделать потому, что панель интерфейса не может быть дважды включена ни в одну и ту же, ни в разные группы настроек состава интерфейса.
Для упрощения примера мы будем проверять наличие трех панелей (которые мы собираемся добавлять) только в левой группе настроек состава пользовательского интерфейса. И если наши панели там уже содержатся, будем их просто удалять. А верхнюю группу будем очищать, несмотря на настройки пользователя.
После выполнения этих проверок мы конструктором создаем пустой объект НастройкиСоставаИнтерфейсаКлиентскогоПриложения. И добавляем в верхнюю часть этих настроек (ГруппаВерх.Верх) созданные ранее элементы настройки состава интерфейса – ПанельИнструментов и ПанельФункцийТекущегоРаздела. И затем уже эту новую группу настроек (ГруппаВерх.Верх) добавляем в верхнюю группу пользовательских настроек состава. Таким образом, мы расположили обе панели интерфейса в новой группе настроек и поместили эту группу вверху основного окна приложения пользователя.
ПанельИзбранного просто добавляем в левую группу пользовательских настроек состава, так как перед этим мы удаляем ее из списка панелей (если она там содержится).
После этого с помощью метода УстановитьСостав() мы загружаем измененные настройки состава в пользовательские настройки состава интерфейса.
В заключение сохраняем эти настройки для текущего пользователя в хранилище системных настроек с ключом Общее/НастройкиИнтерфейсаКлиентскогоПриложения.
Запустим «1С:Предприятие» от имени пользователя с ролью Администратор. Мы видим, что в левой части основного окна приложения появилась панель избранного, а сверху, несмотря на личные настройки пользователя, в одной строке располагаются панель инструментов и панель функций текущего раздела. При этом панель открытых отображается в нижней части основного окна приложения – в соответствии с пользовательскими настройками, сделанными ранее (рис. 3.237).

Рис. 3.237. Расширенный состав панелей интерфейса для администратора