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