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

Программист 1С v8.3 (Управляемые формы)
← На главную

При разработке интерфейсов на управляемых формах 1С часто возникает задача ограничить видимость конфиденциальной информации. Особенную сложность представляет ситуация, когда данные нужно скрыть не во всей колонке целиком, а только в конкретных строках, соответствующих определенному условию. Например, когда в документе ЗаказПокупателя пользователю с ограниченными правами разрешено видеть стоимость услуг, но запрещено видеть цены на товары. Рассмотрим, как эффективно реализовать такой функционал, сохранив при этом удобство работы с формой.

Особенности работы с видимостью в управляемых формах

Прежде чем переходить к реализации, проанализируем технические ограничения платформы 8.3. В отличие от обычных форм, где существовало событие ПриВыводеСтроки, позволяющее напрямую управлять свойствами ячеек, в управляемых формах интерфейс отрисовывается на стороне клиента на основе данных, подготовленных на сервере. Прямое управление видимостью ячейки через код Элементы.ТабличнаяЧастьЦена.Видимость = Ложь приведет к скрытию всей колонки для всех строк без исключения. Для решения нашей задачи основным инструментом является Условное оформление.

Метод 1: Использование Условного оформления и свойства «Текст»

Самый простой и визуально чистый способ — это подмена текста в ячейке. Если мы просто установим свойство Видимость = Ложь в настройках условного оформления для конкретной ячейки, платформа может либо оставить пустое место, либо в некоторых случаях (в зависимости от версии платформы) отработать некорректно. Разберем по шагам наиболее стабильный вариант с подменой текста.

В настройках условного оформления формы (или программно) мы можем указать, что при выполнении условия (например, Номенклатура.ТипНоменклатуры = Товар) в поле Текст должен выводиться определенный символ или пустая строка. Рассмотрим программную реализацию этого метода в модуле формы:


&НаСервере
Процедура НастроитьУсловноеОформлениеНаСервере()
    
    // Очистим или добавим новый элемент оформления
    ЭлементОформления = УсловноеОформление.Элементы.Добавить();
    
    // Определяем, ЧТО именно мы будем менять
    ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
    ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("ТоварыЦена");
    
    // Устанавливаем условие: скрываем цену, если это Товар
    ЭлементУсловия = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементУсловия.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.ТипНоменклатуры");
    ЭлементУсловия.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    ЭлементУсловия.ПравоеЗначение = Перечисления.ТипыНоменклатуры.Товар;
    
    // Устанавливаем само оформление: подменяем текст на звездочки
    ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Текст", "***");
    // Дополнительно можно запретить редактирование
    ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);
    
КонецПроцедуры

Метод 2: Использование вспомогательного реквизита в табличной части

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

Рассмотрим алгоритм реализации этого метода:

  1. Добавляем в таблицу Товары на форме реквизит СкрыватьДанные.
  2. В процедурах ПриСозданииНаСервере и ПослеЗаписиНаСервере вызываем код заполнения этого признака.
  3. Настраиваем Условное оформление, где условием будет Объект.Товары.СкрыватьДанные = Истина.

Проанализируем пример кода для заполнения признака:


&НаСервере
Процедура ЗаполнитьПризнакиСкрытияДанных()
    
    // Проверяем роль пользователя один раз
    ЭтоОграниченныйДоступ = НЕ РольДоступна("ПолныеПрава");
    
    Для Каждого СтрокаТЧ Из Объект.Товары Цикл
        // Условие: скрываем цену для товаров, если у пользователя нет прав
        Если ЭтоОграниченныйДоступ И СтрокаТЧ.ТипНоменклатуры = Перечисления.ТипыНоменклатуры.Товар Тогда
            СтрокаТЧ.СкрыватьДанные = Истина;
        Иначе
            СтрокаТЧ.СкрыватьДанные = Ложь;
        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры

Важный нюанс: защита от вычислений

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

Также следует помнить о механизме «Вывести список». Если пользователь нажмет «Еще» — «Вывести список», система может сформировать текстовый документ или таблицу Excel, где скрытые через свойство Текст значения могут стать доступными (в зависимости от настроек оформления). Для полной безопасности рекомендуется программно отключать возможность вывода списка для пользователей с ограниченными правами:

Элементы.Товары.ТолькоПросмотр = Истина; (или управление свойством ИзменятьСостав).

Метод 3: Безопасная подмена данных (Уровень "Pro")

Если требования безопасности максимально строгие и данные о цене товара вообще не должны попадать с сервера на клиентский компьютер, используется метод подмены табличной части. Вместо использования основной ТЧ документа на форму выводится Реквизит формы типа ТаблицаЗначений.

Рассмотрим подробнее этот процесс:

  1. При чтении данных на сервере (процедура ПриЧтенииНаСервере) мы выгружаем ТЧ документа в таблицу значений.
  2. Проходим циклом по таблице и для строк-товаров физически очищаем значения в колонках Цена и Сумма (записываем туда 0).
  3. Отображаем эту «обработанную» таблицу пользователю.
  4. При записи документа мы выполняем обратную операцию: подтягиваем реальные цены из базы данных (или из скрытого хранилища на сервере), чтобы не перезаписать документ нулевыми значениями.

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

Визуальное выделение для удобства пользователя

Чтобы отсутствие данных в строке не выглядело как ошибка системы, выясним причину и дадим пользователю визуальный сигнал. Хорошей практикой считается использование Цвета фона в Условном оформлении. Например, для ячеек, где данные скрыты, можно установить светло-серый цвет фона. Это интуитивно понятно объясняет пользователю, что поле недоступно для работы в данной строке.

Итог: Для большинства задач достаточно использования Условного оформления со свойством Текст и привязкой к вспомогательному реквизиту строки. Это позволяет гибко управлять интерфейсом без потери производительности платформы 1С.

← На главную