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