Почему возникает ошибка RLS при добавлении прикрепленных файлов и как работает шаблон #ПоЗначениямИНаборамРасширенный?

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

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

Разберем по шагам, как устроен шаблон ограничения #ПоЗначениямИНаборамРасширенный, как в нем работает наследование прав через вид доступа Объект и почему ошибка может пропадать после обычной перезаписи объекта-владельца.

Анализ структуры шаблона #ПоЗначениямИНаборамРасширенный

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


#ПоЗначениямИНаборамРасширенный( "Справочник.Файлы","Изменение","",
"",
"ВЫБОР КОГДА ТипЗначения(Т.ВладелецФайла) = Тип(Справочник.Номенклатура)
    ИЛИ ТипЗначения(Т.ВладелецФайла) = Тип(Справочник.МаркетинговыеМероприятия)
    ИЛИ ТипЗначения(Т.ВладелецФайла) = Тип(Справочник.Проекты) ТОГДА ",
    "ПравоИзменения"," Т.ВладелецФайла ",
"КОГДА ТипЗначения(Т.ВладелецФайла) = Тип(Справочник.ВидыСделокСКлиентами) ТОГДА",
    "ПравоИзменения"," Т.ВладелецФайла",
"КОГДА ТипЗначения(Т.ВладелецФайла) = Тип(Справочник.Партнеры) ТОГДА",
    "ГруппыПартнеров","Т.ВладелецФайла","И","ПравоИзменения","Т.ВладелецФайла",
"КОГДА ТипЗначения(Т.ВладелецФайла) = Тип(Справочник.ФизическиеЛица) ТОГДА",
    "ГруппыФизическихЛиц","Т.ВладелецФайла","И","ПравоИзменения","Т.ВладелецФайла",
"КОГДА ТипЗначения(Т.ВладелецФайла) = Тип(Справочник.ПапкиФайлов) ТОГДА ",
    "ПапкиФайлов","Т.ВладелецФайла",
"КОГДА ТипЗначения(Т.ВладелецФайла) = Тип(Документ.ЭлектронноеПисьмоИсходящее)
    ИЛИ ТипЗначения(Т.ВладелецФайла) = Тип(Документ.ЭлектронноеПисьмоВходящее)
    ИЛИ ТипЗначения(Т.ВладелецФайла) = Тип(Справочник.СоглашенияСПоставщиками)
    ИЛИ ТипЗначения(Т.ВладелецФайла) = Тип(Справочник.СоглашенияСКлиентами)
    ИЛИ ТипЗначения(Т.ВладелецФайла) = Тип(Документ.КоммерческоеПредложениеКлиенту)
    ИЛИ ТипЗначения(Т.ВладелецФайла) = Тип(Документ.РегистрацияЦенНоменклатурыПоставщика)
    ИЛИ ТипЗначения(Т.ВладелецФайла) = Тип(Справочник.СделкиСКлиентами)
    ИЛИ ТипЗначения(Т.ВладелецФайла) = Тип(Документ.ЗаявкаНаРасходованиеДенежныхСредств) ТОГДА",
"Объект","Т.ВладелецФайла",
"ИНАЧЕ ИСТИНА КОНЕЦ",
"","","","","","","","","","","","","","","", "","","","","","", "", "","")

Проанализируем параметры, которые передаются в шаблон:

  1. Имя таблицы и проверяемое право: первыми параметрами передаются "Справочник.Файлы" и "Изменение". Это указывает подсистеме, для какого действия накладывается ограничение.
  2. Модификаторы и присоединяемые таблицы: 3-й и 4-й параметры предназначены для дополнительных модификаций (например, отключения ограничений иерархии) и текста соединений. В данном примере они оставлены пустыми.
  3. Тройки параметров проверки: начиная с 5-го параметра, идут группы параметров ВидДоступа, Поле и ЛогическаяСвязка.
  4. Фиксированное число параметров: шаблон БСП ожидает строго определенное количество аргументов. Если условия проверки занимают меньше позиций, чем предусмотрено макетом шаблона, оставшиеся параметры обязательно заполняются пустыми строками "". При их удалении платформа выдаст синтаксическую ошибку о неверном количестве параметров шаблона.

Как работает условие с видом доступа «Объект»

Посмотрим на блок, отвечающий за документы и соглашения:


КОГДА ... ИЛИ ТипЗначения(Т.ВладелецФайла) = Тип(Справочник.СоглашенияСПоставщиками) ... ТОГДА",
"Объект","Т.ВладелецФайла",
"ИНАЧЕ ИСТИНА КОНЕЦ"

Ключевым здесь является использование специального вида доступа «Объект»:

  1. Указание вида доступа "Объект" означает, что права на текущую запись (прикрепленный файл) напрямую наследуются от прав на объект-владелец, переданный в поле Т.ВладелецФайла.
  2. При проверке права "Изменение" платформа проверяет, разрешено ли текущему пользователю изменение объекта-владельца на основании записей в служебном регистре сведений НаборыЗначенийДоступа.
  3. Если в регистре НаборыЗначенийДоступа для конкретной ссылки владельца нет соответствующих записей, условие RLS возвращает ЛОЖЬ, и запись файла блокируется, даже если у роли есть формальные права на чтение и изменение самого справочника файлов и соглашений.

Причины отсутствия данных в регистре «НаборыЗначенийДоступа»

Выясним причину, почему файл не удается прикрепить к конкретному соглашению или документу до тех пор, пока этот объект не будет перезаписан:

  1. Программная загрузка без вызова обработчиков: если объекты загружались через внешние обработки, обмен данными или скрипты с флагом ОбменДанными.Загрузка = Истина, стандартные подписки на события не отрабатывают, и наборы прав в регистре не формируются.
  2. Фоновое или отложенное обновление прав: в конфигурациях на БСП расчет наборов значений доступа может выполняться асинхронно через регламентные задания. Если очередь заданий перегружена или задание отключено, права на новые объекты рассчитываются с задержкой.
  3. Изменение настроек прав без актуализации данных: при смене правил ограничения доступа, групп доступа пользователей или структуры видов доступа требуется полный пересчет служебных таблиц.

Способы решения проблемы

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

  1. Интерактивная или программная перезапись объекта-владельца: при записи элемента справочника СоглашенияСПоставщиками срабатывают подписки подсистемы управления доступом, которые автоматически формируют и записывают строки в регистр сведений НаборыЗначенийДоступа. После этого файл успешно прикрепляется.
  2. Программное обновление наборов доступа: при пакетном создании или загрузке данных необходимо явно вызывать метод пересчета прав БСП: УправлениеДоступом.ОбновитьНаборыЗначенийДоступа(СсылкаНаОбъект);
  3. Запуск регламентных заданий: необходимо убедиться, что регламентные задания по обновлению и заполнению данных ограничения доступа включены и выполняются по расписанию без ошибок.
← На главную