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