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