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