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