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