Как программно скрыть реквизиты табличной части в обычных формах 1С?

Программист 1С v8.3 (Обычные формы)
← К списку

Приветствуем вас! Наверняка вы сталкивались с ситуацией, когда требовалось ограничить просмотр определенных реквизитов табличной части для пользователей в обычных формах 1С. Мы с вами выясним, почему стандартные механизмы прав доступа, которые прекрасно работают в управляемых формах, оказываются бессильны в обычных, и как подойти к решению этой задачи программно. Как мы видим из обсуждений на форумах, стандартные права доступа на уровне ролей для реквизитов объектов в обычных формах действительно не действуют. Это ключевой момент, который подталкивает нас к поиску программных решений. Давайте разберем по шагам несколько эффективных подходов.

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

Первый и наиболее прямолинейный способ – это программное управление свойством Видимость элементов формы. Мы можем сделать это, используя "точку входа" в процедуру ПриОткрытии() модуля формы. 1. Выясним причину: В обычных формах 1С, в отличие от управляемых, нет прямого механизма применения ролевых прав к отдельным реквизитам на уровне формы. Поэтому нам приходится вмешиваться в процесс отображения формы программно. 2. Разберем по шагам: * Нам необходимо получить доступ к элементу формы, который соответствует нужной колонке табличной части. Все элементы формы доступны через коллекцию ЭлементыФормы. * У каждого элемента формы есть свойство Видимость, которое мы можем установить в Истина (видимый) или Ложь (невидимый). * Наиболее логичное место для размещения этого кода – процедура ПриОткрытии() модуля формы. В этой процедуре форма уже сформирована, и мы можем внести свои коррективы до того, как она будет показана пользователю. 3. Посмотрим на пример: Предположим, у нас есть табличная часть Товары и в ней реквизит СекретнаяЦена, который мы хотим скрыть от большинства пользователей.


Процедура ПриОткрытии()

    // Проверяем, имеет ли текущий пользователь роль "ПолныеПрава" или "Администратор".
    // Если нет, то скрываем колонку.
    Если Не РольДоступна("ПолныеПрава") И Не РольДоступна("Администратор") Тогда
        // Обращаемся к элементу формы по его имени.
        // Имя элемента формы для колонки табличной части обычно формируется как
        // ИмяТабличнойЧастиИмяРеквизита (например, ТоварыСекретнаяЦена).
        // Или если у вас табличное поле называется "ТабличноеПолеТовары", а колонка "СекретнаяЦена",
        // то можно обратиться через ЭлементыФормы.ТабличноеПолеТовары.Колонки.СекретнаяЦена.
        // Выбирайте тот вариант, который соответствует вашей структуре формы.
        Если ЭлементыФормы.Найти("ТоварыСекретнаяЦена") <> Неопределено Тогда
            ЭлементыФормы.ТоварыСекретнаяЦена.Видимость = Ложь;
        КонецЕсли;
    КонецЕсли;

    // Важно: всегда вызывайте стандартную обработку, если не хотите полностью ее заменять.
    ПродолжитьВыполнениеСтандартнойОбработки();

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

В этом примере мы используем функцию РольДоступна() для проверки прав текущего пользователя. Если у пользователя нет нужной роли, мы устанавливаем свойство Видимость соответствующего элемента формы в Ложь.

Управление видимостью отдельных ячеек табличной части через событие `ПриВыводеСтроки()`

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


Процедура ТабличноеПолеТоварыПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)

    // Скрываем колонку "Комментарий" для строк, где "Количество" равно нулю.
    Если ДанныеСтроки.Количество = 0 Тогда
        ОформлениеСтроки.Ячейки.Комментарий.Видимость = Ложь;
        // Можно также изменить другие свойства оформления, например, цвет фона или текста.
        // ОформлениеСтроки.Ячейки.Комментарий.ЦветТекста = WebЦвета.Серый;
    КонецЕсли;

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

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

Этот метод дает нам очень гибкий контроль над отображением данных. Если все ячейки составного столбца имеют Видимость = Ложь, то весь столбец не будет отображаться.

Дополнительные аспекты и важные замечания

* Динамическое скрытие по условию: Программный подход позволяет реализовать динамическое скрытие колонок в зависимости от значений других полей или метаданных. Например, видимость колонки может зависеть от значения, введенного в другой колонке той же строки табличной части. * Пользовательская видимость: Существует свойство элемента формы "Пользовательская видимость", которое позволяет пользователю самостоятельно настроить видимость элементов, и эти настройки сохраняются. Однако этим свойством нельзя управлять программно, оно предназначено для конечного пользователя. * Ограничения на доступ к данным ячеек в обычных формах: Стоит учитывать, что в обычных формах данные, отображаемые в табличном поле из табличной части, могут быть недоступны для прямого сравнения в обработчике ПриИзменении(), так как "ячеек для хранения в действительности не существует" после вывода на экран. Это может потребовать предварительного сохранения необходимых для сравнения значений в других реквизитах формы или во временных структурах. Мы рассмотрели подробные программные решения для ограничения просмотра реквизитов табличной части в обычных формах 1С. Выбирайте подход, который наилучшим образом соответствует вашим требованиям к гибкости и динамичности отображения данных.

← К списку