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