Почему не работает ограничение доступа по организациям в 1С:Бухгалтерии и как правильно настроить RLS в новой роли?

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

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

Причина проблемы: принцип работы подсистемы управления доступом

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

  1. Отсутствие условий RLS в роли: Если мы создаем в конфигураторе новую роль и просто отмечаем право Чтение или Просмотр для документа, платформа предоставляет абсолютный доступ ко всей таблице базы данных. Ограничения в режиме «1С:Предприятие» задают только разрешенные значения (группы доступа, организации, подразделения), но сам запрос на фильтрацию данных генерируется на основе текста RLS, прописанного в свойствах роли в конфигураторе.
  2. Правило сложения прав «ИЛИ»: В платформе 1С права доступа нескольких ролей объединяются по логическому правилу «ИЛИ». Если пользователю назначена хотя бы одна роль, дающая право чтения документа без условий RLS (например, полная типовая роль чтения или самописная роль), платформа отобразит все записи без каких-либо фильтров, игнорируя настройки групп доступа.
  3. Отображение «Объект не найден»: Если в роли на сам документ ограничение не наложено, но закрыт доступ к справочнику Организации, в динамическом списке документов пользователь увидит строки по чужим организациям, где в колонке организации будет выведено значение «Объект не найден».

Пошаговое руководство по настройке RLS в пользовательской роли

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

  1. Открываем типовую роль-донор: В конфигураторе находим типовую роль, содержащую нужные ограничения (например, ЧтениеДанныхБухгалтерии, ДобавлениеИзменениеДанныхБухгалтерии или БазовыеПраваБухгалтерии).
  2. Копируем шаблоны ограничений: Переходим в роль-донор на вкладку Шаблоны ограничений. Выделяем и копируем используемые шаблоны (в типовых конфигурациях это обычно шаблоны ПоОрганизации, ДляОбъекта, ПоЗначениям). Открываем нашу созданную роль, переходим на вкладку Шаблоны ограничений и вставляем скопированные строки.
  3. Задаем условие ограничения на объект: В нашей роли находим нужный документ (например, Документ.ПоступлениеТоваровУслуг). Выбираем право Чтение (а также Изменение, Добавление, Удаление, если они требуются). В нижней части окна в поле «Ограничение доступа на уровне записей» задаем вызов шаблона, аналогично тому, как это сделано в типовой роли.

Рассмотрим типовой пример вызова шаблона ограничения для документа с реквизитом Организация:

#ПоОрганизации("Организация")

Или универсальный вызов через типовой шаблон БСП по значениям:


#ПоЗначениям( "Документ.ПоступлениеТоваровУслуг", "", "",
"Организации", "Организация",
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" )

Настройка профилей и групп доступа в режиме «1С:Предприятие»

После сохранения изменений в конфигураторе переходим в пользовательский режим для корректной привязки прав:

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

Важные нюансы и сопутствующие объекты

Проанализируем детали, которые необходимо учитывать при внедрении RLS:

  1. Доступ к регистрам: Если пользователь должен формировать отчеты (ОСВ, карточки счетов) или проводить документы, недостаточно ограничить только сам документ. Необходимо настроить условия RLS и для связанных регистров (РегистрБухгалтерии.Хозрасчетный, регистры накопления), иначе движения чужих организаций будут попадать в отчетность, либо при проведении возникнет ошибка «Нарушение прав доступа».
  2. Связанные справочники: Убедитесь, что у пользователя есть доступ на чтение сопутствующей нормативно-справочной информации: ДоговорыКонтрагентов, БанковскиеСчета, Склады, Номенклатура. Если какой-либо объект жестко привязан к организации, на него также должно распространяться условие ограничения.
  3. Использование расширений конфигурации: Начиная с версии платформы 8.3.14 (при отключенном режиме совместимости или совместимости 8.3.14 и выше), роли с шаблонами и текстами RLS можно создавать непосредственно в расширениях. Однако переопределить текст RLS в уже существующей роли основной конфигурации через расширение нельзя — требуется создавать собственную роль в расширении и назначать ее пользователям.

Альтернативный вариант: программный отбор без RLS

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

Посмотрим на пример установки фиксированного отбора в событии ПриСозданииНаСервере формы списка:


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

КонецПроцедуры

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

← На главную