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