Как программно сохранить и восстановить настройки панелей интерфейса для разных типов клиентов в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке интерфейсов на управляемых формах часто возникает задача адаптации рабочего пространства под конкретные условия работы пользователя. Например, при работе через веб-клиент в браузере место на экране ограничено, и нам может потребоваться скрыть лишние панели, в то время как в тонком клиенте пользователю удобнее видеть полный состав инструментов (панель разделов, панель открытых, панель избранного). Рассмотрим, как реализовать механизм «запоминания» и автоматического восстановления этих настроек.

Механизм управления интерфейсом через Хранилище системных настроек

Для программного взаимодействия с составом панелей в 1С используется объект НастройкиИнтерфейсаКлиентскогоПриложения и глобальный объект ХранилищеСистемныхНастроек. Разберем по шагам, как получить текущее состояние интерфейса, изменить его и сохранить обратно.

Проанализируем основную функцию, которая позволяет управлять панелями. Важно понимать, что настройки хранятся под определенными ключами. Стандартный путь для настроек интерфейса — "Общее/НастройкиИнтерфейсаКлиентскогоПриложения".

Рассмотрим пример кода, который выполняет настройку состава панелей:


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

Разделение настроек для разных типов клиентов

Проблема, с которой часто сталкиваются разработчики: если сохранить настройки под стандартным ключом, они применятся везде. Чтобы «веб-клиент» не портил вид «тонкому клиенту», мы можем использовать методику разделения ключей. Выясним, как это реализовать.

Вместо использования стандартного пути "Общее/НастройкиИнтерфейсаКлиентскогоПриложения", мы можем сохранять объект НастройкиИнтерфейсаКлиентскогоПриложения в произвольный путь в хранилище. Посмотрим на пример логики в модуле управляемого приложения:

  1. В обработчике ПриНачалеРаботыСистемы определяем ТекущийРежимЗапуска().
  2. Если это Веб-клиент: загружаем настройки из ключа "МойИнтерфейс/Веб". Если их там нет — создаем минималистичные настройки и сохраняем их туда.
  3. Если это Тонкий клиент: загружаем настройки из ключа "МойИнтерфейс/Тонкий".
  4. После загрузки объекта из нашего кастомного пути, сохраняем его в системный путь "Общее/НастройкиИнтерфейсаКлиентскогоПриложения", чтобы платформа «подхватила» их при отрисовке.

Важные ключи системных настроек

Помимо общего состава панелей, существуют дополнительные ключи, которые позволяют более тонко управлять интерфейсом. Проанализируем основные из них:

Использование XDTO для надежного хранения

Если стандартное хранилище настроек кажется вам недостаточно гибким (например, настройки могут пропасть при чистке кэша), проанализируем альтернативный метод — сериализацию в XDTO. Мы можем превратить объект настроек в строку XML и сохранить её в обычный справочник или регистр сведений.

Разберем пример записи настроек в строку:


// Сериализация объекта настроек в XML
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
СериализаторXDTO.ЗаписатьXDTO(ЗаписьXML, НастройкиИнтерфейса);
СтрокаНастроек = ЗаписьXML.Закрыть();
// Теперь СтрокаНастроек можно сохранить в реквизит справочника Пользователи

И обратное восстановление:


// Десериализация из строки
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(СтрокаНастроек);
НастройкиИнтерфейса = СериализаторXDTO.ПрочитатьXDTO(ЧтениеXML);

Нюансы обновления интерфейса

Важно помнить, что метод ХранилищеСистемныхНастроек.Сохранить() лишь записывает данные в базу. Чтобы изменения отобразились у пользователя в текущем сеансе, иногда требуется вызов метода ОбновитьИнтерфейс(). Однако для глобальных изменений панелей (состав Верх, Низ, Лево, Право) платформа чаще всего требует перезапуска сеанса, так как структура главного окна инициализируется в момент старта приложения.

Подведем итог: для успешного управления панелями необходимо комбинировать работу с объектом НастройкиИнтерфейсаКлиентскогоПриложения и правильное позиционирование ключей в ХранилищеСистемныхНастроек в зависимости от режима запуска приложения.

← На главную