Как заставить управляемую форму 1С запомнить программно измененное расположение элементов?

Программист 1С v8.3 (Управляемые формы)
← К списку

Когда мы работаем с управляемыми формами в 1С:Предприятии, часто возникает задача программного изменения внешнего вида формы – например, мы можем перемещать элементы, скрывать их или менять их свойства в зависимости от логики приложения. Однако, после таких программных изменений возникает вопрос: как сделать так, чтобы форма "запомнила" эти изменения и при следующем открытии отображалась уже с новым, программно заданным расположением элементов? Давайте вместе разберем эту непростую ситуацию и выясним, какие механизмы 1С помогут нам в этом.

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

Понимание приоритетов настроек формы и стандартного хранения

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

  1. Пользовательские настройки в ХранилищеНастроекДанныхФорм:

    Начнем с того, что расположение элементов формы, а также другие персональные настройки (такие как ширина колонок таблиц, порядок сортировки, видимость реквизитов), которые пользователь устанавливает интерактивно (например, через меню "Изменить форму" или просто перетаскивая элементы), по умолчанию сохраняются в специальном системном хранилище. Это хранилище называется ХранилищеНастроекДанныхФорм.

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

  2. Приоритет настроек:

    Разберем приоритеты применения настроек:

    • Программные настройки: Изменения, которые мы вносим в коде формы (например, в ПриСозданииНаСервере) имеют базовый приоритет.
    • Пользовательские настройки: Настройки из ХранилищеНастроекДанныхФорм применяются поверх программных.
    • Фиксированные настройки: Существуют также "фиксированные настройки", которые разработчик может определить на этапе внедрения. Они имеют наивысший приоритет и не могут быть изменены пользователем.
  3. Управление возможностью изменения формы пользователем:

    Если наша цель — полностью исключить возможность пользователя изменять расположение элементов формы и всегда использовать только программно заданный или стандартный макет, мы можем установить свойство формы РазрешитьИзменятьФорму в значение Ложь. В этом случае пользователь не сможет вызвать стандартный механизм изменения формы.

Механизмы сохранения программно измененного расположения

Теперь, когда мы понимаем, как работают приоритеты, давайте рассмотрим, как мы можем заставить форму запоминать наши программные изменения.

1. Использование механизма автоматического сохранения данных формы

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

  1. Свойство формы СохранениеДанныхВНастройках:

    Мы можем настроить форму на автоматическое сохранение настроек при ее закрытии и их автоматическое восстановление при открытии. Для этого используется свойство формы СохранениеДанныхВНастройках. Установим его в одно из значений:

    • АвтоматическоеСохранениеДанныхВНастройках: платформа будет пытаться автоматически сохранять все доступные для сохранения данные формы.
    • ИспользоватьСписок: мы можем явно указать, какие именно реквизиты формы должны сохраняться. Для этого нужно перейти в список сохраняемых данных и отметить нужные.

    Важно: Этот механизм хорошо работает для сохранения значений реквизитов формы, но может быть менее эффективным для сложного изменения *структуры* или *порядка* элементов, которое не привязано напрямую к реквизитам. Для таких случаев нам потребуется более гибкий подход.

2. Явное программное сохранение и восстановление расположения элементов

Если нам нужно сохранить сложное, программно определенное расположение элементов (например, их группировку, порядок, видимость, привязки), которое не является простым значением реквизита, мы будем использовать явное сохранение и загрузку данных с помощью объекта ХранилищеОбщихНастроек.

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

  1. Объект ХранилищеОбщихНастроек:

    Мы будем использовать объект ХранилищеОбщихНастроек, который позволяет сохранять и загружать произвольные данные под определенным ключом для конкретного пользователя или для всех пользователей. Это идеальный инструмент для сохранения сложной структуры расположения элементов.

  2. Алгоритм действий:

    Разберем по шагам, как это работает:

    1. Получение текущего расположения элементов: Нам нужно программно "считать" текущее расположение элементов формы. Это может быть сложной задачей, так как прямого метода "ПолучитьРасположениеЭлементов" нет. Обычно мы сами формируем структуру или массив, описывающий желаемое расположение, или же, если мы меняем это расположение программно, мы уже знаем, какое оно должно быть.

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

    2. Сохранение данных: Используем метод Сохранить() объекта ХранилищеОбщихНастроек. Мы передаем в него наши данные (например, структуру с описанием расположения), ключ для сохранения (уникальная строка, например, имя формы + "МоиНастройкиРасположения") и, опционально, пользователя, для которого сохраняются настройки.

      
      // Пример сохранения настроек расположения
      Процедура ПриЗакрытии()
          // Получаем текущее расположение элементов или формируем структуру желаемого расположения
          // Например, если мы меняли видимость элементов:
          НастройкиРасположения = Новый Структура;
          НастройкиРасположения.Вставить("Элемент1Видимость", Элементы.Элемент1.Видимость);
          НастройкиРасположения.Вставить("Элемент2Видимость", Элементы.Элемент2.Видимость);
          // ... Добавляем другие нужные свойства или структуру
                      
          ХранилищеОбщихНастроек.Сохранить(НастройкиРасположения, "МояФорма_НастройкиРасположения", ЭтотОбъект.Пользователь);
      КонецПроцедуры
      
    3. Загрузка и применение данных: Используем метод Загрузить() объекта ХранилищеОбщихНастроек. Это действие обычно выполняется в событии формы ПриСозданииНаСервере, чтобы применить настройки сразу при открытии формы.

      После загрузки мы получаем нашу структуру или массив и пошагово применяем эти настройки к элементам формы.

      
      // Пример загрузки и применения настроек расположения
      Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
          НастройкиРасположения = ХранилищеОбщихНастроек.Загрузить("МояФорма_НастройкиРасположения", ЭтотОбъект.Пользователь);
                      
          Если НастройкиРасположения <> Неопределено Тогда
              // Применяем загруженные настройки
              Если НастройкиРасположения.Свойство("Элемент1Видимость") Тогда
                  Элементы.Элемент1.Видимость = НастройкиРасположения.Элемент1Видимость;
              КонецЕсли;
              Если НастройкиРасположения.Свойство("Элемент2Видимость") Тогда
                  Элементы.Элемент2.Видимость = НастройкиРасположения.Элемент2Видимость;
              КонецЕсли;
              // ... Применяем другие настройки
          Иначе
              // Если настроек нет, применяем стандартные или первоначальные программные
              Элементы.Элемент1.Видимость = Истина;
              Элементы.Элемент2.Видимость = Ложь;
          КонецЕсли;
      КонецПроцедуры
      
    4. Использование события ПриЗагрузкеДанныхИзНастроекНаСервере:

      Это событие формы вызывается после того, как платформа загрузила стандартные настройки формы (включая пользовательские из ХранилищеНастроекДанныхФорм). Мы можем использовать его для пост-обработки или для применения наших собственных настроек, которые должны иметь приоритет над пользовательскими.

3. Управление и тиражирование настроек

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

  1. Удаление пользовательских настроек:

    Если нам нужно "сбросить" форму к программно заданному или стандартному виду для всех пользователей, мы можем удалить соответствующие пользовательские настройки из ХранилищеНастроекДанныхФорм. Это может быть сделано через специализированные обработки или вручную администратором.

  2. Копирование настроек:

    Настройки форм можно экспортировать в файл и импортировать для другого пользователя. Это полезно, когда администратор настраивает форму "как надо" и затем тиражирует эти настройки другим пользователям.

Заключение

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

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

← К списку