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