Как сделать так, чтобы форма документа запоминала, свернута или развернута группа элементов?

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

Часто при работе с документами или отчетами в 1С возникает задача сделать интерфейс более удобным для пользователя. Одна из таких задач — запоминать состояние групп на форме. Например, если пользователь свернул какую-то группу с дополнительными полями, то при следующем открытии этой формы хотелось бы, чтобы группа осталась свернутой. Давайте вместе разберемся, как это реализовать, и рассмотрим несколько способов: от самого простого до более гибкого программного.

Решение 1: Автоматическое сохранение с помощью свойств формы

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

Разберем по шагам, что нужно сделать:

  1. Создадим реквизит для управления видимостью. Для того чтобы платформа могла сохранить состояние группы (свернута она или развернута), ей нужен "якорь" — реквизит формы, с которым будет связано это состояние. Для этого добавим на форму новый реквизит с типом Булево. Назовем его, например, ГруппаДополнительноРазвернута.

  2. Свяжем группу с новым реквизитом. Теперь нужно указать, что состояние нашей группы зависит от значения этого булева реквизита. Выделим на форме нужную группу элементов и в палитре свойств найдем свойство СвязанныйРеквизитВидимости (или аналогичное, отвечающее за сворачивание, в зависимости от типа группы). Установим в это свойство наш новый реквизит ГруппаДополнительноРазвернута. Теперь, когда пользователь будет сворачивать или разворачивать группу, значение этого реквизита будет автоматически меняться.

  3. Включим сохранение для реквизита. Чтобы платформа "знала", что значение именно этого реквизита нужно сохранять, выделим наш реквизит ГруппаДополнительноРазвернута в дереве реквизитов формы и в палитре свойств найдем свойство Сохранение. Установим для него флажок (значение Истина).

  4. Включим автоматическое сохранение для формы. Это финальный и самый важный шаг. Выделим саму форму (корневой элемент в дереве элементов формы) и в палитре свойств найдем свойство АвтоматическоеСохранениеДанныхВНастройках. Установим для него значение Использовать.

Вот и всё! Теперь при закрытии формы платформа автоматически сохранит значение реквизита ГруппаДополнительноРазвернута для текущего пользователя. А при следующем открытии формы она так же автоматически загрузит это значение, и группа отобразится в том состоянии, в котором пользователь ее оставил.

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

Решение 2: Программное сохранение и восстановление настроек

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

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

Рассмотрим подробнее, как это реализовать:

  1. Сохранение состояния при закрытии формы.

    Для этого будем использовать обработчик события формы ПередЗакрытием. В этом событии мы определим текущее состояние нужного нам элемента (например, группы "МояГруппа") и сохраним его.

    
    &НаКлиенте
    Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
    
        // Создаем структуру, в которую поместим наши настройки
        НастройкиДляСохранения = Новый Структура;
        
        // Получаем состояние группы (свернута или нет) и помещаем в структуру
        // Свойство "Свернута" есть у элемента формы типа "Группа - Обычная группа"
        НастройкиДляСохранения.Вставить("МояГруппаСвернута", Элементы.МояГруппа.Свернута);
        
        // Вызываем серверную процедуру для сохранения
        СохранитьНастройкиНаСервере(НастройкиДляСохранения);
    
    КонецПроцедуры
    
    &НаСервереБезКонтекста
    Процедура СохранитьНастройкиНаСервере(НастройкиДляСохранения)
    
        // Сохраняем структуру в хранилище общих настроек.
        // "КлючНастроек" - это уникальное имя, по которому мы потом найдем наши данные.
        // Лучше всего формировать его из имени объекта и, возможно, имени формы.
        ХранилищеОбщихНастроек.Сохранить("Документ.МойДокумент.ФормаДокумента", "СостояниеГрупп", НастройкиДляСохранения);
    
    КонецПроцедуры
    
  2. Восстановление состояния при открытии формы.

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

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

Преимущества этого способа:

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

← К списку