Как настроить RLS для нового документа в 1С:ЗУП 3.1 и исправить ошибку «Недостаточно прав доступа»?

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

При добавлении новых объектов метаданных в типовые конфигурации, работающие на базе Библиотеки стандартных подсистем (БСП), разработчики часто сталкиваются со специфическими проблемами ограничения доступа на уровне записей (RLS). Типичная ситуация: в конфигурацию 1С:Зарплата и Управление Персоналом 3.1 добавляется новый документ, настраиваются ограничения доступа по организации, однако при попытке открыть форму списка под ограниченным пользователем система возвращает ошибку «Недостаточно прав доступа». При этом под полными правами или при создании документа в разрешенной организации всё работает корректно.

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

Выясняем причину: почему ломается чтение стандартных реквизитов?

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

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

Решим эту проблему по шагам:

  1. Откроем конфигуратор и перейдем в наше расширение, где создана настраиваемая роль.
  2. Найдем в роли наш новый документ и развернем ветку его свойств до уровня Стандартные реквизиты.
  3. Проверим наличие флажков «Чтение» и «Просмотр» для полей Ссылка, Дата, Номер, Проведен и ПометкаУдаления.
  4. Если флажки сняты или затенены, необходимо заимствовать стандартные реквизиты документа в расширение и явно установить для них требуемые права доступа.

Интеграция нового документа в производительный RLS БСП

В современных релизах 1С:ЗУП 3.1 стандартный («старый») режим RLS практически не используется. Вместо него работает производительный RLS (ограничение доступа через ключи доступа). Обычного написания шаблона #ПоЗначениям в ограничениях роли в этом режиме абсолютно недостаточно. Более того, система просто проигнорирует эти настройки, если объект не зарегистрирован в служебных механизмах БСП.

Давайте разберем полный цикл регистрации нового документа в системе разделения прав БСП.

Шаг 1. Регистрация в определяемых типах

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

  1. Найдем определяемый тип ВладелецЗначенийКлючейДоступа и добавим в его состав ссылку на наш новый документ.
  2. Найдем определяемый тип ВладелецЗначенийКлючейДоступаДокумент и также включим в него наш документ.

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

Шаг 2. Описание логики RLS в модуле менеджера

Каждый документ, участвующий в RLS БСП, должен самостоятельно сообщать системе, по каким полям его нужно ограничивать. Для этого перейдем в модуль менеджера нашего нового документа и добавим экспортную процедуру ПриЗаполненииОграниченияДоступа. Пример программного кода выглядит следующим образом:


Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт
    Ограничение.Текст = "РазрешитьЧтениеИзменение ГДЕ ЗначениеРазрешено(Организация)";
КонецПроцедуры

В данном примере мы указываем системе БСП, что чтение и изменение документа разрешено только в том случае, если у текущего пользователя есть права на организацию, указанную в соответствующем реквизите шапки документа.

Шаг 3. Регистрация в переопределяемом модуле

Теперь укажем системе, что наш документ в принципе должен контролироваться механизмом RLS. Для этого откроем общий модуль УправлениеДоступомПереопределяемый, найдем процедуру ПриЗаполненииСписковСОграничениемДоступа и зарегистрируем наш объект:


Процедура ПриЗаполненииСписковСОграничениемДоступа(Списки) Экспорт
    // Добавляем наш новый документ в список контролируемых объектов
    Списки.Вставить(Метаданные.Документы.НовыйДокумент, Истина);
КонецПроцедуры

Шаг 4. Обновление вспомогательных данных системы

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

  1. Запустить сеанс предприятия с параметром командной строки /С ЗапуститьОбновлениеИнформационнойБазы.
  2. Использовать специализированную обработку ОбновлениеВспомогательныхДанных.epf (ее можно найти в дистрибутиве БСП). В ней необходимо выполнить обновление идентификаторов объектов метаданных и обновление ключей доступа.
  3. Дополнительно рекомендуется запустить проверку интеграции с помощью обработки ПроверкаВнедренияБСП.erf, чтобы исключить другие возможные ошибки интеграции ролей.

Важный нюанс: обработка пустых значений организации

При создании нового документа или наличии исторических записей с незаполненной организацией RLS может полностью заблокировать к ним доступ. Чтобы избежать ситуации, когда новый («пустой») документ не открывается у пользователя, необходимо разрешить чтение объектов с незаполненной организацией. Для этого слегка модифицируем код в модуле менеджера документа, передав второй параметр в функцию ЗначениеРазрешено:


Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт
    // Параметр Истина разрешает доступ к документам с пустой организацией
    Ограничение.Текст = "РазрешитьЧтениеИзменение ГДЕ ЗначениеРазрешено(Организация, Истина)";
КонецПроцедуры

Таким образом, мы гарантируем, что пустые или еще не записанные документы будут доступны всем пользователям для создания и первичного заполнения, а ограничения вступят в силу сразу после выбора организации.

← На главную