Как в 1С настроить отбор в справочнике по ответственному пользователю?

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

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

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

Вариант 1. Установка отбора в динамическом списке при создании формы (на сервере)

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

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


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

Разберем по шагам, что здесь происходит:

  1. Метод Пользователи.ЭтоПолноправныйПользователь() — это стандартная функция Библиотеки стандартных подсистем (БСП), которая проверяет наличие у текущего сеанса роли Администратора. Если пользователь имеет полные права, код внутри условия выполняться не будет, и он увидит абсолютно все записи.
  2. Мы обращаемся к свойству формы Список. Это основной реквизит динамического списка справочника.
  3. Через коллекцию Отбор.Элементы мы добавляем новый элемент компоновки данных.
  4. Указываем левое значение отбора как ПолеКомпоновкиДанных с именем нашего реквизита Ответственный. Обратите внимание, что имя поля должно точно совпадать с именем реквизита справочника в конфигураторе.
  5. Устанавливаем вид сравнения Равно.
  6. В правое значение помещаем ссылку на текущего пользователя, получаемую через функцию БСП Пользователи.ТекущийПользователь().
  7. Свойство РежимОтображения в значении Недоступный гарантирует, что пользователь не сможет зайти в настройки списка и удалить данный фильтр, чтобы посмотреть чужие записи.

Вариант 2. Использование современных стандартных функций БСП

Если ваша конфигурация построена на базе БСП (например, 1С:ERP, КА, УТ, УНФ или Бухгалтерия предприятия), то конструировать элементы отборов вручную, как в предыдущем примере, не совсем правильно. В БСП есть готовый общий модуль, который содержит безопасные и оптимизированные функции для работы с динамическими списками.

Давайте перепишем наш серверный обработчик, используя стандартные механизмы:


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

В чем преимущества использования функции ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка?

Вариант 3. Настройка параметров выбора в свойствах реквизита (без написания кода)

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

Рассмотрим, как настроить этот отбор без программирования:

  1. Откроем конфигуратор и найдем документ, в котором расположен реквизит, ссылающийся на наш справочник.
  2. Откроем палитру свойств этого реквизита документа.
  3. Найдем свойство Параметры выбора (Choice Parameters) и нажмем кнопку открытия (три точки).
  4. В появившемся окне добавим новую строку:
    • В колонке Имя параметра укажем: Отбор.Ответственный.
    • В колонке Значение выберем системную переменную или параметр сеанса: ТекущийПользователь.

После сохранения этой настройки платформа при нажатии кнопки выбора (три точки или "Показать все") в поле документа автоматически передаст текущего пользователя в качестве параметра в форму выбора справочника и жестко ограничит список элементов. Никакого кода писать не требуется!

Вариант 4. Программное открытие формы выбора с параметрами (на клиенте)

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

Проанализируем пример клиентского кода:


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

При таком подходе платформа сама перехватывает переданную структуру Отбор в параметрах открываемой формы и автоматически накладывает условия фильтрации на динамический список формы выбора справочника.

Вариант 5. Ограничение доступа на уровне записей (RLS)

Все описанные выше способы являются интерфейсными. Они отлично подходят для удобства работы пользователей, чтобы не загромождать списки лишней информацией. Однако они не защищают данные на 100%. Опытный пользователь может обойти эти отборы с помощью внешних обработок, консоли запросов или при построении универсальных отчетов.

Если задача стоит именно в плоскости безопасности и конфиденциальности данных, необходимо настраивать механизм RLS (Row-Level Security).

При использовании конфигураций на базе БСП для этого существует удобная подсистема «Управление доступом». Настройка выполняется следующим образом:

  1. Справочник включается в состав определяемых типов подсистемы ограничения доступа БСП.
  2. Для ролей пользователей настраиваются шаблоны ограничений. В самом простом случае используется стандартный шаблон БСП вида: #ПоОтветственному("Ответственный").
  3. Система на уровне СУБД начинает автоматически модифицировать все запросы к базе данных, отсекая записи, где поле Ответственный не соответствует текущему пользователю.

Важное примечание: Использование RLS гарантирует максимальную безопасность, однако может снижать общую производительность системы при выполнении тяжелых запросов или формировании отчетов, так как к каждому обращению к таблице СУБД неявно добавляются дополнительные соединения и условия фильтрации.

Резюме и рекомендации

Выбор конкретного метода зависит от архитектуры вашей базы данных и бизнес-требований:

← На главную