В процессе разработки и настройки систем на платформе 1С:Предприятие часто возникает задача разграничения видимости данных. Типичный сценарий: в справочнике системы пользователи создают различные записи (например, контрагентов, договоры или проекты), но каждому конкретному сотруднику необходимо видеть только те элементы, за которые он отвечает лично. При этом администраторы или руководители должны сохранять полный доступ ко всем записям без каких-либо ограничений.
В этой статье мы подробно разберем несколько эффективных способов решения этой задачи для управляемых форм. Мы рассмотрим как программные методы (через доработку динамического списка и использование БСП), так и полностью интерактивные варианты настройки без написания кода, а также затронем тему безопасности данных на уровне записей (RLS).
Это самый популярный и гибкий программный метод, который часто применяется непосредственно в форме списка или форме выбора справочника. Нам необходимо перехватить момент инициализации формы на сервере, проверить роль текущего пользователя и, если он не является полноправным администратором, наложить жесткий фильтр на поле Ответственный.
Давайте откроем модуль формы списка (или формы выбора) нашего справочника и найдем предопределенную процедуру ПриСозданииНаСервере. Если ее нет, создадим ее. Пропишем в ней следующий алгоритм:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Проверяем, обладает ли пользователь административными правами
Если Не Пользователи.ЭтоПолноправныйПользователь() Тогда
// Находим или добавляем элемент отбора в настройки динамического списка
ЭлементОтбора = ЭтаФорма.Список.Отбор.Элементы.Добавить(Тип("ЭлементОтборКомпоновкиДанных"));
ЭлементОтбора.ЛевоЗначение = Новый ПолеКомпоновкиДанных("Ответственный");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Пользователи.ТекущийПользователь();
ЭлементОтбора.Использование = Истина;
// Запрещаем пользователю самостоятельно отключать или изменять этот отбор в пользовательских настройках
ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
КонецЕсли;
КонецПроцедуры
Разберем по шагам, что здесь происходит:
Пользователи.ЭтоПолноправныйПользователь() — это стандартная функция Библиотеки стандартных подсистем (БСП), которая проверяет наличие у текущего сеанса роли Администратора. Если пользователь имеет полные права, код внутри условия выполняться не будет, и он увидит абсолютно все записи.Список. Это основной реквизит динамического списка справочника.Отбор.Элементы мы добавляем новый элемент компоновки данных.ПолеКомпоновкиДанных с именем нашего реквизита Ответственный. Обратите внимание, что имя поля должно точно совпадать с именем реквизита справочника в конфигураторе.Равно.Пользователи.ТекущийПользователь().РежимОтображения в значении Недоступный гарантирует, что пользователь не сможет зайти в настройки списка и удалить данный фильтр, чтобы посмотреть чужие записи.Если ваша конфигурация построена на базе БСП (например, 1С:ERP, КА, УТ, УНФ или Бухгалтерия предприятия), то конструировать элементы отборов вручную, как в предыдущем примере, не совсем правильно. В БСП есть готовый общий модуль, который содержит безопасные и оптимизированные функции для работы с динамическими списками.
Давайте перепишем наш серверный обработчик, используя стандартные механизмы:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Не Пользователи.ЭтоПолноправныйПользователь() Тогда
// Используем готовую функцию БСП для надежной установки отбора
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(
Список,
"Ответственный",
Пользователи.ТекущийПользователь(),
ВидСравненияКомпоновкиДанных.Равно,
,
Истина,
РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный
);
КонецЕсли;
КонецПроцедуры
В чем преимущества использования функции ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка?
Бывают ситуации, когда отбор по ответственному нужно применять не вообще везде при открытии справочника, а только при его выборе в конкретном документе. Платформа 1С:Предприятие 8 предоставляет мощный встроенный механизм интерактивной настройки связей и отборов непосредственно в конфигураторе.
Рассмотрим, как настроить этот отбор без программирования:
Отбор.Ответственный.ТекущийПользователь.После сохранения этой настройки платформа при нажатии кнопки выбора (три точки или "Показать все") в поле документа автоматически передаст текущего пользователя в качестве параметра в форму выбора справочника и жестко ограничит список элементов. Никакого кода писать не требуется!
Если логика открытия формы выбора из документа требует дополнительных условий или динамических проверок на стороне клиента, мы можем управлять открытием формы вручную. Для этого используется событие поля ввода документа НачалоВыбора.
Проанализируем пример клиентского кода:
&НаКлиенте
Процедура ИмяВашегоРеквизитаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
// Отменяем стандартное системное открытие формы выбора
СтандартнаяОбработка = Ложь;
// Создаем структуру, где ключ — это путь к полю отбора с префиксом "Отбор."
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("Ответственный", ПараметрыСеанса.ТекущийПользователь);
// Помещаем наш отбор в структуру параметров открываемой формы
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Отбор", ПараметрыОтбора);
// Открываем форму выбора справочника с наложенными параметрами
ОткрытьФорму("Справочник.ИмяВашегоСправочника.ФормаВыбора", ПараметрыФормы, Элемент);
КонецПроцедуры
При таком подходе платформа сама перехватывает переданную структуру Отбор в параметрах открываемой формы и автоматически накладывает условия фильтрации на динамический список формы выбора справочника.
Все описанные выше способы являются интерфейсными. Они отлично подходят для удобства работы пользователей, чтобы не загромождать списки лишней информацией. Однако они не защищают данные на 100%. Опытный пользователь может обойти эти отборы с помощью внешних обработок, консоли запросов или при построении универсальных отчетов.
Если задача стоит именно в плоскости безопасности и конфиденциальности данных, необходимо настраивать механизм RLS (Row-Level Security).
При использовании конфигураций на базе БСП для этого существует удобная подсистема «Управление доступом». Настройка выполняется следующим образом:
#ПоОтветственному("Ответственный").
Ответственный не соответствует текущему пользователю.Важное примечание: Использование RLS гарантирует максимальную безопасность, однако может снижать общую производительность системы при выполнении тяжелых запросов или формировании отчетов, так как к каждому обращению к таблице СУБД неявно добавляются дополнительные соединения и условия фильтрации.
Выбор конкретного метода зависит от архитектуры вашей базы данных и бизнес-требований: