Как сохранить настройки видимости колонок в управляемой форме 1С?

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

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

Выясним причину проблемы

Когда мы изменяем свойство Видимость программно в коде (например, Элементы.ИмяКолонки.Видимость = Истина;), это изменение живет только в рамках текущего сеанса работы с формой. Платформа 1С не сохраняет состояние элементов графического интерфейса в базу данных вместе с документом или справочником. При закрытии формы данные объекта сохраняются, но настройки самой формы — нет. Для того чтобы «запомнить» состояние интерфейса, необходимо использовать специальные механизмы платформы для хранения настроек.

Способ 1: Автоматическое сохранение данных формы

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

Пошаговый алгоритм реализации:

  1. Откроем редактор управляемой формы в конфигураторе.
  2. Перейдем на вкладку Реквизиты и создадим новый реквизит формы, например, ВидимостьСлужебныхКолонок с типом Булево.
  3. В свойствах этого реквизита установим флажок Сохранение.
  4. В свойствах самой формы (корень дерева реквизитов) найдем раздел «Настройки» и убедимся, что свойство Автоматическое сохранение данных в настройках установлено в значение Использовать. Там же в списке Сохраняемые данные должен быть отмечен наш реквизит ВидимостьСлужебныхКолонок.
  5. Теперь нам нужно связать состояние колонок с этим реквизитом. Для этого в модуле формы создадим процедуру, которая будет отвечать за установку видимости:

&НаКлиенте
Процедура ОбновитьВидимостьКолонок()
    Элементы.ИмяТабличнойЧастиКолонка1.Видимость = ВидимостьСлужебныхКолонок;
    Элементы.ИмяТабличнойЧастиКолонка2.Видимость = ВидимостьСлужебныхКолонок;
КонецПроцедуры

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

Чтобы при открытии формы видимость установилась корректно, вызовем процедуру в событии ПриОткрытии:


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    ОбновитьВидимостьКолонок();
КонецПроцедуры

Способ 2: Использование специализированных событий сервера

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


&НаСервере
Процедура ПриСохраненииДанныхВНастройкахНаСервере(Настройки)
    // Сохраняем структуру настроек
    Настройки.Вставить("ВидимостьКолонок", Элементы.ИмяТабличнойЧастиКолонка1.Видимость);
КонецПроцедуры

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

Этот способ более профессиональный, так как он разделяет данные объекта (документа) и данные пользовательских настроек интерфейса.

Способ 3: Условное оформление формы (рекомендуемый)

Часто видимость колонки должна зависеть не просто от желания пользователя, а от данных самого документа (например, если выбран определенный тип операции). В этом случае правильнее всего использовать Условное оформление. Посмотрим на пример программной настройки условного оформления в событии ПриСозданииНаСервере.


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Создаем элемент условного оформления
    ЭлементУО = УсловноеОформление.Элементы.Добавить();
    
    // Определяем оформляемое поле (нашу колонку)
    ПолеОформления = ЭлементУО.Поля.Элементы.Добавить();
    ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("ИмяТабличнойЧастиКолонка1");
    
    // Устанавливаем условие (например, колонка видна только для определенного склада)
    ЭлементОтбора = ЭлементУО.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Склад");
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Заполнено;
    
    // Устанавливаем само свойство - Видимость
    ЭлементУО.Оформление.УстановитьЗначениеПараметра("Видимость", Истина);

КонецПроцедуры

Преимущество этого метода в том, что платформа берет на себя управление отображением. Вам не нужно следить за событиями записи или переоткрытия — как только условие в данных объекта изменится, колонка автоматически появится или исчезнет.

Важные нюансы при работе с видимостью

Рассмотрим различие между свойствами Видимость и ПользовательскаяВидимость. Это критически важный момент для разработчика 1С:

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

Групповое управление элементами

Если в вашей табличной части много зависимых колонок, не стоит прописывать видимость для каждой из них отдельно. Разберем, как упростить код. Объедините нужные колонки в группу формы (тип группы — Группа колонок). Установите у группы Отображение в значение Нет (чтобы не было лишних заголовков). Теперь в коде достаточно управлять видимостью одной группы:


// Одной строкой управляем сразу десятком колонок
Элементы.ГруппаСлужебныхПолей.Видимость = Истина;

Это не только сокращает объем кода, но и делает его более устойчивым к изменениям: если в будущем вы добавите новую колонку, вам достаточно будет просто перетащить её в эту группу в конфигураторе, и логика видимости заработает для неё автоматически.

← На главную