Как массово скрыть контрагентов в 1С:УНФ, сохранив видимость документов?

Программист 1С v8.3 (Управляемые формы) 1С:Управление нашей фирмой Управленческий учет Торговля и дистрибуция
← На главную

В процессе сопровождения 1С:УНФ часто возникает специфическая задача: необходимо ограничить доступ к определенной группе контрагентов так, чтобы пользователи не видели их наименования и реквизиты, но при этом могли продолжать работать с документами (заказами, накладными), в которых эти контрагенты фигурируют. Стандартная настройка RLS (Row Level Security) при обычном подходе может полностью скрыть документы, что не всегда приемлемо. Разберем, как решить эту задачу изящно и системно.

Вариант 1. Использование механизма RLS для создания «заглушек»

Проанализируем стандартное поведение системы: если у пользователя есть право на чтение документа, но нет права на чтение объекта, на который ссылается реквизит этого документа, в поле вместо названия отобразится строка <Объект не найден>. Это именно то поведение, которое требуется автору вопроса — документ открыт, суммы видны, но владелец скрыт.

Выполним следующие шаги для реализации этого метода:

  1. Создадим в конфигурации (или через расширение) новую роль, например, ОграничениеПросмотраКонтрагентов.
  2. Для справочника Контрагенты в этой роли настроим ограничение доступа на уровне записей (RLS) для права Чтение.
  3. Текст ограничения может выглядеть следующим образом: ГДЕ НЕ (Ссылка В ИЕРАРХИИ (&ГруппаСкрытыхКонтрагентов))
  4. При этом для документов (например, ЗаказПокупателя) в этой же роли или в других ролях пользователя права на чтение должны остаться полными или ограниченными по другим критериям, но не зависящими от прав на контрагента.

Рассмотрим ситуацию: когда менеджер открывает список заказов, система пытается разрешить ссылку на контрагента. Так как право на чтение конкретного контрагента запрещено правилом RLS, платформа вернет пустую ссылку с пометкой о недоступности. Это эффективный способ, который работает «из коробки» во всех отчетах и формах, использующих стандартные механизмы получения данных.

Вариант 2. Программное переопределение представления в модуле менеджера

Если мы хотим вместо системной надписи <Объект не найден> выводить красивую заглушку, например, «Конфиденциальный клиент», нам следует использовать механизм переопределения представления. Рассмотрим, как это сделать в модуле менеджера справочника Контрагенты.

Этот метод хорош тем, что ссылки остаются рабочими, отчеты не выдают ошибок доступа, но визуально информация маскируется. Добавим в расширение обработчик события ОбработкаПолученияПредставления:


Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
    // Проверяем, входит ли контрагент в защищенную группу
    // Для этого можно использовать ДополнительныеСвойства или быстрый запрос
    Если ЭтоСкрытыйКонтрагент(Данные.Ссылка) Тогда
        Представление = "Информация скрыта (ID: " + СокрЛП(Данные.Ссылка.УникальныйИдентификатор()) + ")";
        СтандартнаяОбработка = Ложь; // Отключаем стандартное формирование
    КонецЕсли;
КонецПроцедуры

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

Вариант 3. Использование функциональных опций (ФО)

Функциональные опции позволяют массово управлять видимостью элементов интерфейса. Если задача стоит именно в скрытии поля (чтобы оно вообще исчезло с глаз), а не в замене текста, то ФО — лучший выбор. Проанализируем алгоритм:

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

Если функциональная опция выключена, платформа автоматически скроет соответствующие колонки в списках и поля на формах. Но будьте внимательны: этот метод «жесткий» — он убирает поле целиком, что может быть неудобно для заполнения новых документов. Он больше подходит для интерфейсного ограничения прав менеджеров среднего звена.

Вариант 4. Маскировка данных через «Условное оформление» в расширении

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


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

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

Вариант 5. Типовая обработка «Скрытие конфиденциальной информации»

В типовых решениях на базе БСП (к которым относится 1С:УНФ) существует стандартная обработка СкрытиеКонфиденциальнойИнформации.epf. Она предназначена для обезличивания данных (например, при передаче базы разработчикам). Рассмотрим её применимость:

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

Подведем итоги

Для реализации задачи в 1С:УНФ наиболее надежным и изящным решением является комбинация тонкой настройки RLS (чтобы получить системную заглушку <Объект не найден>) и расширения с переопределением представления объекта (для вывода пользовательского текста вместо системной ошибки). Это позволит вам не перебирать сотни форм вручную, а внедрить решение на уровне метаданных, которое будет автоматически подхватываться всеми отчетами и списками программы.

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

← На главную