Как программно управлять видимостью и доступностью колонок табличной части в 1С 8.3

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет
← На главную

В процессе разработки на платформе 1С:Предприятие 8.3 (управляемые формы) часто возникает задача динамического изменения интерфейса под условия бизнес-логики. Одной из типичных задач является управление видимостью или доступностью колонок в табличных частях документов в зависимости от определенных флагов или настроек (например, отображение счетов учета затрат). Рассмотрим на примере документа Требование-накладная (в актуальных редакциях — Расход материалов), как правильно реализовать управление колонкой Продукция в табличной части Материалы.

Механизм Условного оформления: почему это важно

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

Проанализируем ситуацию: нам необходимо отображать реквизит Продукция только в том случае, если пользователь установил флаг СчетаУчетаЗатратВТаблице в значение Истина. Если же счета учета указываются в шапке документа, колонка в таблице должна скрываться.

Реализация через программную настройку Условного оформления

Для реализации этой задачи на стороне сервера (обычно в процедуре ПриСозданииНаСервере или в специализированной процедуре УстановитьУсловноеОформление) используется объект УсловноеОформление. Разберем по шагам, как добавить правила оформления.

Во-первых, нам необходимо очистить текущие настройки (если процедура вызывается повторно) и добавить новый элемент оформления. Для работы с полями и отборами удобно использовать типовые программные интерфейсы, такие как КомпоновкаДанныхКлиентСервер.


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

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

В данном примере мы используем параметр Видимость. Стоит учитывать, что в некоторых случаях условное оформление может скрывать только содержимое ячейки, оставляя саму колонку пустой. Если ваша цель — полностью убрать заголовок колонки, лучше комбинировать УО с прямой установкой свойства Элементы.ИмяКолонки.Видимость в серверном коде.

Управление доступностью и визуальным выделением

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


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

Почему изменения могут не отображаться на форме?

Разберем основные причины, по которым добавленный программно код может «не работать», как это случилось в обсуждении темы. Выясним, на что стоит обратить внимание в первую очередь:

  1. Редактирование «чужой» формы. В типовых конфигурациях, таких как 1С:Бухгалтерия 8.3, для одного и того же документа может существовать несколько форм (например, ФормаДокумента и ФормаДокументаОбщая). Убедитесь, что вы вносите изменения именно в ту форму, которая назначена основной или используется в текущем сеансе.
  2. Пользовательские настройки формы. Платформа 1С сохраняет настройки «Изменить форму» для каждого пользователя. Если пользователь ранее вручную скрыл колонку, программная установка Видимость = Истина может быть проигнорирована. Рекомендуется сбросить настройки формы через Еще — Изменить форму — Установить стандартные настройки.
  3. Функциональные опции. Проверьте, включена ли соответствующая функциональность в программе (например, «Производство»). Если функциональная опция выключена, реквизит Продукция может быть скрыт на уровне метаданных или системных механизмов, независимо от вашего кода.
  4. Реквизит на форме. Убедитесь, что сам реквизит табличной части добавлен в дерево элементов формы. Программное управление оформлением поля МатериалыПродукция сработает только в том случае, если элемент с таким именем существует на форме.

Комплексный подход к управлению реквизитами затрат

В документах списания материалов в БП 3.0 работа с аналитикой (счета, статьи затрат, подразделения, продукция) часто выносится в отдельные процедуры. Проанализируем, какие еще поля стоит включать в общую группу оформления при изменении флага СчетаУчетаЗатратВТаблице:

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

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

← На главную