Как сохранить собственные настройки формы на рабочем столе в 1С

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

При разработке интерфейсов в 1С:Предприятие 8.3 разработчики часто сталкиваются с тем, что формы, размещенные на начальной странице (рабочем столе), ведут себя не так, как обычные вспомогательные окна. Одной из наиболее острых проблем является сохранение пользовательских настроек — например, состояния свертывания групп или значений вспомогательных реквизитов. Стандартные события формы, такие как ПередЗакрытием или ПриСохраненииДанныхВНастройкахНаСервере, на рабочем столе могут просто не вызываться при завершении сеанса пользователем.

В этой статье мы разберем причины такого поведения и проанализируем эффективные способы принудительного сохранения данных.

Почему стандартные методы не работают на начальной странице

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

Проанализируем основные способы решения задачи, предложенные практикующими разработчиками.

Решение 1: Сохранение «по политике партии» (в момент изменения)

Самый надежный метод для форм рабочего стола — это сохранение настроек немедленно после того, как пользователь что-то изменил. Мы не ждем закрытия формы, а фиксируем состояние сразу.

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

  1. Отключим стандартный заголовок у группы формы.
  2. Добавим декорацию типа Гиперссылка или Картинка, которая будет имитировать заголовок.
  3. В обработчике нажатия этой декорации напишем код, который меняет видимость группы и сохраняет это состояние в хранилище настроек.

Пример кода для сохранения настройки на сервере:


&НаСервере
Процедура СохранитьНастройкуСостоянияГруппы(ИмяГруппы, Состояние)
    КлючОбъекта = "НастройкиРабочегоСтола/СостояниеГрупп";
    КлючНастройки = ИмяГруппы;
    ХранилищеОбщихНастроек.Сохранить(КлючОбъекта, КлючНастройки, Состояние);
КонецПроцедуры

Таким образом, мы гарантируем, что даже если пользователь «убьет» процесс 1С, последнее состояние интерфейса уже будет записано в базу данных.

Решение 2: Использование стандартного механизма Сохраняемых Данных

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

  1. В свойствах формы установите флаг Сохранять данные в настройках.
  2. В списке реквизитов формы найдите нужный (например, ФлагОтображенияНовостей) и в его свойствах также установите флаг Сохранять.
  3. Чтобы событие ПриСохраненииДанныхВНастройкахНаСервере гарантированно вызывалось, данные в реквизите должны быть изменены.

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

Решение 3: Программная инициализация при открытии

Разберем, как восстановить сохраненные данные при открытии формы. Мы должны прочитать настройки из хранилища и применить их к элементам формы. Посмотрим на пример реализации в событии ПриСозданииНаСервере:


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

Решение 4: Обход ограничения серверного вызова в ПередЗакрытием

Если вам все же критично сохранять данные именно при закрытии, рассмотрим хитрый прием с отказом от закрытия. Этот метод позволяет выполнить асинхронную цепочку действий.

  1. В событии ПередЗакрытием установим Отказ = Истина.
  2. Подключим обработчик ожидания с интервалом 0.1 сек.
  3. В этом обработчике выполним все необходимые серверные вызовы для сохранения настроек.
  4. После выполнения серверных дел программно закроем форму, установив специальный флаг-признак, чтобы не уйти в бесконечный цикл.

Однако помните: для начальной страницы (Desktop) этот метод может не сработать, если закрывается всё приложение целиком, так как обработчик ожидания просто не успеет запуститься.

Выводы и рекомендации

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

Соблюдение этих правил позволит сделать интерфейс рабочего стола в 1С отзывчивым и «умным», сохраняя привычное пользователю окружение при каждом новом входе в систему.

← На главную