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