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

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

Переход платформы «1С:Предприятие» с обычных форм (версия 8.2) на управляемые формы (версия 8.3) кардинально изменил подход к разработке интерфейса. Одной из частых проблем, с которой сталкиваются разработчики при доработке типовых конфигураций (например, «Бухгалтерия предприятия, редакция 3.0»), является программное управление видимостью колонок в табличных частях документов. Ситуация, когда в коде прописана видимость элемента, но на экране колонка упорно не отображается (или наоборот), знакома многим — для решения проблем с видимостью есть набор инструментов разработчика для анализа метаданных и прав.

В этой статье мы подробно разберем, как устроена работа с видимостью колонок в управляемом интерфейсе 1С 8.3, почему старые методы из версии 8.2 больше не работают, проанализируем неочевидные причины скрытия элементов и рассмотрим современные стандарты разработки для динамической настройки интерфейса (удобно через расширение для управления видимостью элементов форм без программирования).

1. Разница в обращении к колонкам: 1С 8.2 (Обычные формы) vs 1С 8.3 (Управляемые формы)

Вспомним, как управлялась видимость колонок в обычных формах. Табличная часть представляла собой единый объект управления, а колонки были его жестко подчиненной структурой. Мы могли обратиться к колонке напрямую через свойства таблицы:


// Код для обычных форм (1С 8.2)
ЭлементыФормы.Товары.Колонки.СчетУчета.Видимость = Ложь;

В управляемых формах 1С 8.3 архитектура элементов принципиально иная. Сама табличная часть на форме — это элемент типа «Таблица», а все ее колонки — это отдельные, самостоятельные элементы формы типа «Поле формы», которые просто визуально подчинены таблице. Все элементы формы хранятся в единой плоской коллекции Элементы.

Платформа автоматически генерирует уникальные имена для полей табличной части по следующему шаблону: [ИмяТабличнойЧасти][ИмяРеквизита]. Например, если у нас есть табличная часть Товары и в ней реквизит СчетУчета, то имя элемента на форме будет ТоварыСчетУчета.

Соответственно, обращаться к колонке для изменения ее видимости в управляемых формах нужно напрямую через коллекцию Элементы:


// Прямое обращение через точку
ЭтаФорма.Элементы.ТоварыСчетУчета.Видимость = Ложь;

// Обращение через квадратные скобки (удобно при динамическом формировании имени)
ИмяТаблицы = "Товары";
ИмяРеквизита = "СчетУчета";
ЭтаФорма.Элементы[ИмяТаблицы + ИмяРеквизита].Видимость = Ложь;

Попытка обратиться по старому синтаксису или использовать конструкцию вида Товары.СчетУчета вызовет ошибку компиляции или выполнения кода.

2. Почему в отладчике «Видимость = Истина», но колонка на форме скрыта?

Это одна из самых частых загадок управляемого интерфейса. Разработчик заходит в отладчик, проверяет значение свойства ЭтаФорма.Элементы.ТоварыСчетУчета.Видимость, видит там значение Истина, но на экране пользователя колонки физически нет — найти причину поможет инструмент для отладки кода в режиме «Предприятие». Выясним основные причины такого поведения платформы.

Причина А. Отключение видимости родительской группы

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

Элементы.ГруппаСчетовУчета.Видимость = Ложь;

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

Причина Б. Работа функциональных опций (ФО)

Функциональные опции в 1С позволяют гибко управлять интерфейсом в зависимости от настроек констант системы (например, ведется ли учет по складам, используется ли импортный товар, включена ли розничная торговля). Если реквизит табличной части или соответствующий элемент формы привязан к функциональной опции, которая в данный момент отключена в базе данных, платформа жестко скрывает этот элемент. В коде значение свойства Видимость для этого элемента может оставаться равным Истина, но пользователь его не увидит, пока ФО не будет включена в настройках системы.

Причина В. Настройки формы пользователем

Каждый пользователь может самостоятельно настроить состав колонок на форме под свои нужды через меню «Ещё» -> «Изменить форму». Если пользователь вручную снял галочку с колонки Счет учета, элемент визуально пропадет. При этом программная видимость в коде останется равной Истина, так как платформа разделяет программные настройки разработчика и персональные настройки отображения конкретного пользователя.

3. Реализация видимости счетов учета в типовой «Бухгалтерии предприятия 3.0»

Рассмотрим, как управление видимостью счетов учета в табличной части документа «Передача товаров» реализовано на практике. В БП 3.0 показ счетов учета регулируется специальным механизмом, завязанным на персональные настройки.

По умолчанию в новых базах для упрощения работы бухгалтеров счета учета в документах скрыты. За это отвечает персональная настройка пользователя «Показывать счета учета в документах» (хранится в регистре сведений ПерсональныеНастройки). Проанализируем, как это обрабатывается программно.

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


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

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

4. Современные стандарты 1С: Управление видимостью через Условное оформление

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

Современным стандартом для динамического управления свойствами элементов табличной части (доступность, видимость, цвет, оформление полей) является использование механизма Условного оформления формы — также для этого подойдёт модуль централизованного управления логикой реквизитов. С его помощью можно настроить правила отображения декларативно. Рассмотрим, как это реализовать программно на примере настройки видимости колонки склада в табличной части товаров:


&НаСервере
Процедура НастроитьУсловноеОформлениеФормы()

    // Очищаем старые настройки условного оформления, если требуется
    // УсловноеОформление.Элементы.Очистить();

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

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

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

Резюме

Для эффективной работы с управляемыми формами в 1С 8.3 при управлении видимостью колонок табличной части придерживайтесь следующих правил:

  1. Обращайтесь к колонкам напрямую через коллекцию Элементы по шаблону ИмяТаблицыИмяРеквизита.
  2. Если колонка не отображается, несмотря на установленное свойство Видимость = Истина, проверьте видимость родительских групп этой колонки, настройки функциональных опций в базе данных и персональные настройки пользователя.
  3. Используйте группировку элементов формы. Скрыть одну родительскую группу гораздо проще и быстрее с точки зрения производительности, чем скрывать десяток колонок по отдельности.
  4. Для сложной динамической настройки видимости полей в зависимости от данных строки или шапки документа используйте механизм Условного оформления формы. Для этой задачи есть инструмент автоматизации настройки видимости элементов на формах.
← На главную