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